' . esc_html__( 'Add New', 'gravityforms' ) . ''; } ?>

process_action(); $table->views(); $table->prepare_items(); ?>
display(); ?>
__( 'There was an issue creating your form.', 'gravityforms' ) ) ) ); } GFFormsModel::ensure_tables_exist(); require_once( GFCommon::get_base_path() . '/form_detail.php' ); $form_json = rgpost( 'form', false ); $form = json_decode( stripslashes( $form_json ), true ); if ( empty( $form['title'] ) ) { $result = array( 'error' => __( 'Please enter a form title.', 'gravityforms' ) ); die( json_encode( $result ) ); } $result = GFFormDetail::save_form_info( 0, $form_json ); switch ( rgar( $result, 'status' ) ) { case 'invalid_json': $result['error'] = __( 'There was an issue creating your form.', 'gravityforms' ); die( json_encode( $result ) ); case 'duplicate_title': $result['error'] = __( 'Please enter a unique form title.', 'gravityforms' ); die( json_encode( $result ) ); default: $form_id = absint( $result['status'] ); die( json_encode( array( 'redirect' => admin_url( "admin.php?page=gf_edit_forms&id={$form_id}&isnew=1" ) ) ) ); } } public static function output_form_list_script_block() { ?> get_columns(); $hidden = array(); $sortable = $this->get_sortable_columns(); $this->_column_headers = array( $columns, $hidden, $sortable, 'title' ); $this->locking_info = new GFFormLocking(); $this->filter = rgget( 'filter' ); } function get_sortable_columns() { return array( 'title' => array( 'title', false ), 'id' => array( 'id', false ), 'entry_count' => array( 'entry_count', false ), 'view_count' => array( 'view_count', false ), 'conversion' => array( 'conversion', false ), ); } function get_views() { $form_count = RGFormsModel::get_form_count(); /** * Allow for form count filtering. * Useful when form list is being filtered. * * @since 2.3-beta-3 * * @param array $form_count The form count by filter name. */ $form_count = apply_filters( 'gform_form_list_count', $form_count ); $all_class = ( $this->filter == '' ) ? 'current' : ''; $active_class = ( $this->filter == 'active' ) ? 'current' : ''; $inactive_class = ( $this->filter == 'inactive' ) ? 'current' : ''; $trash_class = ( $this->filter == 'trash' ) ? 'current' : '' ; $views = array( 'all' => '' . esc_html( _x( 'All', 'Form List', 'gravityforms' ) ) . ' (' . $form_count['total'] . ')', 'active' => '' . esc_html( _x( 'Active', 'Form List', 'gravityforms' ) ) . ' (' . $form_count['active'] . ')', 'inactive' => '' . esc_html( _x( 'Inactive', 'Form List', 'gravityforms' ) ) . ' (' . $form_count['inactive'] . ')', 'trash' => '' . esc_html( _x( 'Trash', 'Form List', 'gravityforms' ) ) . ' (' . $form_count['trash'] . ')', ); return $views; } function prepare_items() { $sort_column = empty( $_GET['orderby'] ) ? 'title' : $_GET['orderby']; $sort_columns = array_keys( $this->get_sortable_columns() ); if ( ! in_array( strtolower( $sort_column ), $sort_columns ) ) { $sort_column = 'title'; } $sort_direction = empty( $_GET['order'] ) ? 'ASC' : strtoupper( $_GET['order'] ); $sort_direction = $sort_direction == 'ASC' ? 'ASC' : 'DESC'; $search_query = rgget( 's' ); $trash = false; switch ( $this->filter ) { case '': $active = null; break; case 'active' : $active = true; break; case 'inactive' : $active = false; break; case 'trash' : $active = null; $trash = true; } if ( rgblank( $search_query ) ) { $forms = GFFormsModel::get_forms( $active, $sort_column, $sort_direction, $trash ); } else { $forms = GFFormsModel::search_forms( $search_query, $active, $sort_column, $sort_direction, $trash ); } /** * Allow form list filtering. * * @since 2.3-beta-3 * * @param array $forms The complete list of forms. * @param string $search_query The search query string if set. * @param bool $active If inactive forms should be displayed. * @param string $sort_column List column being sorted. * @param string $sort_direction Direction of column sorting. * @param bool $trash If trash items should be displayed. */ $forms = apply_filters( 'gform_form_list_forms', $forms, $search_query, $active, $sort_column, $sort_direction, $trash ); $per_page = $this->get_items_per_page( 'gform_forms_per_page', 20 ); $per_page = apply_filters( 'gform_page_size_form_list', $per_page ); $this->set_pagination_args( array( 'total_items' => count( $forms ), 'per_page' => $per_page, ) ); if ( in_array( $sort_column, array( 'view_count', 'entry_count', 'conversion' ) ) ) { usort( $forms, array( $this, 'compare_' . $sort_column . '_' . $sort_direction ) ); } $offset = ( $this->get_pagenum() - 1 ) * $per_page; $this->items = array_slice( $forms, $offset, $per_page ); } function get_bulk_actions() { if ( $this->filter == 'trash' ) { $actions = array( 'restore' => esc_html__( 'Restore', 'gravityforms' ), 'delete' => esc_html__( 'Delete permanently', 'gravityforms' ), ); } else { $actions = array( 'activate' => esc_html__( 'Mark as Active', 'gravityforms' ), 'deactivate' => esc_html__( 'Mark as Inactive', 'gravityforms' ), 'reset_views' => esc_html__( 'Reset Views', 'gravityforms' ), 'delete_entries' => esc_html__( 'Permanently Delete Entries', 'gravityforms' ), 'trash' => esc_html__( 'Move to trash', 'gravityforms' ), ); } return $actions; } function get_columns() { $columns = array( 'cb' => '', 'is_active' => '', 'title' => esc_html__( 'Title', 'gravityforms' ), 'id' => esc_html__( 'ID', 'gravityforms' ), 'entry_count' => esc_html__( 'Entries', 'gravityforms' ), 'view_count' => esc_html__( 'Views', 'gravityforms' ), 'conversion' => esc_html__( 'Conversion', 'gravityforms' ), ); $columns = apply_filters( 'gform_form_list_columns', $columns ); return $columns; } function single_row_columns( $item ) { list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info(); foreach ( $columns as $column_name => $column_display_name ) { $classes = "$column_name column-$column_name"; if ( $primary === $column_name ) { $classes .= ' has-row-actions column-primary'; } if ( in_array( $column_name, $hidden ) ) { $classes .= ' hidden'; } // Comments column uses HTML in the display name with screen reader text. // Instead of using esc_attr(), we strip tags to get closer to a user-friendly string. $data = 'data-colname="' . wp_strip_all_tags( $column_display_name ) . '"'; $attributes = "class='$classes' $data"; if ( 'cb' === $column_name ) { echo ''; echo $this->column_cb( $item ); echo ''; } elseif ( has_action( 'gform_form_list_column_' . $column_name ) ) { echo ""; do_action( 'gform_form_list_column_' . $column_name, $item ); echo $this->handle_row_actions( $item, $column_name, $primary ); echo ''; } elseif ( method_exists( $this, '_column_' . $column_name ) ) { echo call_user_func( array( $this, '_column_' . $column_name ), $item, $classes, $data, $primary ); } elseif ( method_exists( $this, 'column_' . $column_name ) ) { echo ""; echo call_user_func( array( $this, 'column_' . $column_name ), $item ); echo $this->handle_row_actions( $item, $column_name, $primary ); echo ""; } else { echo ""; echo $this->column_default( $item, $column_name ); echo $this->handle_row_actions( $item, $column_name, $primary ); echo ""; } } } function get_primary_column_name() { return 'title'; } function _column_is_active( $form, $classes, $data, $primary ) { echo ''; if ( $this->filter !== 'trash' ) { ?> <?php echo $form->is_active ? esc_attr__( 'Active', 'gravityforms' ) : esc_attr__( 'Inactive', 'gravityforms' ); ?> '; } function column_title( $form ) { echo '' . esc_html( $form->title ) . ''; } function column_id( $form ) { echo '' .absint( $form->id ) . ''; } function column_view_count( $form ) { echo absint( $form->view_count ); } function column_entry_count( $form ) { echo '' . absint( $form->entry_count ) . ''; } function column_conversion( $form ) { $conversion = '0%'; if ( $form->view_count > 0 ) { $conversion = ( (float) number_format( $form->entry_count / $form->view_count, 3 ) * 100 ) . '%'; } echo $conversion; } function column_cb( $form ) { $form_id = $form->id; ?> locking_info->lock_indicator(); } protected function handle_row_actions( $form, $column_name, $primary ) { if ( $primary !== $column_name ) { return ''; } ?>
filter == 'trash' ) { $form_actions['restore'] = array( 'label' => __( 'Restore', 'gravityforms' ), 'url' => '#', 'onclick' => 'RestoreForm(' . absint( $form->id ) . ');', 'onkeypress' => 'RestoreForm(' . absint( $form->id ) . ');', 'capabilities' => 'gravityforms_delete_forms', 'priority' => 600, ); $form_actions['delete'] = array( 'label' => __( 'Delete permanently', 'gravityforms' ), 'menu_class' => 'delete', 'url' => '#', 'onclick' => 'ConfirmDeleteForm(' . absint( $form->id ) . ');', 'onkeypress' => 'ConfirmDeleteForm(' . absint( $form->id ) . ');', 'capabilities' => 'gravityforms_delete_forms', 'priority' => 500, ); } else { $this->locking_info->lock_info( $form->id ); require_once( GFCommon::get_base_path() . '/form_settings.php' ); $form_actions = GFForms::get_toolbar_menu_items( $form->id, true ); $form_actions['duplicate'] = array( 'label' => __( 'Duplicate', 'gravityforms' ), 'url' => '#', 'onclick' => 'DuplicateForm(' . absint( $form->id ) . ');return false;', 'onkeypress' => 'DuplicateForm(' . absint( $form->id ) . ');return false;', 'capabilities' => 'gravityforms_create_form', 'priority' => 600, ); $form_actions['trash'] = array( 'label' => __( 'Trash', 'gravityforms' ), 'aria-label' => __( 'Move this form to the trash', 'gravityforms' ), 'url' => '#', 'onclick' => 'TrashForm(' . absint( $form->id ) . ');return false;', 'onkeypress' => 'TrashForm(' . absint( $form->id ) . ');return false;', 'capabilities' => 'gravityforms_delete_forms', 'menu_class' => 'trash', 'priority' => 500, ); } $form_actions = apply_filters( 'gform_form_actions', $form_actions, $form->id ); echo GFForms::format_toolbar_menu_items( $form_actions, true ); ?>
' . __( 'Show more details' ) . '' : ''; } function no_items() { if ( rgget( 's' ) ) { printf( esc_html__( "No forms were found for your search query. %sView all forms%s.", 'gravityforms' ), '', '' ); } else if ( $this->filter == 'trash' ) { esc_html_e( 'There are no forms in the trash.', 'gravityforms' ); } else { printf( esc_html__( "You don't have any forms. Let's go %screate one%s!", 'gravityforms' ), '', '' ); } } function process_action() { $single_action = rgpost( 'single_action' ); $remote_action = rgget( 'action' ); //action initiated at other pages (i.e. trash command from form menu) $bulk_action = $this->current_action(); if ( ! ( $single_action || $bulk_action || $remote_action ) ) { return; } if ( $single_action ) { check_admin_referer( 'gforms_update_forms', 'gforms_update_forms' ); $form_id = rgpost( 'single_action_argument' ); switch ( $single_action ) { case 'trash' : if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) { $trashed = RGFormsModel::trash_form( $form_id ); $message = is_wp_error( $trashed ) ? $trashed->get_error_message() : __( 'Form moved to the trash.', 'gravityforms' ); $message_class = is_wp_error( $trashed ) ? 'error' : 'updated'; } else { $message = __( "You don't have adequate permission to trash forms.", 'gravityforms' ); $message_class = 'error'; } break; case 'restore' : if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) { $restored = RGFormsModel::restore_form( $form_id ); $message = is_wp_error( $restored ) ? $restored->get_error_message() : __( 'Form restored.', 'gravityforms' ); $message_class = is_wp_error( $restored ) ? 'error' : 'updated'; } else { $message = __( "You don't have adequate permission to restore forms.", 'gravityforms' ); $message_class = 'error'; } break; case 'delete' : if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) { $deleted = RGFormsModel::delete_form( $form_id ); $message = is_wp_error( $deleted ) ? $deleted->get_error_message() : __( 'Form deleted.', 'gravityforms' ); $message_class = is_wp_error( $deleted ) ? 'error' : 'updated'; } else { $message = __( "You don't have adequate permission to delete forms.", 'gravityforms' ); $message_class = 'error'; } break; case 'duplicate' : if ( GFCommon::current_user_can_any( 'gravityforms_create_form' ) ) { $duplicated = RGFormsModel::duplicate_form( $form_id ); $message = is_wp_error( $duplicated ) ? $duplicated->get_error_message() : __( 'Form duplicated.', 'gravityforms' ); $message_class = is_wp_error( $duplicated ) ? 'error' : 'updated'; } else { $message = __( "You don't have adequate permission to duplicate forms.", 'gravityforms' ); $message_class = 'error'; } break; } } elseif ( $remote_action ){ $form_id = rgget( 'arg' ); switch ( $remote_action ) { case 'trash' : check_admin_referer( "gf_delete_form_{$form_id}" ); if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) { $trashed = RGFormsModel::trash_form( $form_id ); $message = is_wp_error( $trashed ) ? $trashed->get_error_message() : __( 'Form moved to the trash.', 'gravityforms' ); $message_class = is_wp_error( $trashed ) ? 'error' : 'updated'; } else { $message = __( "You don't have adequate permission to trash forms.", 'gravityforms' ); $message_class = 'error'; } break; case 'duplicate' : check_ajax_referer( "gf_duplicate_form_{$form_id}" ); if ( GFCommon::current_user_can_any( 'gravityforms_create_form' ) ) { $duplicated = RGFormsModel::duplicate_form( $form_id ); $message = is_wp_error( $duplicated ) ? $duplicated->get_error_message() : __( 'Form duplicated.', 'gravityforms' ); $message_class = is_wp_error( $duplicated ) ? 'error' : 'updated'; } else { $message = __( "You don't have adequate permission to duplicate forms.", 'gravityforms' ); $message_class = 'error'; } break; } } elseif ( $bulk_action ) { check_admin_referer( 'gforms_update_forms', 'gforms_update_forms' ); $form_ids = is_array( rgpost( 'form' ) ) ? rgpost( 'form' ) : array(); $form_count = count( $form_ids ); $message = ''; switch ( $bulk_action ) { case 'trash': if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) { GFFormsModel::trash_forms( $form_ids ); $message = _n( '%s form moved to the trash.', '%s forms moved to the trash.', $form_count, 'gravityforms' ); } else { $message = __( "You don't have adequate permissions to trash forms.", 'gravityforms' ); } break; case 'restore': if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) { GFFormsModel::restore_forms( $form_ids ); $message = _n( '%s form restored.', '%s forms restored.', $form_count, 'gravityforms' ); } else { $message = __( "You don't have adequate permissions to restore forms.", 'gravityforms' ); } break; case 'delete': if ( GFCommon::current_user_can_any( 'gravityforms_delete_forms' ) ) { GFFormsModel::delete_forms( $form_ids ); $message = _n( '%s form deleted.', '%s forms deleted.', $form_count, 'gravityforms' ); } else { $message = __( "You don't have adequate permissions to delete forms.", 'gravityforms' ); } break; case 'reset_views': foreach ( $form_ids as $form_id ) { GFFormsModel::delete_views( $form_id ); } GFCache::delete( 'get_view_count_per_form' ); $message = _n( 'Views for %s form have been reset.', 'Views for %s forms have been reset.', $form_count, 'gravityforms' ); break; case 'delete_entries': if ( GFCommon::current_user_can_any( 'gravityforms_delete_entries' ) ) { foreach ( $form_ids as $form_id ) { GFFormsModel::delete_leads_by_form( $form_id ); } $message = _n( 'Entries for %s form have been deleted.', 'Entries for %s forms have been deleted.', $form_count, 'gravityforms' ); } else { $message = __( "You don't have adequate permission to delete entries.", 'gravityforms' ); } break; case 'activate': foreach ( $form_ids as $form_id ) { GFFormsModel::update_form_active( $form_id, 1 ); } $message = _n( '%s form has been marked as active.', '%s forms have been marked as active.', $form_count, 'gravityforms' ); break; case 'deactivate': foreach ( $form_ids as $form_id ) { GFFormsModel::update_form_active( $form_id, 0 ); } $message = _n( '%s form has been marked as inactive.', '%s forms have been marked as inactive.', $form_count, 'gravityforms' ); break; } if ( ! empty( $message ) ) { $message = sprintf( $message, $form_count ); } } if ( ! empty( $message ) ) { echo '

' . $message . '

'; }; } function extra_tablenav( $which ) { if ( $which !== 'top' ) { return; } wp_nonce_field( 'gforms_update_forms', 'gforms_update_forms' ); ?> locking_info->list_row_class( $form->id, false ) . '">'; $this->single_row_columns( $form ); echo ''; } public static function compare_view_count_asc( $a, $b ) { return $a->view_count > $b->view_count; } public static function compare_view_count_desc( $a, $b ) { return $a->view_count < $b->view_count; } public static function compare_entry_count_asc( $a, $b ) { return $a->entry_count > $b->entry_count; } public static function compare_entry_count_desc( $a, $b ) { return $a->entry_count < $b->entry_count; } public static function compare_conversion_asc( $a, $b ) { $a_conversion = $a->view_count > 0 ? $a->entry_count / $a->view_count : 0; $b_conversion = $b->view_count > 0 ? $b->entry_count / $b->view_count : 0; return $a_conversion > $b_conversion; } public static function compare_conversion_desc( $a, $b ) { $a_conversion = $a->view_count > 0 ? $a->entry_count / $a->view_count : 0; $b_conversion = $b->view_count > 0 ? $b->entry_count / $b->view_count : 0; return $a_conversion < $b_conversion; } }