base.php (8656B)
1 <?php 2 namespace Elementor\TemplateLibrary; 3 4 use Elementor\Controls_Stack; 5 use Elementor\Plugin; 6 use Elementor\Utils; 7 8 if ( ! defined( 'ABSPATH' ) ) { 9 exit; // Exit if accessed directly. 10 } 11 12 /** 13 * Elementor template library source base. 14 * 15 * Elementor template library source base handler class is responsible for 16 * initializing all the methods controlling the source of Elementor templates. 17 * 18 * @since 1.0.0 19 * @abstract 20 */ 21 abstract class Source_Base { 22 23 /** 24 * User meta. 25 * 26 * Holds the current user meta data. 27 * 28 * @access private 29 * 30 * @var array 31 */ 32 private $user_meta; 33 34 /** 35 * Get template ID. 36 * 37 * Retrieve the template ID. 38 * 39 * @since 1.0.0 40 * @access public 41 * @abstract 42 */ 43 abstract public function get_id(); 44 45 /** 46 * Get template title. 47 * 48 * Retrieve the template title. 49 * 50 * @since 1.0.0 51 * @access public 52 * @abstract 53 */ 54 abstract public function get_title(); 55 56 /** 57 * Register template data. 58 * 59 * Used to register custom template data like a post type, a taxonomy or any 60 * other data. 61 * 62 * @since 1.0.0 63 * @access public 64 * @abstract 65 */ 66 abstract public function register_data(); 67 68 /** 69 * Get templates. 70 * 71 * Retrieve templates from the template library. 72 * 73 * @since 1.0.0 74 * @access public 75 * @abstract 76 * 77 * @param array $args Optional. Filter templates list based on a set of 78 * arguments. Default is an empty array. 79 */ 80 abstract public function get_items( $args = [] ); 81 82 /** 83 * Get template. 84 * 85 * Retrieve a single template from the template library. 86 * 87 * @since 1.0.0 88 * @access public 89 * @abstract 90 * 91 * @param int $template_id The template ID. 92 */ 93 abstract public function get_item( $template_id ); 94 95 /** 96 * Get template data. 97 * 98 * Retrieve a single template data from the template library. 99 * 100 * @since 1.5.0 101 * @access public 102 * @abstract 103 * 104 * @param array $args Custom template arguments. 105 */ 106 abstract public function get_data( array $args ); 107 108 /** 109 * Delete template. 110 * 111 * Delete template from the database. 112 * 113 * @since 1.0.0 114 * @access public 115 * @abstract 116 * 117 * @param int $template_id The template ID. 118 */ 119 abstract public function delete_template( $template_id ); 120 121 /** 122 * Save template. 123 * 124 * Save new or update existing template on the database. 125 * 126 * @since 1.0.0 127 * @access public 128 * @abstract 129 * 130 * @param array $template_data The template data. 131 */ 132 abstract public function save_item( $template_data ); 133 134 /** 135 * Update template. 136 * 137 * Update template on the database. 138 * 139 * @since 1.0.0 140 * @access public 141 * @abstract 142 * 143 * @param array $new_data New template data. 144 */ 145 abstract public function update_item( $new_data ); 146 147 /** 148 * Export template. 149 * 150 * Export template to a file. 151 * 152 * @since 1.0.0 153 * @access public 154 * @abstract 155 * 156 * @param int $template_id The template ID. 157 */ 158 abstract public function export_template( $template_id ); 159 160 /** 161 * Template library source base constructor. 162 * 163 * Initializing the template library source base by registering custom 164 * template data. 165 * 166 * @since 1.0.0 167 * @access public 168 */ 169 public function __construct() { 170 $this->register_data(); 171 } 172 173 /** 174 * Mark template as favorite. 175 * 176 * Update user meta containing his favorite templates. For a given template 177 * ID, add the template to the favorite templates or remove it from the 178 * favorites, based on the `favorite` parameter. 179 * 180 * @since 1.9.0 181 * @access public 182 * 183 * @param int $template_id The template ID. 184 * @param bool $favorite Optional. Whether the template is marked as 185 * favorite, or not. Default is true. 186 * 187 * @return int|bool User meta ID if the key didn't exist, true on successful 188 * update, false on failure. 189 */ 190 public function mark_as_favorite( $template_id, $favorite = true ) { 191 $favorites_templates = $this->get_user_meta( 'favorites' ); 192 193 if ( ! $favorites_templates ) { 194 $favorites_templates = []; 195 } 196 197 if ( $favorite ) { 198 $favorites_templates[ $template_id ] = $favorite; 199 } elseif ( isset( $favorites_templates[ $template_id ] ) ) { 200 unset( $favorites_templates[ $template_id ] ); 201 } 202 203 return $this->update_user_meta( 'favorites', $favorites_templates ); 204 } 205 206 /** 207 * Get current user meta. 208 * 209 * Retrieve Elementor meta data for the current user. 210 * 211 * @since 1.9.0 212 * @access public 213 * 214 * @param string $item Optional. User meta key. Default is null. 215 * 216 * @return null|array An array of user meta data, or null otherwise. 217 */ 218 public function get_user_meta( $item = null ) { 219 if ( null === $this->user_meta ) { 220 $this->user_meta = get_user_meta( get_current_user_id(), $this->get_user_meta_prefix(), true ); 221 } 222 223 if ( ! $this->user_meta ) { 224 $this->user_meta = []; 225 } 226 227 if ( $item ) { 228 if ( isset( $this->user_meta[ $item ] ) ) { 229 return $this->user_meta[ $item ]; 230 } 231 232 return null; 233 } 234 235 return $this->user_meta; 236 } 237 238 /** 239 * Update current user meta. 240 * 241 * Update user meta data based on meta key an value. 242 * 243 * @since 1.9.0 244 * @access public 245 * 246 * @param string $key Optional. User meta key. 247 * @param mixed $value Optional. User meta value. 248 * 249 * @return int|bool User meta ID if the key didn't exist, true on successful 250 * update, false on failure. 251 */ 252 public function update_user_meta( $key, $value ) { 253 $meta = $this->get_user_meta(); 254 255 $meta[ $key ] = $value; 256 257 $this->user_meta = $meta; 258 259 return update_user_meta( get_current_user_id(), $this->get_user_meta_prefix(), $meta ); 260 } 261 262 /** 263 * Replace elements IDs. 264 * 265 * For any given Elementor content/data, replace the IDs with new randomly 266 * generated IDs. 267 * 268 * @since 1.0.0 269 * @access protected 270 * 271 * @param array $content Any type of Elementor data. 272 * 273 * @return mixed Iterated data. 274 */ 275 protected function replace_elements_ids( $content ) { 276 return Plugin::$instance->db->iterate_data( $content, function( $element ) { 277 $element['id'] = Utils::generate_random_string(); 278 279 return $element; 280 } ); 281 } 282 283 /** 284 * Get Elementor library user meta prefix. 285 * 286 * Retrieve user meta prefix used to save Elementor data. 287 * 288 * @since 1.9.0 289 * @access protected 290 * 291 * @return string User meta prefix. 292 */ 293 protected function get_user_meta_prefix() { 294 return 'elementor_library_' . $this->get_id(); 295 } 296 297 /** 298 * Process content for export/import. 299 * 300 * Process the content and all the inner elements, and prepare all the 301 * elements data for export/import. 302 * 303 * @since 1.5.0 304 * @access protected 305 * 306 * @param array $content A set of elements. 307 * @param string $method Accepts either `on_export` to export data or 308 * `on_import` to import data. 309 * 310 * @return mixed Processed content data. 311 */ 312 protected function process_export_import_content( $content, $method ) { 313 return Plugin::$instance->db->iterate_data( 314 $content, function( $element_data ) use ( $method ) { 315 $element = Plugin::$instance->elements_manager->create_element_instance( $element_data ); 316 317 // If the widget/element isn't exist, like a plugin that creates a widget but deactivated 318 if ( ! $element ) { 319 return null; 320 } 321 322 return $this->process_element_export_import_content( $element, $method ); 323 } 324 ); 325 } 326 327 /** 328 * Process single element content for export/import. 329 * 330 * Process any given element and prepare the element data for export/import. 331 * 332 * @since 1.5.0 333 * @access protected 334 * 335 * @param Controls_Stack $element 336 * @param string $method 337 * 338 * @return array Processed element data. 339 */ 340 protected function process_element_export_import_content( Controls_Stack $element, $method ) { 341 $element_data = $element->get_data(); 342 343 if ( method_exists( $element, $method ) ) { 344 // TODO: Use the internal element data without parameters. 345 $element_data = $element->{$method}( $element_data ); 346 } 347 348 foreach ( $element->get_controls() as $control ) { 349 $control_class = Plugin::$instance->controls_manager->get_control( $control['type'] ); 350 351 // If the control isn't exist, like a plugin that creates the control but deactivated. 352 if ( ! $control_class ) { 353 return $element_data; 354 } 355 356 if ( method_exists( $control_class, $method ) ) { 357 $element_data['settings'][ $control['name'] ] = $control_class->{$method}( $element->get_settings( $control['name'] ), $control ); 358 } 359 360 // On Export, check if the control has an argument 'export' => false. 361 if ( 'on_export' === $method && isset( $control['export'] ) && false === $control['export'] ) { 362 unset( $element_data['settings'][ $control['name'] ] ); 363 } 364 } 365 366 return $element_data; 367 } 368 }