PluginProbe
UiCore Elements – Free widgets and templates for Elementor / 1.0.14
UiCore Elements – Free widgets and templates for Elementor v1.0.14
1.3.17 1.3.16 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 All 41 releases
uicore-elements / includes / widgets / newsletter.php

newsletter.php in UiCore Elements – Free widgets and templates for Elementor 1.0.14, at includes/widgets/newsletter.php

716 lines 26.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace UiCoreElements;
3
4
5 use UiCoreElements\Utils\Contact_Form_Service;
6 use UiCoreElements\Utils\Form_Component;
7 use Elementor\Controls_Manager;
8 use Elementor\Icons_Manager;
9 use Elementor\Utils;
10
11
12 defined('ABSPATH') || exit();
13
14 /**
15 * Newsletter
16 *
17 * @author Lucas Marini Falbo <lucas@uicore.co>
18 * @since 1.0.7
19 */
20
21 class Newsletter extends UiCoreWidget {
22
23 use Form_Component;
24
25 public function get_name() {
26 return 'uicore-newsletter';
27 }
28
29 public function get_title() {
30 return __( 'Newsletter', 'uicore-elements' );
31 }
32
33 public function get_icon() {
34 return 'eicon-form-horizontal ui-e-widget';
35 }
36 public function get_categories()
37 {
38 return ['uicore'];
39 }
40 public function get_keywords() {
41 return [ 'form', 'forms', 'newsletter', 'news', 'subscribe', 'subscription', 'mailchimp' ];
42 }
43 public function get_styles()
44 {
45 return ['newsletter'];
46 }
47 public function get_scripts()
48 {
49 return [
50 'contact-form',
51 'recaptcha' => [
52 'custom_condition' => $this->check_recaptcha_version('v2')
53 ],
54 'recaptcha-v3' => [
55 'custom_condition' => $this->check_recaptcha_version('v3')
56 ]
57 ];
58 }
59 function check_recaptcha_version($version)
60 {
61
62 if( $this->is_edit_mode() ){
63 return true;
64 }
65
66 return $version === $this->get_settings_for_display('recaptcha_version') ? true : false;
67 }
68
69 function form_fields_render_attributes( $i, $instance, $item ) {
70 $this->add_render_attribute(
71 [
72 'field-group' . $i => [
73 'class' => [
74 'ui-e-field-type-text',
75 'ui-e-field-group',
76 'elementor-column',
77 ],
78 ],
79 'honeypot' => [
80 'class' => [
81 'ui-e-field-type-address',
82 'ui-e-field-group',
83 'elementor-column',
84 ],
85 ],
86 'recaptcha' => [
87 'class' => [
88 'ui-e-field-type-recaptcha',
89 'ui-e-field-group',
90 'elementor-column',
91 'elementor-col-100'
92 ],
93 ],
94 'recaptcha_v3' => [
95 'class' => [
96 'ui-e-field-type-recaptcha_v3',
97 'ui-e-field-group',
98 'elementor-column',
99 'elementor-col-100'
100 ],
101 ],
102 'input' . $i => [
103 'type' => 'text',
104 'size' => '1',
105 'name' => 'form_fields[' . $item . ']',
106 'id' => 'form-fields-' . $item,
107 'class' => [
108 'ui-e-field',
109 empty( $instance[$item.'_css'] ) ? '' : esc_attr( $instance[$item.'_css'] ),
110 ],
111 ],
112 'label' . $i => [
113 'for' => 'form-field-' . $item,
114 'class' => 'ui-e-label',
115 ],
116 ]
117 );
118
119 if ( empty( $instance[$item . '_width'] ) ) {
120 $item['width'] = '100';
121 }
122
123 $this->add_render_attribute( 'field-group' . $i, 'class', 'elementor-col-' . $instance[$item . '_width'] );
124
125 if ( ! empty( $instance[$item . '_width_tablet'] ) ) {
126 $this->add_render_attribute( 'field-group' . $i, 'class', 'elementor-md-' . $instance[$item . '_width_tablet'] );
127 }
128
129 if ( ! empty( $instance[$item . '_width_mobile'] ) ) {
130 $this->add_render_attribute( 'field-group' . $i, 'class', 'elementor-sm-' . $instance[$item . '_width_mobile'] );
131 }
132
133 // Allow zero as placeholder.
134 if ( ! Utils::is_empty( $instance[$item . '_placeholder'] ) ) {
135 $this->add_render_attribute( 'input' . $i, 'placeholder', $instance[$item . '_placeholder'] );
136 }
137
138 if ( ! $instance['show_labels'] ) {
139 $this->add_render_attribute( 'label' . $i, 'class', 'elementor-screen-only' );
140 }
141
142 if ( ! empty( $instance[$item . '_required'] ) ) {
143 if ( ! empty( $instance['mark_required'] ) ) {
144 $this->add_render_attribute( 'field-group' . $i,
145 [
146 'class' => 'ui-e-required',
147 'required' => 'required',
148 ]
149 );
150 }
151 }
152 }
153
154 protected function register_controls() {
155
156 $this->start_controls_section(
157 'section_form_settings',
158 [
159 'label' => esc_html__( 'Form Settings', 'uicore-elements' ),
160 ]
161 );
162
163 $this->add_control(
164 'form_name',
165 [
166 'label' => esc_html__( 'Form Name', 'uicore-elements' ),
167 'type' => Controls_Manager::TEXT,
168 'default' => esc_html__( 'New Form', 'uicore-elements' ),
169 'placeholder' => esc_html__( 'Form Name', 'uicore-elements' ),
170 ]
171 );
172 $this->add_control(
173 'show_labels',
174 [
175 'label' => esc_html__( 'Label', 'uicore-elements' ),
176 'type' => Controls_Manager::SWITCHER,
177 'label_on' => esc_html__( 'Show', 'uicore-elements' ),
178 'label_off' => esc_html__( 'Hide', 'uicore-elements' ),
179 'return_value' => 'true',
180 'default' => 'true',
181 ]
182 );
183 $this->add_control(
184 'mark_required',
185 [
186 'label' => esc_html__( 'Required Mark', 'uicore-elements' ),
187 'type' => Controls_Manager::SWITCHER,
188 'label_on' => esc_html__( 'Show', 'uicore-elements' ),
189 'label_off' => esc_html__( 'Hide', 'uicore-elements' ),
190 'default' => '',
191 'render_type' => 'template',
192 'condition' => [
193 'show_labels!' => '',
194 ],
195 ]
196 );
197 $this->end_controls_section();
198
199 $this->start_controls_section(
200 'section_form_fields',
201 [
202 'label' => esc_html__( 'Fields', 'uicore-elements' ),
203 ]
204 );
205
206 $this->add_control(
207 'add_name',
208 [
209 'label' => esc_html__( 'Name', 'uicore-elements' ),
210 'type' => Controls_Manager::SWITCHER,
211 'return_value' => 'true',
212 'default' => 'true',
213 ]
214 );
215 $this->add_control(
216 'add_recaptcha',
217 [
218 'label' => esc_html__( 'Recaptcha', 'uicore-elements' ),
219 'type' => Controls_Manager::SWITCHER,
220 'return_value' => 'true',
221 ]
222 );
223 $this->add_control(
224 'add_honeypot',
225 [
226 'label' => esc_html__( 'Honeypot', 'uicore-elements' ),
227 'type' => Controls_Manager::SWITCHER,
228 'description' => esc_html__('Adds a hidden field to trap and identify bots by capturing automated form submissions.', 'uicore-elements'),
229 'return_value' => 'true',
230 'default' => 'true',
231 ]
232 );
233
234 $this->start_controls_tabs( 'form_fields_tabs' );
235
236 $this->start_controls_tab(
237 'email_tab',
238 [
239 'label' => esc_html__( 'E-mail', 'uicore-elements' ),
240 ]
241 );
242
243 $this->add_control(
244 'email_label',
245 [
246 'label' => esc_html__( 'Label', 'uicore-elements' ),
247 'type' => Controls_Manager::TEXT,
248 'default' => '',
249 'dynamic' => [
250 'active' => true,
251 ],
252 ]
253 );
254 $this->add_control(
255 'email_placeholder',
256 [
257 'label' => esc_html__( 'Placeholder', 'uicore-elements' ),
258 'type' => Controls_Manager::TEXT,
259 'default' => esc_html__('Your e-mail', 'uicore-elements'),
260 'dynamic' => [
261 'active' => true,
262 ],
263 ]
264 );
265 $this->add_control(
266 'email_required',
267 [
268 'label' => esc_html__( 'Required', 'uicore-elements' ),
269 'type' => Controls_Manager::SWITCHER,
270 'return_value' => 'true',
271 'default' => '',
272 ]
273 );
274 $this->add_responsive_control(
275 'email_width',
276 [
277 'label' => esc_html__( 'Column Width', 'uicore-elements' ),
278 'type' => Controls_Manager::SELECT,
279 'options' => $this->TRAIT_get_width_values(),
280 'default' => '40',
281 ]
282 );
283 $this->add_control(
284 'email_css',
285 [
286 'label' => esc_html__( 'Custom Class', 'uicore-elements' ),
287 'type' => Controls_Manager::TEXT,
288 'default' => '',
289 'ai' => [
290 'active' => false,
291 ],
292 'separator' => 'before',
293 'placeholder' => esc_html__( 'e.g: my-class', 'uicore-elements' ),
294 ]
295 );
296 $this->add_control(
297 'email_shortcode',
298 [
299 'label' => esc_html__( 'Shortcode', 'uicore-elements' ),
300 'type' => Controls_Manager::RAW_HTML,
301 'classes' => 'forms-field-shortcode',
302 'raw' => '<input class="elementor-form-field-shortcode" value=\'[field id="email"]\' readonly />',
303 ]
304 );
305
306 $this->end_controls_tab();
307
308 $this->start_controls_tab(
309 'name_tab',
310 [
311 'label' => esc_html__( 'Name', 'uicore-elements' ),
312 'condition' => [
313 'add_name' => 'true',
314 ],
315 ]
316 );
317
318 $this->add_control(
319 'name_label',
320 [
321 'label' => esc_html__( 'Label', 'uicore-elements' ),
322 'type' => Controls_Manager::TEXT,
323 'default' => '',
324 'dynamic' => [
325 'active' => true,
326 ],
327 ]
328 );
329 $this->add_control(
330 'name_placeholder',
331 [
332 'label' => esc_html__( 'Placeholder', 'uicore-elements' ),
333 'type' => Controls_Manager::TEXT,
334 'default' => esc_html__('Your name', 'uicore-elements'),
335 'dynamic' => [
336 'active' => true,
337 ],
338 ]
339 );
340 $this->add_control(
341 'name_required',
342 [
343 'label' => esc_html__( 'Required', 'uicore-elements' ),
344 'type' => Controls_Manager::SWITCHER,
345 'return_value' => 'true',
346 'default' => '',
347 ]
348 );
349 $this->add_responsive_control(
350 'name_width',
351 [
352 'label' => esc_html__( 'Column Width', 'uicore-elements' ),
353 'type' => Controls_Manager::SELECT,
354 'options' => $this->TRAIT_get_width_values(),
355 'default' => '40',
356 ]
357 );
358 $this->add_control(
359 'name_css',
360 [
361 'label' => esc_html__( 'Custom Class', 'uicore-elements' ),
362 'type' => Controls_Manager::TEXT,
363 'default' => '',
364 'ai' => [
365 'active' => false,
366 ],
367 'separator' => 'before',
368 'placeholder' => esc_html__( 'e.g: my-class', 'uicore-elements' ),
369 ]
370 );
371 $this->add_control(
372 'name_shortcode',
373 [
374 'label' => esc_html__( 'Shortcode', 'uicore-elements' ),
375 'type' => Controls_Manager::RAW_HTML,
376 'classes' => 'forms-field-shortcode',
377 'raw' => '<input class="elementor-form-field-shortcode" value=\'[field id="name"]\' readonly />',
378 ]
379 );
380
381 $this->end_controls_tab();
382
383 $this->start_controls_tab(
384 'recaptcha_tab',
385 [
386 'label' => esc_html__( 'Recaptcha', 'uicore-elements' ),
387 'condition' => [
388 'add_recaptcha' => 'true',
389 ],
390 ]
391 );
392
393 $this->add_control(
394 'recaptcha_version',
395 [
396 'label' => esc_html__( 'Recaptcha Version', 'uicore-elements' ),
397 'type' => Controls_Manager::SELECT,
398 'options' => [
399 'v2' => 'V2',
400 'v3' => 'V3',
401 ],
402 'default' => 'v2',
403 ]
404 );
405 $this->add_control(
406 'recaptcha_hide',
407 [
408 'label' => esc_html__( 'Badge', 'uicore-elements' ),
409 'type' => Controls_Manager::SELECT,
410 'default' => 'hidden',
411 'options' => [
412 'hidden' => esc_html__( 'Hidden', 'uicore-elements' ),
413 'visible' => esc_html__( 'Visible', 'uicore-elements' )
414 ],
415 'condition' => [
416 'recaptcha_version' => 'v3',
417 ],
418 'selectors' => [
419 '.grecaptcha-badge' => 'visibility: {{VALUE}};',
420 ],
421 ]
422 );
423 $recaptcha_keys = (!get_option('uicore_elements_recaptcha_secret_key') && !get_option('uicore_elements_recaptcha_site_key')) ? true : false; // Check if recaptcha API keys were set
424 $this->add_control(
425 'recaptcha_warning',
426 [
427 'type' => Controls_Manager::ALERT,
428 'alert_type' => 'warning',
429 'dismissible' => false,
430 'heading' => esc_html__("You haven't set your reCAPTCHA API keys yet.", 'uicore-elements'),
431 'content' => Helper::get_admin_settings_url( esc_html__("Click here to configure your API keys.", 'uicore-elements' ) ),
432 'condition' => [
433 'add_recaptcha' => $recaptcha_keys ? 'true' : [],
434 ]
435 ]
436 );
437
438 $this->end_controls_tab();
439
440 $this->end_controls_tabs();
441
442 $this->end_controls_section();
443
444 $this->start_controls_section(
445 'section_buttons',
446 [
447 'label' => esc_html__( 'Button', 'uicore-elements' ),
448 ]
449 );
450
451 $this->TRAIT_register_button_controls('Subscribe');
452
453 $this->end_controls_section();
454
455 $this->start_controls_section(
456 'section_actions',
457 [
458 'label' => esc_html__( 'Actions After Submit', 'uicore-elements' ),
459 ]
460 );
461
462 $this->add_control(
463 'submit_actions',
464 [
465 'label' => esc_html__( 'Submit Actions', 'uicore-elements' ),
466 'type' => Controls_Manager::SELECT2,
467 'label_block' => true,
468 'multiple' => true,
469 'options' => [
470 'email' => esc_html__( 'Email', 'uicore-elements' ),
471 'email_2' => esc_html__( 'Email 2', 'uicore-elements' ),
472 'redirect' => esc_html__( 'Redirect', 'uicore-elements' ),
473 'mailchimp' => esc_html__( 'MailChimp', 'uicore-elements' ),
474 ],
475 'default' => [ 'email' ],
476 ]
477 );
478
479 $this->end_controls_section();
480
481 // Submit sections
482 $this->start_controls_section(
483 'section_email',
484 [
485 'label' => esc_html__( 'Email', 'uicore-elements' ),
486 'condition' => [
487 'submit_actions' => 'email',
488 ],
489 ]
490 );
491
492 $this->TRAIT_register_submit_email_controls($this);
493
494 $this->end_controls_section();
495
496 $this->start_controls_section(
497 'section_email_2',
498 [
499 'label' => esc_html__( 'Email 2', 'uicore-elements' ),
500 'condition' => [
501 'submit_actions' => 'email_2',
502 ],
503 ]
504 );
505
506 $this->TRAIT_register_submit_email_controls($this, '_2');
507
508 $this->end_controls_section();
509
510 $this->start_controls_section(
511 'section_redirect',
512 [
513 'label' => esc_html__( 'Redirect', 'uicore-elements' ),
514 'condition' => [
515 'submit_actions' => 'redirect',
516 ],
517 ]
518 );
519
520 $this->TRAIT_register_submit_redirect_controls();
521
522 $this->end_controls_section();
523
524 $this->start_controls_section(
525 'mailchimp_redirect',
526 [
527 'label' => esc_html__( 'Mailchimp', 'uicore-elements' ),
528 'condition' => [
529 'submit_actions' => 'mailchimp',
530 ],
531 ]
532 );
533
534 $this->TRAIT_register_submit_mailchimp_controls();
535
536 $this->end_controls_section();
537
538 $this->start_controls_section(
539 'section_form_options',
540 [
541 'label' => esc_html__( 'Additional Options', 'uicore-elements' ),
542 'tab' => Controls_Manager::TAB_CONTENT,
543 ]
544 );
545
546 $this->TRAIT_register_additional_controls( Contact_Form_Service::get_default_messages() );
547
548 $this->end_controls_section();
549
550 $this->TRAIT_register_all_form_style_controls();
551 }
552
553 protected function render() {
554
555 $instance = $this->get_settings_for_display();
556 $is_recaptcha_required = false;
557
558 // Save widget settings so form API can retrieve them
559 set_transient('ui_e_form_widget_settings_' . $this->get_id(), $instance, DAY_IN_SECONDS);
560
561 // Render Form and Fields Atts
562 $this->add_render_attribute(
563 [
564 'wrapper' => [
565 'class' => [
566 'ui-e-fields-wrp',
567 ],
568 ],
569 'submit-group' => [
570 'class' => [
571 'ui-e-field-group',
572 'elementor-column',
573 'ui-e-field-type-submit',
574 ],
575 ],
576 'button' => [
577 'class' => 'elementor-button',
578 ],
579 'icon-align' => [
580 'class' => [
581 empty( $instance['button_icon_align'] ) ? '' : 'ui-e-icon ui-e-align-' . $instance['button_icon_align'],
582 ],
583 ],
584 ]
585 );
586 if($instance['add_name'] == 'true') {
587 $this->form_fields_render_attributes( '_name', $instance, 'name' );
588 }
589 $this->form_fields_render_attributes( '_email', $instance, 'email' );
590
591 // Fallback for empty control values
592 if ( empty( $instance['button_width'] ) ) {
593 $instance['button_width'] = '100';
594 }
595
596 // Button atts
597 $this->add_render_attribute( 'submit-group', 'class', 'elementor-col-' . $instance['button_width'] . ' e-form__buttons' );
598
599 if ( ! empty( $instance['button_width_tablet'] ) ) {
600 $this->add_render_attribute( 'submit-group', 'class', 'elementor-md-' . $instance['button_width_tablet'] );
601 }
602 if ( ! empty( $instance['button_width_mobile'] ) ) {
603 $this->add_render_attribute( 'submit-group', 'class', 'elementor-sm-' . $instance['button_width_mobile'] );
604 }
605 if ( $instance['button_hover_animation'] ) {
606 $this->add_render_attribute( 'button', 'class', 'elementor-animation-' . $instance['button_hover_animation'] );
607 }
608
609 // Form atts
610 if ( ! empty( $instance['form_id'] ) ) {
611 $this->add_render_attribute( 'form', 'id', $instance['form_id'] );
612 }
613 if ( ! empty( $instance['form_name'] ) ) {
614 $this->add_render_attribute( 'form', 'name', $instance['form_name'] );
615 }
616 if ( 'no' === $instance['form_validation'] ) {
617 $this->add_render_attribute( 'form', 'novalidate' );
618 }
619 if ( ! empty( $instance['button_css_id'] ) ) {
620 $this->add_render_attribute( 'button', 'id', $instance['button_css_id'] );
621 }
622
623 // Basic settings
624 $print_label = $instance['show_labels'] == 'true';
625 ?>
626
627 <form class="ui-e-form" method="post" <?php $this->print_render_attribute_string( 'form' ); ?>>
628
629 <input type="hidden" name="widget_id" value="<?php echo esc_attr( $this->get_id() ); ?>"/>
630 <input type="hidden" name="widget_type" value="newsletter">
631
632 <div <?php $this->print_render_attribute_string( 'wrapper' ); ?>>
633
634 <?php if($instance['add_name'] == 'true') : ?>
635 <div <?php $this->print_render_attribute_string( 'field-group_name'); ?>>
636 <?php if ( $print_label && $instance['name_label'] ) : ?>
637 <label <?php $this->print_render_attribute_string( 'label_name' ); ?>>
638 <?php echo esc_html($instance['name_label']);?>
639 </label>
640 <?php endif; ?>
641 <input <?php $this->print_render_attribute_string( 'input_name'); ?>>
642 </div>
643 <?php endif; ?>
644
645 <div <?php $this->print_render_attribute_string( 'field-group_email'); ?>>
646 <?php if ( $print_label && $instance['email_label'] ) : ?>
647 <label <?php $this->print_render_attribute_string( 'label_email' ); ?>>
648 <?php echo esc_html($instance['email_label']);?>
649 </label>
650 <?php endif; ?>
651 <input <?php $this->print_render_attribute_string( 'input_email'); ?>>
652 </div>
653
654 <?php if($instance['add_honeypot'] == 'true') : ?>
655 <div <?php $this->print_render_attribute_string( 'honeypot'); ?>>
656 <label for="form-field-address" class="ui-e-label">
657 <?php echo esc_html__( 'Address', 'uicore-elements' ); ?>
658 </label>
659 <input class="ui-e-field ui-e-h-p" name="ui-e-h-p" id="ui-e-h-p" tabindex="-1" autocomplete="off">
660 </div>
661 <?php endif; ?>
662
663 <div <?php $this->print_render_attribute_string( 'submit-group' ); ?>>
664 <button type="submit" <?php $this->print_render_attribute_string( 'button' ); ?>>
665 <span <?php $this->print_render_attribute_string( 'content-wrapper' ); ?>>
666 <?php if ( ! empty( $instance['button_icon'] ) || ! empty( $instance['selected_button_icon'] ) ) : ?>
667 <span <?php $this->print_render_attribute_string( 'icon-align' ); ?>>
668 <?php Icons_Manager::render_icon( $instance['selected_button_icon'], [ 'aria-hidden' => 'true' ] ); ?>
669 <?php if ( empty( $instance['button_text'] ) ) : ?>
670 <span class="elementor-screen-only"><?php echo esc_html__( 'Submit', 'uicore-elements' ); ?></span>
671 <?php endif; ?>
672 </span>
673 <?php endif; ?>
674 <?php if ( ! empty( $instance['button_text'] ) ) : ?>
675 <span class="ui-e-text"><?php $this->print_unescaped_setting( 'button_text' ); ?></span>
676 <?php endif; ?>
677 </span>
678 </button>
679 </div>
680
681 <?php
682 if($instance['add_recaptcha'] == 'true') :
683 $recaptcha_type = $instance['recaptcha_version'] === 'v2' ? 'recaptcha' : 'recaptcha_v3';
684 $is_recaptcha_required = true;
685 ?>
686 <div <?php $this->print_render_attribute_string($recaptcha_type); ?>>
687 <input type="hidden" name="<?php echo esc_attr($recaptcha_type);?>">
688 <?php if($instance['recaptcha_version'] == 'v2') : ?>
689 <div id="ui-e-recaptcha-<?php echo esc_attr( $this->get_ID() ); ?>"></div>
690 <?php endif; ?>
691 </div>
692 <?php endif; ?>
693
694 </div>
695
696 <div class="ui-e-message <?php echo $this->is_edit_mode() ? 'elementor-hidden' : ''; ?>">
697 <?php if($this->is_edit_mode()) :
698 // Get custom messages if set, else use default
699 $messages = Contact_Form_Service::get_default_messages();
700 $success = isset($instance['success_message']) ? $instance['success_message'] : $messages['success'];
701 $error = isset($instance['error_message']) ? $instance['error_message'] : $messages['error'];
702 ?>
703 <span class="success"> <?php echo esc_html($success);?> </span> <br>
704 <span class="error"> <?php echo esc_html($error);?> </span>
705 <?php endif; ?>
706 </div>
707 </form>
708 <?php
709
710 //add js to footer if recaptcha is enabled
711 if($is_recaptcha_required){
712 add_action('wp_footer', [$this, 'TRAIT_recaptcha_key_js'], 999);
713 }
714 }
715 }
716 \Elementor\Plugin::instance()->widgets_manager->register(new Newsletter());