PluginProbe ʕ •ᴥ•ʔ
Premium Addons for Elementor – Powerful Elementor Templates & Widgets / 4.10.30
Premium Addons for Elementor – Powerful Elementor Templates & Widgets v4.10.30
4.11.84 4.11.83 4.11.82 4.11.80 4.11.81 4.11.79 4.11.78 4.11.77 4.11.76 4.11.75 3.20.5 4.11.69 3.20.6 4.11.7 3.20.7 4.11.70 3.20.8 4.11.71 3.20.9 4.11.72 3.21.1 4.11.73 3.21.2 4.11.74 3.21.3 4.11.8 3.21.4 4.11.9 3.21.5 4.2.0 3.21.6 4.2.1 3.3.0 4.2.2 3.3.1 4.2.3 3.3.2 4.2.4 3.3.3 4.2.5 3.3.4 4.2.6 3.3.5 4.2.7 3.3.6 4.2.8 3.3.7 4.2.9 3.3.8 4.3.0 3.3.9 4.3.1 3.4.0 4.3.2 3.4.1 4.3.3 3.4.2 4.3.4 3.4.3 4.3.5 3.4.4 4.3.6 3.4.5 4.3.7 3.4.6 4.3.8 3.4.7 4.3.9 3.4.8 4.4.0 3.4.9 4.4.1 3.5.0 4.4.2 3.5.1 4.4.3 3.5.2 4.4.4 3.5.3 4.4.5 3.5.4 4.4.6 3.5.5 4.4.7 3.5.6 4.4.8 3.5.7 4.4.9 3.5.8 4.5.0 3.5.9 4.5.1 3.6.0 4.5.2 3.6.1 4.5.3 3.6.2 4.5.4 3.6.3 4.5.5 3.6.4 4.5.6 3.6.5 4.5.7 3.6.6 4.5.8 3.6.7 4.5.9 3.6.8 4.6.0 3.6.9 4.6.1 3.7.0 4.7.0 3.7.1 4.7.1 3.7.2 4.7.2 3.7.3 4.7.3 3.7.4 4.7.4 3.7.5 4.7.5 3.7.6 4.7.6 3.7.7 4.7.7 3.7.8 4.7.8 3.7.9 4.7.9 3.8.0 4.8.0 3.8.1 4.8.1 3.8.2 4.8.10 3.8.3 4.8.11 3.8.4 4.8.2 3.8.5 4.8.3 3.8.6 4.8.4 3.8.7 4.8.5 3.8.8 4.8.6 3.8.9 4.8.7 3.9.0 4.8.8 3.9.1 4.8.9 3.9.2 4.9.0 3.9.3 4.9.0-beta1 3.9.4 4.9.0-beta2 3.9.5 4.9.1 3.9.6 4.9.10 3.9.7 4.9.11 3.9.8 4.9.12 3.9.9 4.9.13 4.0.1 4.9.14 4.0.3 4.9.15 4.0.4 4.9.16 4.0.5 4.9.17 4.0.6 4.9.18 4.0.7 4.9.19 4.0.8 4.9.2 4.0.9 4.9.20 4.1.0 4.9.21 4.1.1 4.9.22 4.1.2 4.9.23 4.1.3 4.9.24 trunk 4.1.4 4.9.25 1.0 4.1.5 4.9.26 1.01 4.1.6 4.9.27 1.02 4.1.7 4.9.28 1.03 4.1.8 4.9.29 1.04 4.1.9 4.9.3 1.05 4.10.0 4.9.30 1.06 4.10.1 4.9.31 1.07 4.10.10 4.9.32 1.08 4.10.11 4.9.33 1.09 4.10.12 4.9.34 2.0 4.10.13 4.9.35 2.0.1 4.10.14 4.9.36 2.0.2 4.10.15 4.9.37 2.0.3 4.10.16 4.9.38 2.0.4 4.10.17 4.9.39 2.0.5 4.10.18 4.9.4 2.0.6 4.10.19 4.9.40 2.0.7 4.10.2 4.9.41 2.0.8 4.10.20 4.9.42 2.0.9 4.10.21 4.9.43 2.1.0 4.10.22 4.9.45 2.1.1 4.10.23 4.9.46 2.1.2 4.10.24 4.9.47 2.1.3 4.10.25 4.9.48 2.1.4 4.10.26 4.9.49 2.1.5 4.10.27 4.9.5 2.1.5-beta1 4.10.28 4.9.50 2.1.6 4.10.29 4.9.51 2.1.7 4.10.3 4.9.52 2.1.8 4.10.30 4.9.53 2.1.9 4.10.31 4.9.54 2.2.0 4.10.32 4.9.55 2.2.1 4.10.33 4.9.56 2.2.2 4.10.34 4.9.57 2.2.3 4.10.35 4.9.6 2.2.4 4.10.36 4.9.7 2.2.5 4.10.37 4.9.8 2.2.6 4.10.38 4.9.9 2.2.7 4.10.39 2.2.8 4.10.4 2.2.9 4.10.40 2.3.0 4.10.41 2.3.1 4.10.42 2.3.2 4.10.43 2.3.3 4.10.44 2.3.4 4.10.45 2.3.5 4.10.46 2.3.6 4.10.47 2.3.7 4.10.48 2.3.8 4.10.49 2.3.9 4.10.5 2.4.0 4.10.50 2.4.1 4.10.51 2.5.0 4.10.52 2.5.1 4.10.53 2.5.2 4.10.54 2.5.3 4.10.55 2.5.4 4.10.56 2.5.5 4.10.57 2.5.6 4.10.58 2.5.7 4.10.59 2.5.8 4.10.6 2.5.9 4.10.60 2.6.0 4.10.61 2.6.1 4.10.62 2.6.2 4.10.63 2.6.3 4.10.64 2.6.4 4.10.65 2.6.5 4.10.66 2.6.6 4.10.67 2.6.7 4.10.68 2.6.8 4.10.69 2.6.9 4.10.7 2.7.0 4.10.70 2.7.1 4.10.71 2.7.2 4.10.72 2.7.3 4.10.73 2.7.4 4.10.74 2.7.5 4.10.75 2.7.6 4.10.76 2.7.7 4.10.77 2.7.8 4.10.78 2.7.9 4.10.79 2.8.0 4.10.8 2.8.1 4.10.80 2.8.2 4.10.81 2.8.3 4.10.82 2.8.4 4.10.83 2.8.5 4.10.84 2.8.6 4.10.85 2.8.7 4.10.86 2.8.8 4.10.87 2.8.9 4.10.88 2.9.0 4.10.89 2.9.1 4.10.9 2.9.2 4.10.90 2.9.3 4.11.0 2.9.4 4.11.1 2.9.5 4.11.10 2.9.6 4.11.11 2.9.7 4.11.12 2.9.8 4.11.13 2.9.9 4.11.14 3.0.0 4.11.15 3.0.1 4.11.16 3.0.2 4.11.17 3.0.3 4.11.18 3.0.4 4.11.19 3.0.5 4.11.2 3.0.6 4.11.20 3.0.7 4.11.21 3.0.8 4.11.22 3.0.9 4.11.23 3.1.0 4.11.24 3.1.1 4.11.25 3.1.2 4.11.26 3.1.3 4.11.27 3.1.4 4.11.28 3.1.5 4.11.29 3.1.6 4.11.3 3.1.7 4.11.30 3.1.8 4.11.31 3.1.9 4.11.32 3.10.0 4.11.33 3.10.1 4.11.34 3.10.2 4.11.35 3.10.3 4.11.36 3.10.4 4.11.37 3.10.5 4.11.38 3.10.6 4.11.39 3.10.7 4.11.4 3.10.8 4.11.40 3.10.9 4.11.41 3.11.0 4.11.42 3.11.1 4.11.43 3.11.2 4.11.44 3.11.3 4.11.45 3.11.4 4.11.46 3.11.5 4.11.47 3.11.6 4.11.48 3.11.7 4.11.49 3.11.8 4.11.5 3.11.9 4.11.50 3.12.0 4.11.51 3.12.1 4.11.52 3.12.2 4.11.53 3.12.3 4.11.54 3.2.0 4.11.55 3.2.1 4.11.56 3.2.2 4.11.57 3.2.3 4.11.58 3.2.4 4.11.59 3.2.5 4.11.6 3.2.6 4.11.60 3.2.7 4.11.61 3.2.8 4.11.62 3.2.9 4.11.63 3.20.0 4.11.64 3.20.1 4.11.65 3.20.2 4.11.66 3.20.3 4.11.67 3.20.4 4.11.68
premium-addons-for-elementor / includes / pa-display-conditions / pa-controls-handler.php
premium-addons-for-elementor / includes / pa-display-conditions Last commit date
conditions 2 years ago lang-locale.php 2 years ago mobile-detector.php 2 years ago pa-controls-handler.php 2 years ago
pa-controls-handler.php
379 lines
1 <?php
2 /**
3 * PA Display Conditions::Control-Handler.
4 * Handles controls used in PA Display Conditions Addon.
5 */
6
7 namespace PremiumAddons\Includes;
8
9 use Elementor\Controls_Manager;
10 use Elementor\Repeater;
11
12 if ( ! defined( 'ABSPATH' ) ) {
13 exit; // Exit if accessed directly.
14 }
15
16 /**
17 * Class PA_Controls_Handler
18 *
19 * @since 4.7.0
20 */
21 class PA_Controls_Handler {
22
23 /**
24 * Contains Conditions Classes.
25 *
26 * @access public
27 * @var array condition classes
28 */
29 public static $conditions_classes = array();
30
31 /**
32 * Contains Conditions Keys.
33 *
34 * @access public
35 * @var array condition keys
36 */
37 public static $conditions_keys = array();
38
39 /**
40 * Holds all the conditions.
41 * Contains Conditions.
42 *
43 * @access public
44 * @var array condition.
45 */
46 public static $conditions = array();
47
48 /**
49 * Holds all the conditions.
50 *
51 * @since 4.7.0
52 * @access protected
53 * @var array condition results holder.
54 */
55 protected $conditions_results_holder = array();
56
57 /**
58 * Class Constructor.
59 */
60 public function __construct() {
61
62 $this->init_conditions();
63 $this->init_conditions_classes();
64
65 $is_edit_mode = \Elementor\Plugin::$instance->editor->is_edit_mode();
66
67 // Trigger should_rendr filters only on the frontend.
68 if ( ! $is_edit_mode ) {
69 $this->init_actions();
70 }
71 }
72
73 /**
74 * Initialize condition classes.
75 *
76 * @access public
77 * @since 4.7.0
78 */
79 public function init_conditions() {
80
81 static::$conditions = array(
82 'system' => array(
83 'label' => __( 'System', 'premium-addons-for-elementor' ),
84 'options' => array(
85 'browser' => __( 'Browser', 'premium-addons-for-elementor' ),
86 'device' => __( 'Device', 'premium-addons-for-elementor' ),
87 'operating_system' => __( 'Operating System', 'premium-addons-for-elementor' ),
88 ),
89 ),
90
91 'time' => array(
92 'label' => __( 'Date & Time', 'premium-addons-for-elementor' ),
93 'options' => array(
94 'day' => __( 'Day', 'premium-addons-for-elementor' ),
95 'date' => __( 'Date', 'premium-addons-for-elementor' ),
96 'date_range' => __( 'Date Range', 'premium-addons-for-elementor' ),
97 'time_range' => __( 'Time Range', 'premium-addons-for-elementor' ),
98 ),
99 ),
100
101 'userdata' => array(
102 'label' => __( 'User', 'premium-addons-for-elementor' ),
103 'options' => array(
104 'ip_location' => __( 'Location', 'premium-addons-for-elementor' ),
105 'login_status' => __( 'Login Status', 'premium-addons-for-elementor' ),
106 'user_role' => __( 'Role', 'premium-addons-for-elementor' ),
107 'return_visitor' => __( 'Returning Visitor', 'premium-addons-for-elementor' ),
108 ),
109 ),
110
111 'other' => array(
112 'label' => __( 'Other', 'premium-addons-for-elementor' ),
113 'options' => array(
114 'lang' => __( 'Site Language', 'premium-addons-for-elementor' ),
115 ),
116 ),
117
118 'postdata' => array(
119 'label' => __( 'Post/Page', 'premium-addons-for-elementor' ),
120 'options' => array(
121 'post' => __( 'Post', 'premium-addons-for-elementor' ),
122 'post_type' => __( 'Post Type', 'premium-addons-for-elementor' ),
123 'post_format' => __( 'Post Format', 'premium-addons-for-elementor' ),
124 'post_category' => __( 'Post Category', 'premium-addons-for-elementor' ),
125 'page' => __( 'Page', 'premium-addons-for-elementor' ),
126 'static_page' => __( 'Website Static Pages', 'premium-addons-for-elementor' ),
127 ),
128 ),
129
130 'urlparams' => array(
131 'label' => __( 'URL (PRO)', 'premium-addons-for-elementor' ),
132 'options' => array(
133 'url_string' => __( 'String in URL', 'premium-addons-for-elementor' ),
134 'url_referer' => __( 'URL Parameters', 'premium-addons-for-elementor' ),
135 ),
136 ),
137
138 'misc' => array(
139 'label' => __( 'Misc (PRO)', 'premium-addons-for-elementor' ),
140 'options' => array(
141 'shortcode' => __( 'Shortcode', 'premium-addons-for-elementor' ),
142 ),
143 ),
144
145 );
146 }
147
148 /**
149 * Initialize condition classes.
150 *
151 * @access public
152 * @since 4.7.0
153 */
154 public function init_conditions_classes() {
155
156 self::$conditions_keys = apply_filters(
157 'pa_display_conditions_keys',
158 array(
159 'browser',
160 'device',
161 'day',
162 'date',
163 'date_range',
164 'time_range',
165 'ip_location',
166 'lang',
167 'login_status',
168 'return_visitor',
169 'post',
170 'post_type',
171 'post_format',
172 'post_category',
173 'page',
174 'static_page',
175 'operating_system',
176 'user_role',
177 )
178 );
179
180 include_once PREMIUM_ADDONS_PATH . 'includes/pa-display-conditions/conditions/condition.php';
181
182 foreach ( self::$conditions_keys as $condition_key ) {
183
184 $file_name = str_replace( '_', '-', strtolower( $condition_key ) );
185
186 if ( file_exists( PREMIUM_ADDONS_PATH . 'includes/pa-display-conditions/conditions/' . $file_name . '.php' ) ) {
187 include_once PREMIUM_ADDONS_PATH . 'includes/pa-display-conditions/conditions/' . $file_name . '.php';
188 }
189
190 $class_name = str_replace( '-', ' ', $condition_key );
191 $class_name = str_replace( ' ', '', ucwords( $class_name ) );
192 $class_name = __NAMESPACE__ . '\PA_Display_Conditions\Conditions\\' . $class_name;
193
194 if ( class_exists( $class_name ) ) {
195 static::$conditions_classes[ $condition_key ] = new $class_name();
196 }
197 }
198 }
199
200 /**
201 * Set render function to action filter.
202 *
203 * @access public
204 * @since 4.7.0
205 */
206 public function init_actions() {
207
208 add_filter( 'elementor/frontend/widget/should_render', array( $this, 'should_render' ), 10, 2 );
209 add_filter( 'elementor/frontend/column/should_render', array( $this, 'should_render' ), 10, 2 );
210 add_filter( 'elementor/frontend/section/should_render', array( $this, 'should_render' ), 10, 2 );
211
212 add_filter( 'elementor/frontend/container/should_render', array( $this, 'should_render' ), 10, 2 );
213 }
214
215 /**
216 * Adds repeater source controls
217 *
218 * @since 4.7.0
219 * @access public
220 *
221 * @param object $repeater Elementor Repeater Object.
222 */
223 public function add_repeater_source_controls( $repeater ) {
224
225 $additional_ids = array( 'pa_condition_shortcode', 'pa_condition_acf_text', 'pa_condition_acf_boolean', 'pa_condition_acf_choice', 'pa_condition_woo_orders', 'pa_condition_woo_category', 'pa_condition_woo_total_price', 'pa_condition_time_range' );
226
227 foreach ( static::$conditions_classes as $condition_class_name => $condition_obj ) {
228
229 $control_id = 'pa_condition_' . $condition_class_name;
230
231 if ( in_array( $control_id, $additional_ids, true ) ) {
232 $repeater->add_control(
233 'pa_condition_val' . $condition_class_name,
234 $condition_obj->add_value_control()
235 );
236 }
237 }
238 }
239
240 /**
241 * Adds repeater compare controls
242 *
243 * @since 4.7.0
244 * @access public
245 *
246 * @param object $repeater Elementor Repeater Object.
247 */
248 public function add_repeater_compare_controls( $repeater ) {
249
250 foreach ( static::$conditions_classes as $condition_class_name => $condition_obj ) {
251
252 $control_id = 'pa_condition_' . $condition_class_name;
253
254 $repeater->add_control(
255 $control_id,
256 $condition_obj->get_control_options()
257 );
258
259 }
260 }
261
262 /**
263 * Determines whether the element content should be rendered.
264 *
265 * @param bool $should_render should render.
266 * @param object $element Elementor Repeater Object.
267 *
268 * @since 4.7.0
269 * @access public
270 */
271 public function should_render( $should_render, $element ) {
272
273 $settings = $element->get_settings();
274
275 if ( 'yes' === $settings['pa_display_conditions_switcher'] ) {
276
277 $element_id = $element->get_id();
278 $conditions_list = $settings['pa_condition_repeater'];
279 $action = $settings['pa_display_action'];
280
281 $this->store_condition_results( $settings, $element_id, $conditions_list );
282
283 return $this->check_visiblity( $element_id, $settings['pa_display_when'], $action );
284
285 }
286
287 return $should_render;
288 }
289
290 /**
291 * Store conditions results
292 *
293 * @since 4.7.0
294 * @access protected
295 *
296 * @param array $settings elements settings.
297 * @param string $element_id elements id.
298 * @param array $lists conditions.
299 */
300 protected function store_condition_results( $settings, $element_id, $lists = array() ) {
301
302 if ( ! $lists ) {
303 return;
304 }
305
306 foreach ( $lists as $key => $list ) {
307
308 if ( ! in_array( $list['pa_condition_key'], self::$conditions_keys, true ) ) {
309 continue;
310 }
311
312 $class = static::$conditions_classes[ $list['pa_condition_key'] ];
313 $operator = $list['pa_condition_operator'];
314 $item_key = 'pa_condition_' . $list['pa_condition_key'];
315 $value = isset( $list[ $item_key ] ) ? $list[ $item_key ] : '';
316
317 $compare_val = isset( $list[ 'pa_condition_val' . $list['pa_condition_key'] ] ) ? $list[ 'pa_condition_val' . $list['pa_condition_key'] ] : '';
318
319 if ( 'shortcode' !== $list['pa_condition_key'] ) {
320 $compare_val = esc_html( $compare_val );
321 }
322
323 $id = $item_key . '_' . $list['_id'];
324 $time_zone = in_array( $list['pa_condition_key'], array( 'date_range', 'time_range', 'date', 'day' ), true ) ? $list['pa_condition_timezone'] : false;
325
326 if ( 'ip_location' !== $list['pa_condition_key'] ) {
327
328 // If ACF Text or Time Range, comparison must triggered.
329 $check = ( in_array( $list['pa_condition_key'], array( 'time_range', 'acf_text' ) ) || '' !== $value ) ? $class->compare_value( $settings, $operator, $value, $compare_val, $time_zone ) : true;
330 } else {
331
332 $detect_method = $list['pa_condition_loc_method'];
333
334 $check = $class->compare_location( $settings, $operator, $value, $compare_val, $time_zone, $detect_method );
335
336 }
337
338 $this->conditions_results_holder[ $element_id ][ $id ] = $check;
339 }
340 }
341
342 /**
343 * Check Element Visibility
344 *
345 * @since 4.7.0
346 * @access public
347 *
348 * @param string $element_id element id.
349 * @param string $relation condition relation.
350 * @param string $action action to make if the conditions are met.
351 *
352 * @return bool
353 */
354 public function check_visiblity( $element_id, $relation, $action ) {
355 $result = true;
356
357 if ( ! array_key_exists( $element_id, $this->conditions_results_holder ) ) {
358 return;
359 }
360
361 if ( 'all' === $relation ) {
362
363 $result = in_array( false, $this->conditions_results_holder[ $element_id ], true ) ? false : true;
364 } else {
365
366 $result = in_array( true, $this->conditions_results_holder[ $element_id ], true ) ? true : false;
367 }
368
369 if ( ( 'show' === $action && $result ) || ( 'hide' === $action && false === $result ) ) {
370 $should_render = true;
371 } elseif ( ( 'show' === $action && false === $result ) || ( 'hide' === $action && $result ) ) {
372
373 $should_render = false;
374 }
375
376 return $should_render;
377 }
378 }
379