getName(); $ajax_manager->registerAjaxAction("save_{$name}_settings", [$this, 'ajaxSaveSettings']); } /** * Get model for config. * * Retrieve the model for settings configuration. * * @since 1.6.0 * @abstract * * @return Model The model object */ abstract public function getModelForConfig(); /** * Get manager name. * * Retrieve settings manager name. * * @since 1.6.0 * @abstract */ abstract public function getName(); /** * Get model. * * Retrieve the model for any given model ID. * * @since 1.6.0 * * @param int $id Optional. Model ID. Default is `0` * * @return Model The model */ final public function getModel($id = 0) { $uid = "$id"; if (!isset($this->models_cache[$uid])) { $this->createModel($uid); } return $this->models_cache[$uid]; } /** * Ajax request to save settings. * * Save settings using an ajax request. * * @since 1.6.0 * * @param array $request Ajax request * * @return array Ajax response data */ final public function ajaxSaveSettings($request) { $data = $request['data']; $id = 0; if (!empty($request['id'])) { $id = $request['id']; } $this->ajaxBeforeSaveSettings($data, $id); $this->saveSettings($data, $id); $settings_name = $this->getName(); $success_response_data = []; /* * Settings success response data. * * Filters the success response data when saving settings using ajax. * * The dynamic portion of the hook name, `$settings_name`, refers to the settings name. * * @since 2.0.0 * * @param array $success_response_data Success response data * @param int $id Settings ID * @param array $data Settings data */ $success_response_data = apply_filters("elementor/settings/{$settings_name}/success_response_data", $success_response_data, $id, $data); return $success_response_data; } /** * Save settings. * * Save settings to the database. * * @since 1.6.0 * * @param array $settings Settings * @param int $id Optional. Post ID. Default is `0` */ public function saveSettings(array $settings, $id = 0) { $special_settings = $this->getSpecialSettingsNames(); $settings_to_save = $settings; foreach ($special_settings as $special_setting) { if (isset($settings_to_save[$special_setting])) { unset($settings_to_save[$special_setting]); } } $this->saveSettingsToDb($settings_to_save, $id); // Clear cache after save. if (isset($this->models_cache[$id])) { unset($this->models_cache[$id]); } } /** * On Elementor init. * * Add editor template for the settings * * Fired by `elementor/init` action. * * @since 2.3.0 */ public function onElementorEditorInit() { Plugin::$instance->common->addTemplate($this->getEditorTemplate(), 'text'); } /** * Get saved settings. * * Retrieve the saved settings from the database. * * @since 1.6.0 * @abstract * * @param int $id Post ID */ abstract protected function getSavedSettings($id); /** * Save settings to DB. * * Save settings to the database. * * @since 1.6.0 * @abstract * * @param array $settings Settings * @param int $id Post ID */ abstract protected function saveSettingsToDb(array $settings, $id); /** * Get special settings names. * * Retrieve the names of the special settings that are not saved as regular * settings. Those settings have a separate saving process. * * @since 1.6.0 * * @return array Special settings names */ protected function getSpecialSettingsNames() { return []; } /** * Ajax before saving settings. * * Validate the data before saving it and updating the data in the database. * * @since 1.6.0 * * @param array $data Post data * @param int $id Post ID */ public function ajaxBeforeSaveSettings(array $data, $id) { } /** * Print the setting template content in the editor. * * Used to generate the control HTML in the editor using Underscore JS * template. The variables for the class are available using `data` JS * object. * * @since 1.6.0 * * @param string $name Settings panel name */ protected function printEditorTemplateContent($name) { ?> <# const tabs = elementor.config.settings..tabs; if ( Object.values( tabs ).length > 1 ) { #>
<# } #> models_cache[$id] = new $class_name([ 'id' => $id, 'settings' => $this->getSavedSettings($id), ]); } /** * Get editor template. * * Retrieve the final HTML for the editor. * * @since 1.6.0 * * @return string Settings editor template */ private function getEditorTemplate() { $name = $this->getName(); ob_start(); ?>