| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- <?php
- /**
- * Primary overview page inside the admin which lists all forms.
- *
- * @since 1.0.0
- */
- class WPForms_Overview {
- /**
- * Primary class constructor.
- *
- * @since 1.0.0
- */
- public function __construct() {
- // Maybe load overview page.
- add_action( 'admin_init', array( $this, 'init' ) );
- // Setup screen options. Needs to be here as admin_init hook it too late.
- add_action( 'load-toplevel_page_wpforms-overview', array( $this, 'screen_options' ) );
- add_filter( 'set-screen-option', array( $this, 'screen_options_set' ), 10, 3 );
- add_filter( 'set_screen_option_wpforms_forms_per_page', [ $this, 'screen_options_set' ], 10, 3 );
- }
- /**
- * Determine if the user is viewing the overview page, if so, party on.
- *
- * @since 1.0.0
- */
- public function init() {
- // Only load if we are actually on the overview page.
- if ( ! wpforms_is_admin_page( 'overview' ) ) {
- return;
- }
- // Bulk actions.
- add_action( 'load-toplevel_page_wpforms-overview', array( $this, 'notices' ) );
- add_action( 'load-toplevel_page_wpforms-overview', array( $this, 'process_bulk_actions' ) );
- add_filter( 'removable_query_args', array( $this, 'removable_query_args' ) );
- // The overview page leverages WP_List_Table so we must load it.
- if ( ! class_exists( 'WP_List_Table', false ) ) {
- require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
- }
- // Load the class that builds the overview table.
- require_once WPFORMS_PLUGIN_DIR . 'includes/admin/overview/class-overview-table.php';
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueues' ) );
- add_action( 'wpforms_admin_page', array( $this, 'output' ) );
- // Provide hook for addons.
- do_action( 'wpforms_overview_init' );
- }
- /**
- * Add per-page screen option to the Forms table.
- *
- * @since 1.0.0
- */
- public function screen_options() {
- $screen = get_current_screen();
- if ( null === $screen || 'toplevel_page_wpforms-overview' !== $screen->id ) {
- return;
- }
- add_screen_option(
- 'per_page',
- array(
- 'label' => esc_html__( 'Number of forms per page:', 'wpforms-lite' ),
- 'option' => 'wpforms_forms_per_page',
- 'default' => apply_filters( 'wpforms_overview_per_page', 20 ),
- )
- );
- }
- /**
- * Form table per-page screen option value.
- *
- * @since 1.0.0
- *
- * @param bool $keep Whether to save or skip saving the screen option value. Default false.
- * @param string $option The option name.
- * @param int $value The number of rows to use.
- *
- * @return mixed
- */
- public function screen_options_set( $keep, $option, $value ) {
- if ( 'wpforms_forms_per_page' === $option ) {
- return $value;
- }
- return $keep;
- }
- /**
- * Enqueue assets for the overview page.
- *
- * @since 1.0.0
- */
- public function enqueues() {
- // Hook for addons.
- do_action( 'wpforms_overview_enqueue' );
- }
- /**
- * Build the output for the overview page.
- *
- * @since 1.0.0
- */
- public function output() {
- ?>
- <div id="wpforms-overview" class="wrap wpforms-admin-wrap">
- <h1 class="page-title">
- <?php esc_html_e( 'Forms Overview', 'wpforms-lite' ); ?>
- <?php if ( wpforms_current_user_can( 'create_forms' ) ) : ?>
- <a href="<?php echo esc_url( admin_url( 'admin.php?page=wpforms-builder&view=setup' ) ); ?>" class="add-new-h2 wpforms-btn-orange">
- <?php esc_html_e( 'Add New', 'wpforms-lite' ); ?>
- </a>
- <?php endif; ?>
- </h1>
- <?php
- $overview_table = new WPForms_Overview_Table();
- $overview_table->prepare_items();
- ?>
- <div class="wpforms-admin-content">
- <?php
- do_action( 'wpforms_admin_overview_before_table' );
- if ( empty( $overview_table->items ) ) {
- // Output no forms screen.
- echo wpforms_render( 'admin/empty-states/no-forms' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
- } else {
- ?>
- <form id="wpforms-overview-table" method="get" action="<?php echo esc_url( admin_url( 'admin.php?page=wpforms-overview' ) ); ?>">
- <input type="hidden" name="post_type" value="wpforms" />
- <input type="hidden" name="page" value="wpforms-overview" />
- <?php $overview_table->views(); ?>
- <?php $overview_table->display(); ?>
- </form>
- <?php } ?>
- </div>
- </div>
- <?php
- }
- /**
- * Add admin action notices and process bulk actions.
- *
- * @since 1.5.7
- */
- public function notices() {
- $deleted = ! empty( $_REQUEST['deleted'] ) ? sanitize_key( $_REQUEST['deleted'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification
- $duplicated = ! empty( $_REQUEST['duplicated'] ) ? sanitize_key( $_REQUEST['duplicated'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification
- $notice = array();
- if ( $deleted && 'error' !== $deleted ) {
- $notice = array(
- 'type' => 'info',
- /* translators: %s - Deleted forms count. */
- 'msg' => sprintf( _n( '%s form was successfully deleted.', '%s forms were successfully deleted.', $deleted, 'wpforms-lite' ), $deleted ),
- );
- }
- if ( $duplicated && 'error' !== $duplicated ) {
- $notice = array(
- 'type' => 'info',
- /* translators: %s - Duplicated forms count. */
- 'msg' => sprintf( _n( '%s form was successfully duplicated.', '%s forms were successfully duplicated.', $duplicated, 'wpforms-lite' ), $duplicated ),
- );
- }
- if ( 'error' === $deleted || 'error' === $duplicated ) {
- $notice = array(
- 'type' => 'error',
- 'msg' => esc_html__( 'Security check failed. Please try again.', 'wpforms-lite' ),
- );
- }
- if ( ! empty( $notice ) ) {
- \WPForms\Admin\Notice::add( $notice['msg'], $notice['type'] );
- }
- }
- /**
- * Process the bulk table actions.
- *
- * @since 1.5.7
- */
- public function process_bulk_actions() {
- $ids = isset( $_GET['form_id'] ) ? array_map( 'absint', (array) $_GET['form_id'] ) : array(); // phpcs:ignore WordPress.Security.NonceVerification
- $action = ! empty( $_REQUEST['action'] ) ? sanitize_key( $_REQUEST['action'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification
- if ( $action === '-1' ) {
- $action = ! empty( $_REQUEST['action2'] ) ? sanitize_key( $_REQUEST['action2'] ) : false; // phpcs:ignore WordPress.Security.NonceVerification
- }
- // Checking the sortable column link.
- $is_orderby_link = ! empty( $_REQUEST['orderby'] ) && ! empty( $_REQUEST['order'] );
- if ( empty( $ids ) || empty( $action ) || $is_orderby_link ) {
- return;
- }
- // Check exact action values.
- if ( ! in_array( $action, [ 'delete', 'duplicate' ], true ) ) {
- return;
- }
- if ( empty( $_GET['_wpnonce'] ) ) {
- return;
- }
- // Check the nonce.
- if (
- ! wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), 'bulk-forms' ) &&
- ! wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), 'wpforms_' . $action . '_form_nonce' )
- ) {
- return;
- }
- // Check that we have a method for this action.
- if ( ! method_exists( $this, 'bulk_action_' . $action . '_forms' ) ) {
- return;
- }
- $processed_forms = count( $this->{'bulk_action_' . $action . '_forms'}( $ids ) );
- // Unset get vars and perform redirect to avoid action reuse.
- wp_safe_redirect(
- add_query_arg(
- $action . 'd',
- $processed_forms,
- remove_query_arg( array( 'action', 'action2', '_wpnonce', 'form_id', 'paged', '_wp_http_referer' ) )
- )
- );
- exit;
- }
- /**
- * Delete forms.
- *
- * @since 1.5.7
- *
- * @param array $ids Form ids to delete.
- *
- * @return array List of deleted forms.
- */
- private function bulk_action_delete_forms( $ids ) {
- if ( ! is_array( $ids ) ) {
- return [];
- }
- $deleted = [];
- foreach ( $ids as $id ) {
- $deleted[ $id ] = wpforms()->form->delete( $id );
- }
- return array_keys( array_filter( $deleted ) );
- }
- /**
- * Duplicate forms.
- *
- * @since 1.5.7
- *
- * @param array $ids Form ids to duplicate.
- *
- * @return array List of duplicated forms.
- */
- private function bulk_action_duplicate_forms( $ids ) {
- if ( ! is_array( $ids ) ) {
- return [];
- }
- if ( ! wpforms_current_user_can( 'create_forms' ) ) {
- return [];
- }
- $duplicated = [];
- foreach ( $ids as $id ) {
- if ( wpforms_current_user_can( 'view_form_single', $id ) ) {
- $duplicated[ $id ] = wpforms()->form->duplicate( $id );
- }
- }
- return array_keys( array_filter( $duplicated ) );
- }
- /**
- * Remove certain arguments from a query string that WordPress should always hide for users.
- *
- * @since 1.5.7
- *
- * @param array $removable_query_args An array of parameters to remove from the URL.
- *
- * @return array Extended/filtered array of parameters to remove from the URL.
- */
- public function removable_query_args( $removable_query_args ) {
- if ( wpforms_is_admin_page( 'overview' ) ) {
- $removable_query_args[] = 'duplicated';
- }
- return $removable_query_args;
- }
- }
- new WPForms_Overview();
|