change_parameters(); parent::init(); $this->editing = wu_request('customize'); add_action('wu_enqueue_extra_hooks', array($this, 'additional_hooks')); add_action('updated_user_meta', array($this, 'save_settings'), 10, 4); wu_register_form( "edit_admin_page_$this->id", array( 'render' => array($this, 'render_edit_page'), 'handler' => array($this, 'handle_edit_page'), 'capability' => 'exist', ) ); $this->register_page_settings(); } /** * Saves the original parameters and change them with the settings saved. * * @since 2.0.0 * @return void */ public function change_parameters() { $this->original_parameters = array( 'title' => $this->get_title(), 'position' => $this->position, 'menu_icon' => $this->menu_icon, ); $new_parameters = $this->get_page_settings(); $this->title = wu_get_isset($new_parameters, 'title', $this->original_parameters['title']); $this->menu_title = wu_get_isset($new_parameters, 'title', $this->original_parameters['title']); $this->position = wu_get_isset($new_parameters, 'position', $this->original_parameters['position']); $this->menu_icon = str_replace('dashicons-before', '', (string) wu_get_isset($new_parameters, 'menu_icon', $this->original_parameters['menu_icon'] ?? '')); } /** * Renders the edit page form. * * @since 2.0.0 * @return void */ public function render_edit_page() { $settings = $this->get_page_settings(); $fields = array(); $fields['title'] = array( 'type' => 'text', 'title' => __('Page & Menu Title', 'wp-ultimo'), 'value' => wu_get_isset($settings, 'title', ''), 'tooltip' => '', ); if ($this->menu_settings) { $fields['position'] = array( 'type' => 'number', 'title' => __('Menu', 'wp-ultimo'), 'value' => wu_get_isset($settings, 'position', ''), 'tooltip' => '', ); $fields['menu_icon'] = array( 'type' => 'dashicon', 'title' => __('Menu Icon', 'wp-ultimo'), 'value' => wu_get_isset($settings, 'menu_icon', ''), 'tooltip' => '', ); } $fields['save_line'] = array( 'type' => 'group', 'classes' => 'wu-justify-between', 'wrapper_classes' => 'wu-bg-gray-100', 'fields' => array( 'reset' => array( 'type' => 'submit', 'title' => __('Reset Settings', 'wp-ultimo'), 'value' => 'edit', 'classes' => 'button', 'wrapper_classes' => 'wu-mb-0', ), 'submit' => array( 'type' => 'submit', 'title' => __('Save Changes', 'wp-ultimo'), 'value' => 'edit', 'classes' => 'button button-primary', 'wrapper_classes' => 'wu-mb-0', ), ), ); $fields = apply_filters("wu_customer_facing_page_{$this->id}_fields", $fields); $form = new \WP_Ultimo\UI\Form( 'edit_page', $fields, array( 'views' => 'admin-pages/fields', 'classes' => 'wu-modal-form wu-widget-list wu-striped wu-m-0 wu-mt-0', 'field_wrapper_classes' => 'wu-w-full wu-box-border wu-items-center wu-flex wu-justify-between wu-p-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', 'html_attr' => array( 'data-wu-app' => "{$this->id}_page_customize", 'data-state' => wu_convert_to_state(), ), ) ); echo '
'; $form->render(); echo '
'; } /** * Handles the edit page form and saved changes. * * @since 2.0.0 * @return void */ public function handle_edit_page() { $settings_to_save = wu_request('submit') !== 'restore' ? $_POST : array(); // don't worry, this gets cleaned later on. $this->save_page_settings($settings_to_save); wp_send_json_success( array( 'redirect_url' => add_query_arg('updated', 1, $_SERVER['HTTP_REFERER']), ) ); } /** * Generates a unique id for each page based on the class name. * * @since 2.0.0 * @return string */ public function get_page_unique_id() { $class_name_array = explode('\\', static::class); $class_name = array_pop($class_name_array); return wu_replace_dashes(strtolower($class_name)); } /** * Grabs the original page parameters. * * @since 2.0.0 * @return array */ public function get_defaults() { return $this->original_parameters; } /** * Register the default setting on the core section. * * @since 2.0.0 * @return void */ public function register_page_settings() { wu_register_settings_field( 'core', $this->get_page_unique_id() . '_settings', array( 'raw' => true, ) ); } /** * Get the page settings saved. * * @since 2.0.0 * @return array */ public function get_page_settings() { $atts = wu_get_setting($this->get_page_unique_id() . '_settings', array()); return wp_parse_args($atts, $this->get_defaults()); } /** * Saves the page settings. * * @since 2.0.0 * * @param array $settings List of page settings. * @return boolean */ public function save_page_settings($settings) { $atts = shortcode_atts($this->get_defaults(), $settings); // Use shortcode atts to remove unauthorized params. return wu_save_setting($this->get_page_unique_id() . '_settings', $atts); } /** * Adds additional hooks using the right hook on the page lifecycle. * * @since 2.0.0 * @return void */ public function additional_hooks() { add_action("load-$this->page_hook", array($this, 'register_additional_scripts')); add_action("load-$this->page_hook", array($this, 'add_additional_body_classes')); add_action("load-$this->page_hook", array($this, 'additional_on_page_load')); } /** * Registers additional hooks for the page load. * * @since 2.0.0 * @return void */ public function additional_on_page_load() { add_filter('wu_element_display_super_admin_notice', array($this, 'is_edit_mode')); add_action("get_user_option_meta-box-order_{$this->page_hook}", array($this, 'get_settings'), 10, 3); add_action("get_user_option_screen_layout_{$this->page_hook}", array($this, 'get_settings'), 10, 3); /** * 'Hack-y' solution for the customer facing title problem... but good enough for now. * * @todo review when possible. */ add_filter( 'wp_ultimo_render_vars', function ($vars) { $vars['page_title'] = $this->title; return $vars; }, 15 ); } /** * Adds additional body classes for styling control purposes. * * @since 2.0.0 * @return void */ public function add_additional_body_classes() { add_action( 'admin_body_class', function ($classes) { $classes .= $this->is_edit_mode() ? ' wu-customize-admin-screen' : ''; return $classes; } ); } /** * Registers and enqueues additional scripts and styles required. * * @since 2.0.0 * @return void */ public function register_additional_scripts() { \WP_Ultimo\Scripts::get_instance()->register_style('wu-admin-screen', wu_get_asset('admin-screen.css', 'css')); wp_enqueue_style('wu-admin-screen'); if ($this->is_edit_mode()) { wp_enqueue_script('dashboard'); } if (current_user_can($this->edit_capability)) { \WP_Ultimo\Scripts::get_instance()->register_script('wu-admin-screen', wu_get_asset('admin-screen.js', 'js'), array('jquery', 'wu-fonticonpicker')); wp_localize_script( 'wu-admin-screen', 'wu_admin_screen', array( 'page_customize_link' => wu_get_form_url("edit_admin_page_$this->id"), 'customize_link' => add_query_arg('customize', 1), 'close_link' => remove_query_arg('customize'), 'i18n' => array( 'page_customize_label' => __('Customize Page', 'wp-ultimo'), 'customize_label' => __('Customize Elements', 'wp-ultimo'), 'close_label' => __('Exit Customize Mode', 'wp-ultimo'), ), ) ); wp_enqueue_script('wu-admin-screen'); } } /** * Filters the order and columns of the widgets to return a globally saved value. * * @since 2.0.0 * * @param array $result Original value of the settings being changed. * @param string $option The name of the option/setting being fetched. * @param int $user The user ID. * @return array */ public function get_settings($result, $option, $user) { $option = wu_replace_dashes($option); $saved = wu_get_setting($option); return empty($saved) ? $result : $saved; } /** * Save the settings globally for columns and order of the widgets. * * @since 2.0.0 * * @param int $meta_id The id of the user meta being saved. * @param int $user_id The user id. * @param string $meta_key The name of the option/setting being saved. * @param mixed $_meta_value The original saved value. * @return void */ public function save_settings($meta_id, $user_id, $meta_key, $_meta_value) { if (wu_request('action') !== 'meta-box-order') { return; } $is_this_page = strpos((string) wu_request('page'), $this->id) !== false; if ( ! $is_this_page) { return; } if ( ! user_can($user_id, $this->edit_capability)) { return; } $meta_key = wu_replace_dashes($meta_key); wu_save_setting($meta_key, $_meta_value); } /** * Get the value of editing. * * @since 2.0.0 * @return boolean */ public function is_edit_mode() { return $this->editing && current_user_can($this->edit_capability); } /** * Adds top-level admin page. * * @since 1.8.2 * @return string Page hook generated by WordPress. */ public function add_toplevel_menu_page() { if (wu_request('id')) { $this->edit = true; } return add_menu_page( $this->title, $this->title . ' ' . $this->get_badge(), $this->get_capability(), $this->id, array($this, 'display'), $this->menu_icon, $this->position ); } }