PluginProbe ʕ •ᴥ•ʔ
Premium Addons for Elementor – Powerful Elementor Templates & Widgets / 4.10.10
Premium Addons for Elementor – Powerful Elementor Templates & Widgets v4.10.10
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
381 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 /**
75 * Initialize condition classes.
76 *
77 * @access public
78 * @since 4.7.0
79 */
80 public function init_conditions() {
81
82 static::$conditions = array(
83 'system' => array(
84 'label' => __( 'System', 'premium-addons-for-elementor' ),
85 'options' => array(
86 'browser' => __( 'Browser', 'premium-addons-for-elementor' ),
87 'device' => __( 'Device', 'premium-addons-for-elementor' ),
88 'operating_system' => __( 'Operating System', 'premium-addons-for-elementor' ),
89 ),
90 ),
91
92 'time' => array(
93 'label' => __( 'Date & Time', 'premium-addons-for-elementor' ),
94 'options' => array(
95 'day' => __( 'Day', 'premium-addons-for-elementor' ),
96 'date' => __( 'Date', 'premium-addons-for-elementor' ),
97 'date_range' => __( 'Date Range', 'premium-addons-for-elementor' ),
98 'time_range' => __( 'Time Range', 'premium-addons-for-elementor' ),
99 ),
100 ),
101
102 'userdata' => array(
103 'label' => __( 'User', 'premium-addons-for-elementor' ),
104 'options' => array(
105 'ip_location' => __( 'Location', 'premium-addons-for-elementor' ),
106 'login_status' => __( 'Login Status', 'premium-addons-for-elementor' ),
107 'user_role' => __( 'Role', 'premium-addons-for-elementor' ),
108 'return_visitor' => __( 'Returning Visitor', 'premium-addons-for-elementor' ),
109 ),
110 ),
111
112 'other' => array(
113 'label' => __( 'Other', 'premium-addons-for-elementor' ),
114 'options' => array(
115 'lang' => __( 'Site Language', 'premium-addons-for-elementor' ),
116 ),
117 ),
118
119 'postdata' => array(
120 'label' => __( 'Post/Page', 'premium-addons-for-elementor' ),
121 'options' => array(
122 'post' => __( 'Post', 'premium-addons-for-elementor' ),
123 'post_type' => __( 'Post Type', 'premium-addons-for-elementor' ),
124 'post_format' => __( 'Post Format', '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 /**
150 * Initialize condition classes.
151 *
152 * @access public
153 * @since 4.7.0
154 */
155 public function init_conditions_classes() {
156
157 self::$conditions_keys = apply_filters(
158 'pa_display_conditions_keys',
159 array(
160 'browser',
161 'device',
162 'day',
163 'date',
164 'date_range',
165 'time_range',
166 'ip_location',
167 'lang',
168 'login_status',
169 'return_visitor',
170 'post',
171 'post_type',
172 'post_format',
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 /**
292 * Store conditions results
293 *
294 * @since 4.7.0
295 * @access protected
296 *
297 * @param array $settings elements settings.
298 * @param string $element_id elements id.
299 * @param array $lists conditions.
300 */
301 protected function store_condition_results( $settings, $element_id, $lists = array() ) {
302
303 if ( ! $lists ) {
304 return;
305 }
306
307 foreach ( $lists as $key => $list ) {
308
309 if ( ! in_array( $list['pa_condition_key'], self::$conditions_keys, true ) ) {
310 continue;
311 }
312
313 $class = static::$conditions_classes[ $list['pa_condition_key'] ];
314 $operator = $list['pa_condition_operator'];
315 $item_key = 'pa_condition_' . $list['pa_condition_key'];
316 $value = isset( $list[ $item_key ] ) ? $list[ $item_key ] : '';
317
318 $compare_val = isset( $list[ 'pa_condition_val' . $list['pa_condition_key'] ] ) ? $list[ 'pa_condition_val' . $list['pa_condition_key'] ] : '';
319
320 if ( 'shortcode' !== $list['pa_condition_key'] ) {
321 $compare_val = esc_html( $compare_val );
322 }
323
324 $id = $item_key . '_' . $list['_id'];
325 $time_zone = in_array( $list['pa_condition_key'], array( 'date_range', 'time_range', 'date', 'day' ), true ) ? $list['pa_condition_timezone'] : false;
326
327 if ( 'ip_location' !== $list['pa_condition_key'] ) {
328
329 // If ACF Text or Time Range, comparison must triggered.
330 $check = ( in_array( $list['pa_condition_key'], array( 'time_range', 'acf_text' ) ) || '' !== $value ) ? $class->compare_value( $settings, $operator, $value, $compare_val, $time_zone ) : true;
331 } else {
332
333 $detect_method = $list['pa_condition_loc_method'];
334
335 $check = $class->compare_location( $settings, $operator, $value, $compare_val, $time_zone, $detect_method );
336
337 }
338
339 $this->conditions_results_holder[ $element_id ][ $id ] = $check;
340 }
341 }
342
343 /**
344 * Check Element Visibility
345 *
346 * @since 4.7.0
347 * @access public
348 *
349 * @param string $element_id element id.
350 * @param string $relation condition relation.
351 * @param string $action action to make if the conditions are met.
352 *
353 * @return bool
354 */
355 public function check_visiblity( $element_id, $relation, $action ) {
356 $result = true;
357
358 if ( ! array_key_exists( $element_id, $this->conditions_results_holder ) ) {
359 return;
360 }
361
362 if ( 'all' === $relation ) {
363
364 $result = in_array( false, $this->conditions_results_holder[ $element_id ], true ) ? false : true;
365 } else {
366
367 $result = in_array( true, $this->conditions_results_holder[ $element_id ], true ) ? true : false;
368 }
369
370 if ( ( 'show' === $action && $result ) || ( 'hide' === $action && false === $result ) ) {
371 $should_render = true;
372 } elseif ( ( 'show' === $action && false === $result ) || ( 'hide' === $action && $result ) ) {
373
374 $should_render = false;
375 }
376
377 return $should_render;
378 }
379
380 }
381