validateNonce($nonceName, $nonceAction)) { return; } if (!isset($_REQUEST['existing_menu']) && !isset($_REQUEST['menu'])) { return $validate->wpDieMessage(); } if (!$validate->pages()) { return; } if (isset($_REQUEST['existing_menu'])) { return $this->existingMenu($validate, $data); } if (isset($_REQUEST['menu'])) { return $this->customMenu($validate, $data); } } private function existingMenu(Validation $validate, Data $data) { if (!$validate->existingMenu()) { return; } $this->processingDeleteOptionNames(); $this->processingFields($this->exitingMenuFields($validate)); } private function customMenu(Validation $validate, Data $data) { if (!$validate->customMenu()) { return; } $this->processingDeleteOptionNames(); $this->processingFields($this->customMenuFields($validate)); } /** * Get the serialized data/fields from the pages with a custom menu. * * @param \AOP\Includes\Validation $validate * @return string */ public function customMenuFields(Validation $validate) { $menuPage = $this->menuPageForCustomMenu($validate); return [ 'menu_slug' => $menuPage['menu_slug'], 'serialized_value' => serialize([ 'menu_id' => $validate->number($_POST['menu_id']), 'menu' => $menuPage, 'pages' => $this->subpagesForCustomMenu($validate) ]) ]; } /** * Get the serialized data/fields from the pages with an exiting menu. * * @param \AOP\Includes\Validation $validate * @return string */ public function exitingMenuFields(Validation $validate) { return [ 'menu_slug' => $this->existingMenuParentSlug(), 'serialized_value' => serialize([ 'menu_id' => $validate->number($_POST['menu_id']), 'existing_menu' => [ 'menu_name' => $this->existingMenuName(), 'menu_slug' => $this->existingMenuParentSlug() ], 'pages' => $this->subpagesForExistingMenu($validate) ]) ]; } /** * Posting or updating the exiting menu fields. * * @param string $fields * @return mixed */ public function processingFields($fields) { if ($_REQUEST['page'] === SubpageCreate::SLUG) { $this->insertNewPage( $fields['serialized_value'], $fields['menu_slug'] ); session_start(); $_SESSION['aop_pages_saved'] = true; $_SESSION['aop_request_on_save'] = $_REQUEST; wp_safe_redirect(add_query_arg('optionpage', $this->insertId(), SubpageEdit::url())); exit; } if ($_REQUEST['page'] === SubpageEdit::SLUG) { $this->updateEditPage( Data::IdEditPage(), $fields['serialized_value'], $fields['menu_slug'] ); update_option(Plugin::PREFIX_ . 'option_names', Data::getAllCreatedOptionNamesAfterEdit()->all()); $optionsNames = Data::getFieldsfromId($_REQUEST['optionpage']) ->whereIn('field_name', get_option(Plugin::PREFIX_ . 'option_names')); $optionsNames->filter(function ($item) { return isset($item['default_value']) && isset($item['field_name']); })->map(function ($item) { add_option($item['field_name'], $item['default_value']); }); $optionNames = (get_current_screen()->id === 'admin_page_' . SubpageEdit::SLUG) ? Data::getAllOptionNamesExcludeCurrentPageFieldNames() : Data::getAllOptionNames()->all(); wp_localize_script(Plugin::PREFIX . 'app-js', Plugin::PREFIX_ . 'option_names_js', $optionNames); wp_localize_script(Plugin::PREFIX . 'app-js', Plugin::PREFIX_ . 'script_data_js', Data::js()); Notice::succes(__('Updated.')); } } public function processingDeleteOptionNames() { return Collection::make(Data::getAllRegisteredFieldNames()) ->diff(Data::getFieldsWithFieldNames()) ->values() ->map(function ($name) { return delete_option($name); }); } /** * Get the menu name for the exiting menu. * * @return string */ public function existingMenuName() { return stripcslashes($_POST['existing_menu']['menu_name']); } /** * Get the parent slug for the exiting menu. * * @return string */ public function existingMenuParentSlug() { return $_POST['existing_menu']['menu_slug']; } /** * Get the parent slug for the custom menu. * * @param \AOP\Includes\Validation $validate * @return string */ public function parentSlugForCustomMenu(Validation $validate) { return $validate->alphanumericDashesAll($_POST['pages'][0]['subpage_slug']); } /** * Get the parent slug for the custom menu. * * @param \AOP\Includes\Validation $validate * @return string */ public function parentSlugSuffixForCustomMenu(Validation $validate) { return $validate->alphanumeric($_POST['pages'][0]['subpage_slug_suffix']); } /** * Get menu items for custom menu. * * @param string $parentSlug * @return array */ public function menuPageForCustomMenu(Validation $validate) { return [ 'page_title' => $validate->already($_POST['menu']['menu_title'], $validate->customMenu()), 'menu_title' => $validate->already($_POST['menu']['menu_title'], $validate->customMenu()), 'capability' => 'manage_options', 'menu_slug' => $validate->already($this->parentSlugForCustomMenu($validate)), 'menu_slug_suffix' => $validate->already($this->parentSlugSuffixForCustomMenu($validate)), 'icon_url' => $validate->already($_POST['menu']['menu_icon'], $validate->customMenu()), 'position' => $validate->already($_POST['menu']['menu_position'], $validate->customMenu()), ]; } /** * Get subpages for existing menu types. * * @return array */ protected function subpagesForExistingMenu(Validation $validate) { if (!isset($_POST['pages'])) { return []; } return Collection::make($_POST['pages'])->map(function ($subpage, $key) use ($validate) { $validatedSubpageTab = (isset($subpage['subpage_tab']) && $subpage['subpage_tab'] === '1') ? true : false; $validatedParentSlug = $validate->already($this->existingMenuParentSlug(), $validate->existingMenu()); $validatedSubpageToggle = ($validate->toggle($subpage['subpage_toggle']) === 'true') ? true : false; return [ 'parent_slug' => $validatedParentSlug, 'page_title' => '', 'subpage_title' => $validate->textField($subpage['subpage_title']), 'menu_title' => $validate->textField($subpage['menu_title']), 'capability' => 'manage_options', 'menu_slug' => $validate->alphanumericDashesAll($subpage['subpage_slug']), 'subpage_slug_suffix' => $validate->alphanumeric($subpage['subpage_slug_suffix']), 'include_tab' => $validatedSubpageTab, 'select_title' => $validate->textField($subpage['select_title']), 'subpage_toggle' => $validatedSubpageToggle, 'fields' => $this->fields($subpage, $validate) ]; })->toArray(); } /** * Get subpages for custom menu types. * * @return array */ protected function subpagesForCustomMenu(Validation $validate) { if (!isset($_POST['pages'])) { return []; } return Collection::make($_POST['pages'])->map(function ($subpage, $key) use ($validate) { $validatedSubpageTab = (isset($subpage['subpage_tab']) && $subpage['subpage_tab'] === '1') ? true : false; $validatedParentSlug = $this->parentSlugForCustomMenu($validate); $validatedMenuSlug = ($key === 0) ? $validatedParentSlug : $validate->alphanumericDashesAll($subpage['subpage_slug']); $validatedSubpageToggle = ($validate->toggle($subpage['subpage_toggle']) === 'true') ? true : false; return [ 'parent_slug' => $validatedParentSlug, 'page_title' => $validate->textField($_POST['menu']['menu_title']), 'subpage_title' => $validate->textField($subpage['subpage_title']), 'menu_title' => $validate->textField($subpage['menu_title']), 'capability' => 'manage_options', 'menu_slug' => $validatedMenuSlug, 'subpage_slug_suffix' => $validate->alphanumeric($subpage['subpage_slug_suffix']), 'include_tab' => $validatedSubpageTab, 'select_title' => $validate->textField($subpage['select_title']), 'subpage_toggle' => $validatedSubpageToggle, 'fields' => $this->fields($subpage, $validate) ]; })->toArray(); } /** * Get all fields from specific subpage. * * @param array $subpage Subpage with fields. * @return array */ protected function fields($subpage, Validation $validate) { if (!isset($subpage['fields'])) { return []; } $fields = Collection::make($subpage['fields']); $correctTypes = [ 'text_field', 'textarea', 'number', 'checkbox', 'radio', 'image', 'color_picker', 'title', 'description', 'horizontal_rule' ]; $validate->fieldTypes($fields, $correctTypes); /** * Get the textfields. * * @var array */ $textFields = $fields->where('type', 'text_field')->map(function ($field) use ($validate) { return [ 'id' => $validate->fieldId($field['id']), 'type' => 'text_field', 'field_key' => $validate->number($field['field_key']), 'page_name' => $validate->textField($field['page_slug']), 'field_toggle' => $validate->toggle($field['field_toggle']), 'field_label' => $validate->textField($field['field_label']), 'field_name' => $validate->already($field['field_name'], $validate->pages()), 'placeholder' => $validate->textField($field['placeholder']), 'default_value' => $validate->textField($field['default_value']), 'text_right' => $validate->textField($field['text_right']), 'class_attribute' => $validate->classAttribute($field['class_attribute']), 'field_style' => $validate->textFieldStyle($field['field_style']), 'toggle_text_format' => $validate->toggleTextFormat($field), 'description' => $validate->textArea($field['description']) ]; })->all(); /** * Get the textareas. * * @var array */ $textareas = $fields->where('type', 'textarea')->map(function ($field) use ($validate) { return [ 'id' => $validate->fieldId($field['id']), 'type' => 'textarea', 'field_key' => $validate->number($field['field_key']), 'page_name' => $validate->textField($field['page_slug']), 'field_toggle' => $validate->toggle($field['field_toggle']), 'field_label' => $validate->textField($field['field_label']), 'field_name' => $validate->already($field['field_name'], $validate->pages()), 'placeholder' => $validate->textField($field['placeholder']), 'default_value' => $validate->textField($field['default_value']), 'class_attribute' => $validate->classAttribute($field['class_attribute']), 'field_style' => $validate->textareaStyle($field['field_style']), 'description' => $validate->textArea($field['description']), 'description_italic' => $validate->toggleItalicFormat($field) ]; })->all(); /** * Get the numbers. * * @var array */ $numbers = $fields->where('type', 'number')->map(function ($field) use ($validate) { return [ 'id' => $validate->fieldId($field['id']), 'type' => 'number', 'field_key' => $validate->number($field['field_key']), 'page_name' => $validate->textField($field['page_slug']), 'field_toggle' => $validate->toggle($field['field_toggle']), 'field_label' => $validate->textField($field['field_label']), 'field_name' => $validate->already($field['field_name'], $validate->pages()), 'min_value' => $validate->textField($field['min_value']), 'max_value' => $validate->textField($field['max_value']), 'default_value' => $validate->textField($field['default_value']), 'decimals' => $validate->textField($field['decimals']), 'text_right' => $validate->textField($field['text_right']), 'class_attribute' => $validate->classAttribute($field['class_attribute']), 'description' => $validate->textArea($field['description']) ]; })->all(); /** * Get the checkboxes. * * @var array */ $checkboxes = $fields->where('type', 'checkbox')->map(function ($field) use ($validate) { return [ 'id' => $validate->fieldId($field['id']), 'type' => 'checkbox', 'field_key' => $validate->number($field['field_key']), 'page_name' => $validate->textField($field['page_slug']), 'field_toggle' => $validate->toggle($field['field_toggle']), 'field_label' => $validate->textField($field['field_label']), 'field_name' => $validate->already($field['field_name'], $validate->pages()), 'text_right' => $validate->textField($field['text_right']), 'default_value' => '0', 'class_attribute' => $validate->classAttribute($field['class_attribute']), 'description' => $validate->textArea($field['description']) ]; })->all(); /** * Get the radio buttons. * * @var array */ $radioButtons = $fields->where('type', 'radio')->map(function ($field) use ($validate) { return [ 'id' => $validate->fieldId($field['id']), 'type' => 'radio', 'field_key' => $validate->number($field['field_key']), 'page_name' => $validate->textField($field['page_slug']), 'field_toggle' => $validate->toggle($field['field_toggle']), 'field_label' => $validate->textField($field['field_label']), 'field_name' => $validate->already($field['field_name'], $validate->pages()), 'table_list' => $validate->tableList($field['table_list']), 'default_value' => Collection::make($validate->tableList($field['table_list']))->first()['value'], 'class_attribute' => $validate->classAttribute($field['class_attribute']), 'description' => $validate->textArea($field['description']) ]; })->all(); /** * Get the images. * * @var array */ $images = $fields->where('type', 'image')->map(function ($field) use ($validate) { return [ 'id' => $validate->fieldId($field['id']), 'type' => 'image', 'field_key' => $validate->number($field['field_key']), 'page_name' => $validate->textField($field['page_slug']), 'field_toggle' => $validate->toggle($field['field_toggle']), 'field_label' => $validate->textField($field['field_label']), 'field_name' => $validate->already($field['field_name'], $validate->pages()), 'class_attribute' => $validate->classAttribute($field['class_attribute']), 'description' => $validate->textArea($field['description']), 'extensions' => $validate->imageExtensions($field['extensions']) ]; })->all(); /** * Get the color pickers. * * @var array */ $colorPickers = $fields->where('type', 'color_picker')->map(function ($field) use ($validate) { return [ 'id' => $validate->fieldId($field['id']), 'type' => 'color_picker', 'field_key' => $validate->number($field['field_key']), 'page_name' => $validate->textField($field['page_slug']), 'field_toggle' => $validate->toggle($field['field_toggle']), 'field_label' => $validate->textField($field['field_label']), 'field_name' => $validate->already($field['field_name'], $validate->pages()), 'default_value' => $validate->colorHex($field['default_value']), 'class_attribute' => $validate->classAttribute($field['class_attribute']), 'description' => $validate->textArea($field['description']) ]; })->all(); /** * Get the titles. * * @var array */ $titles = $fields->where('type', 'title')->map(function ($field) use ($validate) { return [ 'id' => $validate->fieldId($field['id']), 'type' => 'title', 'field_key' => $validate->number($field['field_key']), 'page_name' => $validate->textField($field['page_slug']), 'field_toggle' => $validate->toggle($field['field_toggle']), 'field_title' => $validate->textField($field['field_title']), 'class_attribute' => $validate->classAttribute($field['class_attribute']) ]; })->all(); /** * Get the descriptions. * * @var array */ $descriptions = $fields->where('type', 'description')->map(function ($field) use ($validate) { return [ 'id' => $validate->fieldId($field['id']), 'type' => 'description', 'field_key' => $validate->number($field['field_key']), 'page_name' => $validate->textField($field['page_slug']), 'field_toggle' => $validate->toggle($field['field_toggle']), 'description' => $validate->textArea($field['description']), 'class_attribute' => $validate->classAttribute($field['class_attribute']) ]; })->all(); /** * Get the Horizontal rules. * * @var array */ $horizontalRules = $fields->where('type', 'horizontal_rule')->map(function ($field) use ($validate) { return [ 'id' => $validate->fieldId($field['id']), 'type' => 'horizontal_rule', 'field_key' => $validate->number($field['field_key']), 'page_name' => $validate->textField($field['page_slug']), 'field_toggle' => $validate->toggle($field['field_toggle']), 'class_attribute' => $validate->classAttribute($field['class_attribute']) ]; })->all(); /** * Wrap all fields. * * @var object */ $allFields = Collection::make([ $textFields, $textareas, $numbers, $checkboxes, $radioButtons, $images, $colorPickers, $titles, $descriptions, $horizontalRules ])->flatten(1); return $allFields->sortBy('field_key')->values()->all(); } }