get_sections(); /* * Sets current section for future reference. */ $this->current_section = $sections[$this->get_current_section()]; /* * Process save, if necessary */ $this->process_save(); } // end page_loaded; /** * Handles saves, after verifying nonces and such. Should not be rewritten by child classes. * * @since 2.0.0 * @return void */ final public function process_save() { $saving_tag = sprintf('saving_%s', $this->get_current_section()); if (isset($_REQUEST[$saving_tag])) { check_admin_referer($saving_tag, '_wpultimo_nonce'); $handler = isset($this->current_section['handler']) ? $this->current_section['handler'] : array($this, 'default_handler'); /* * Calls the saving function */ call_user_func($handler); } // end if; } // end process_save; /** * Returns the labels to be used on the admin page. * * @since 2.0.0 * @return array */ public function get_labels() { return array( 'edit_label' => __('Edit Object', 'wp-ultimo'), 'add_new_label' => __('Add New Object', 'wp-ultimo'), 'updated_message' => __('Object updated with success!', 'wp-ultimo'), 'title_placeholder' => __('Enter Object Name', 'wp-ultimo'), 'title_description' => '', 'save_button_label' => __('Save', 'wp-ultimo'), 'save_description' => '', ); } // end get_labels; /** * Registers widgets to the edit page. * * This implementation register the default save widget. * Child classes that wish to inherit that widget while registering other, * can do such by adding a parent::register_widgets() to their own register_widgets() method. * * @since 2.0.0 * @return void */ public function register_widgets() { $screen = get_current_screen(); if (wu_get_isset($this->current_section, 'separator')) { return; } // end if; add_meta_box('wp-ultimo-wizard-body', wu_get_isset($this->current_section, 'title', __('Section', 'wp-ultimo')), array($this, 'output_default_widget_body'), $screen->id, 'normal', null); } // end register_widgets; /** * Outputs the markup for the default Save widget. * * @since 2.0.0 * @return void */ public function output_default_widget_body() { echo '
'; $view = isset($this->current_section['view']) ? $this->current_section['view'] : array($this, 'default_view'); /* * Calls the view function. */ call_user_func($view); echo '
'; } // end output_default_widget_body; /** * Returns the logo to be used on the wizard. * * @since 2.0.0 * @return string */ public function get_logo() { return ''; } // end get_logo; /** * Displays the contents of the edit page. * * @since 2.0.0 * @return void */ public function output() { /* * Renders the base edit page layout, with the columns and everything else =) */ wu_get_template('base/wizard', array( 'screen' => get_current_screen(), 'page' => $this, 'logo' => $this->get_logo(), 'labels' => $this->get_labels(), 'sections' => $this->get_sections(), 'current_section' => $this->get_current_section(), 'classes' => 'wu-w-full wu-mx-auto sm:wu-w-11/12 xl:wu-w-8/12 wu-mt-8 sm:wu-max-w-screen-lg', 'clickable_navigation' => $this->clickable_navigation, 'form_id' => $this->form_id, )); } // end output; /** * Returns the first section of the signup process * * @return string */ public function get_first_section() { $keys = array_keys($this->get_sections()); if (isset($keys[1])) { return $keys[1]; } else { return false; } // end if; } // end get_first_section; /** * Get the current section * * @return string */ public function get_current_section() { $sections = $this->get_sections(); $sections = array_filter($sections, fn($item) => wu_get_isset($item, 'addon') === false); $current_section = isset($_GET[$this->section_slug]) ? sanitize_key($_GET[$this->section_slug]) : current(array_keys($sections)); return $current_section; } // end get_current_section; /** * Returns the page link for the current section. * * @since 2.0.0 * * @param string $section Slug of the section. e.g. general. * @return string */ public function get_section_link($section) { return add_query_arg($this->section_slug, $section); } // end get_section_link; /** * Returns the link to the next section on the wizard. * * @since 2.0.0 * @return string */ public function get_next_section_link() { $sections = $this->get_sections(); $current_section = $this->get_current_section(); $keys = array_keys($sections); return add_query_arg($this->section_slug, $keys[array_search($current_section, array_keys($sections), true) + 1]); } // end get_next_section_link; /** * Returns the link to the previous section on the wizard. * * @since 2.0.0 * @return string */ public function get_prev_section_link() { $sections = $this->get_sections(); $current_section = $this->get_current_section(); $keys = array_keys($sections); return add_query_arg($this->section_slug, $keys[array_search($current_section, array_keys($sections), true) - 1]); } // end get_prev_section_link; /** * Default handler for step submission. Simply redirects to the next step. * * @since 2.0.0 * @return void */ public function default_handler() { wp_redirect($this->get_next_section_link()); exit; } // end default_handler; /** * Default method for views. * * @since 2.0.0 * @return void */ public function default_view() { $section = wp_parse_args($this->current_section, array( 'title' => '', 'description' => '', 'content' => '', 'fields' => array(), 'next_label' => __('Continue →', 'wp-ultimo'), 'back_label' => __('← Go Back', 'wp-ultimo'), 'skip_label' => __('Skip this Step', 'wp-ultimo'), 'back' => false, 'skip' => false, 'next' => true, )); /* * Check if the section has fields */ if (!empty($section['fields'])) { if (is_callable($section['fields'])) { $section['fields'] = call_user_func($section['fields']); } // end if; $form = new \WP_Ultimo\UI\Form($this->get_current_section(), $section['fields'], array( 'views' => 'admin-pages/fields', 'classes' => 'wu-widget-list wu-striped wu-m-0 wu-mt-2 wu--mb-6 wu--mx-6', 'field_wrapper_classes' => 'wu-w-full wu-box-border wu-items-center wu-flex wu-justify-between wu-px-6 wu-py-4 wu-m-0 wu-border-t wu-border-l-0 wu-border-r-0 wu-border-b-0 wu-border-gray-300 wu-border-solid', )); ob_start(); $form->render(); $section['content'] = ob_get_clean(); } // end if; wu_get_template('wizards/setup/default', array_merge($section, array( 'page' => $this, ))); } // end default_view; /** * Renders the default submit box with action buttons at the bottom of the wizard. * * @since 2.0.0 * @return void */ public function render_submit_box() { wu_get_template('base/wizard/submit-box', array( 'screen' => get_current_screen(), 'page' => $this, 'labels' => $this->get_labels(), )); } // end render_submit_box; /** * Wizard classes should implement a method that returns an array of sections and subsections. * * @since 2.0.0 * @return array */ abstract public function get_sections(); // end get_sections; } // end class Wizard_Admin_Page;