PluginProbe
Elementor Website Builder – more than just a page builder / 3.6.3
Elementor Website Builder – more than just a page builder v3.6.3
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / core / responsive / files / frontend.php

frontend.php in Elementor Website Builder – more than just a page builder 3.6.3, at core/responsive/files/frontend.php

197 lines 4.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Elementor\Core\Responsive\Files;
4
5 use Elementor\Core\Breakpoints\Breakpoint;
6 use Elementor\Core\Files\Base;
7 use Elementor\Core\Responsive\Responsive;
8 use Elementor\Plugin;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit; // Exit if accessed directly
12 }
13
14 class Frontend extends Base {
15
16 const META_KEY = 'elementor-custom-breakpoints-files';
17
18 private $template_file;
19
20 /**
21 * @since 2.1.0
22 * @access public
23 */
24 public function __construct( $file_name, $template_file = null ) {
25 $this->template_file = $template_file;
26
27 parent::__construct( $file_name );
28 }
29
30 /**
31 * @since 2.1.0
32 * @access public
33 */
34 public function parse_content() {
35 $breakpoints = Plugin::$instance->breakpoints->get_active_breakpoints();
36
37 $breakpoints_keys = array_keys( $breakpoints );
38
39 $file_content = file_get_contents( $this->template_file );
40
41 // The regex pattern parses placeholders located in the frontend _templates.scss file.
42 $file_content = preg_replace_callback( '/ELEMENTOR_SCREEN_([A-Z_]+)(?:_(MIN|MAX|NEXT))/', function ( $placeholder_data ) use ( $breakpoints_keys, $breakpoints ) {
43 // Handle BC for legacy template files and Elementor Pro builds.
44 $placeholder_data = $this->maybe_convert_placeholder_data( $placeholder_data );
45
46 $breakpoint_index = array_search( strtolower( $placeholder_data[1] ), $breakpoints_keys, true );
47
48 if ( 'DESKTOP' === $placeholder_data[1] ) {
49 if ( 'MIN' === $placeholder_data[2] ) {
50 $value = Plugin::$instance->breakpoints->get_desktop_min_point();
51 } elseif ( isset( $breakpoints['widescreen'] ) ) {
52 // If the 'widescreen' breakpoint is active, the Desktop's max value is the Widescreen breakpoint - 1px.
53 $value = $breakpoints['widescreen']->get_value() - 1;
54 } else {
55 // If the 'widescreen' breakpoint is not active, the Desktop device should not have a max value.
56 $value = 99999;
57 }
58 } elseif ( false === $breakpoint_index ) {
59 // If the breakpoint in the placeholder is not active - use a -1 value for the media query, to make
60 // sure the setting is printed (to avoid a PHP error) but doesn't apply.
61 $value = -1;
62 } elseif ( 'WIDESCREEN' === $placeholder_data[1] ) {
63 $value = $breakpoints['widescreen']->get_value();
64 } else {
65 $breakpoint_index = array_search( strtolower( $placeholder_data[1] ), $breakpoints_keys, true );
66
67 $is_max_point = 'MAX' === $placeholder_data[2];
68
69 // If the placeholder capture is `MOBILE_NEXT` or `TABLET_NEXT`, the original breakpoint value is used.
70 if ( ! $is_max_point && 'NEXT' !== $placeholder_data[2] ) {
71 $breakpoint_index--;
72 }
73
74 $value = $breakpoints[ $breakpoints_keys[ $breakpoint_index ] ]->get_value();
75
76 if ( ! $is_max_point ) {
77 $value++;
78 }
79 }
80
81 return $value . 'px';
82 }, $file_content );
83
84 return $file_content;
85 }
86
87 /**
88 * Load meta.
89 *
90 * Retrieve the file meta data.
91 *
92 * @since 2.1.0
93 * @access protected
94 */
95 protected function load_meta() {
96 $option = $this->load_meta_option();
97
98 $file_meta_key = $this->get_file_meta_key();
99
100 if ( empty( $option[ $file_meta_key ] ) ) {
101 return [];
102 }
103
104 return $option[ $file_meta_key ];
105 }
106
107 /**
108 * Update meta.
109 *
110 * Update the file meta data.
111 *
112 * @since 2.1.0
113 * @access protected
114 *
115 * @param array $meta New meta data.
116 */
117 protected function update_meta( $meta ) {
118 $option = $this->load_meta_option();
119
120 $option[ $this->get_file_meta_key() ] = $meta;
121
122 update_option( static::META_KEY, $option );
123 }
124
125 /**
126 * Delete meta.
127 *
128 * Delete the file meta data.
129 *
130 * @since 2.1.0
131 * @access protected
132 */
133 protected function delete_meta() {
134 $option = $this->load_meta_option();
135
136 $file_meta_key = $this->get_file_meta_key();
137
138 if ( isset( $option[ $file_meta_key ] ) ) {
139 unset( $option[ $file_meta_key ] );
140 }
141
142 if ( $option ) {
143 update_option( static::META_KEY, $option );
144 } else {
145 delete_option( static::META_KEY );
146 }
147 }
148
149 /**
150 * @since 2.1.0
151 * @access private
152 */
153 private function get_file_meta_key() {
154 return pathinfo( $this->get_file_name(), PATHINFO_FILENAME );
155 }
156
157 /**
158 * @since 2.1.0
159 * @access private
160 */
161 private function load_meta_option() {
162 $option = get_option( static::META_KEY );
163
164 if ( ! $option ) {
165 $option = [];
166 }
167
168 return $option;
169 }
170
171 /**
172 * Maybe Convert Placeholder Data
173 *
174 * Converts responsive placeholders in Elementor CSS template files from the legacy format into the new format.
175 * Used for backwards compatibility for old Pro versions that were built with an Elementor Core version <3.2.0.
176 *
177 * @since 3.2.3
178 *
179 * @param $placeholder_data
180 * @return mixed
181 */
182 private function maybe_convert_placeholder_data( $placeholder_data ) {
183 switch ( $placeholder_data[1] ) {
184 case 'SM':
185 $placeholder_data[1] = 'MOBILE';
186 break;
187 case 'MD':
188 $placeholder_data[1] = 'TABLET';
189 break;
190 case 'LG':
191 $placeholder_data[1] = 'DESKTOP';
192 }
193
194 return $placeholder_data;
195 }
196 }
197