PluginProbe
E2Pdf – Export Pdf Tool for WordPress / 1.32.53
E2Pdf – Export Pdf Tool for WordPress v1.32.53
1.32.53 1.32.51 1.32.49 1.32.48 1.32.43 1.32.40 1.32.34 1.32.32 1.32.31 1.32.26 1.32.22 1.32.23 1.32.18 1.32.17 1.32.15 trunk 1.00.00 1.00.13 1.01.01 1.02.02 1.03.07 1.04.07 1.05.03 1.06.02 1.07.11 All 74 releases
← All changes | classes/extension/e2pdf-divi.php +1267 -541 1.32.23 → 1.32.53 View file →
@@ -1,13 +1,12 @@
1 1 <?php
2 2
3 3 /**
4 - * E2Pdf Divi Extension
5 - * @copyright Copyright 2017 https://e2pdf.com
6 - * @license GPLv3
7 - * @version 1
8 - * @link https://e2pdf.com
9 - * @since 0.00.01
4 + * File: /extension/e2pdf-divi.php
5 + *
6 + * @package E2Pdf
7 + * @license GPLv3
8 + * @link https://e2pdf.com
10 9 */
11 10 if (!defined('ABSPATH')) {
12 11 die('Access denied.');
13 12 }
@@ -14,12 +13,12 @@
14 13
15 14 class Extension_E2pdf_Divi extends Model_E2pdf_Model {
16 15
17 16 private $options;
18 - private $info = array(
17 + private $info = [
19 18 'key' => 'divi',
20 19 'title' => 'Divi Forms',
21 - );
20 + ];
22 21
23 22 // info
24 23 public function info($key = false) {
25 24 if ($key && isset($this->info[$key])) {
@@ -24,11 +23,11 @@
24 23 public function info($key = false) {
25 24 if ($key && isset($this->info[$key])) {
26 25 return $this->info[$key];
27 26 } else {
28 - return array(
27 + return [
29 28 $this->info['key'] => $this->info['title'],
30 - );
29 + ];
31 30 }
32 31 }
33 32
34 33 // active
@@ -57,78 +56,109 @@
57 56 $entry = new Model_E2pdf_Dataset();
58 57 if ($entry->load($this->get('dataset'), $this->get('item'), 'divi')) {
59 58 $cached_entry = $entry->get('entry');
60 59 $this->set('cached_entry', $cached_entry);
61 - $processed_fields_values = [];
60 +
61 + $meta_data = [];
62 62 if ($cached_entry && is_array($cached_entry)) {
63 - $et_contact_proccess = array_search('et_contact_proccess', $cached_entry);
64 - $et_pb_contact_form_num = $et_contact_proccess === false ? 0 : str_replace('et_pb_contactform_submit_', '', $et_contact_proccess);
65 - $current_form_fields = isset($cached_entry['et_pb_contact_email_fields_' . $et_pb_contact_form_num]) ? $cached_entry['et_pb_contact_email_fields_' . $et_pb_contact_form_num] : '';
66 - if ('' !== $current_form_fields) {
67 - $fields_data_json = str_replace('\\', '', $current_form_fields);
68 - $fields_data_array = json_decode($fields_data_json, true);
69 - if (!empty($fields_data_array)) {
70 - foreach ($fields_data_array as $index => $field_value) {
71 - $processed_fields_values[$field_value['original_id']]['value'] = isset($cached_entry[$field_value['field_id']]) ? $cached_entry[$field_value['field_id']] : '';
72 - $processed_fields_values[$field_value['original_id']]['label'] = $field_value['field_label'];
73 - if (
74 - (
75 - (isset($cached_entry[$field_value['field_id'] . '_is_signature_pad']) && $cached_entry[$field_value['field_id'] . '_is_signature_pad'] == 'yes') ||
76 - (isset($cached_entry[$field_value['field_id'] . '_is_file']) && $cached_entry[$field_value['field_id'] . '_is_file'] == 'yes')
77 - ) && $processed_fields_values[$field_value['original_id']]['value']
78 - ) {
79 - $subdir = isset($cached_entry['_subdir']) ? $cached_entry['_subdir'] : '';
80 - if (isset($cached_entry['_save_files_to_media']) && $cached_entry['_save_files_to_media'] == 'on') {
81 - if ($subdir && !file_exists(path_join(wp_upload_dir()['basedir'] . $subdir, $processed_fields_values[$field_value['original_id']]['value'])) && preg_match('/^\/\d{4}\/\d{2}$/', $subdir)) {
82 - $tmpsubdir = '/' . date('Y/m', strtotime(str_replace('/', '-', ltrim($subdir, '/')) . ' -1 month'));
83 - if (file_exists(path_join(wp_upload_dir()['basedir'] . $tmpsubdir, $processed_fields_values[$field_value['original_id']]['value']))) {
84 - $subdir = $tmpsubdir;
85 - }
63 + // Divi5
64 + if (!empty($cached_entry['E2PDF_VERSION'])) {
65 + foreach ($cached_entry['fields'] as $field_key => $field) {
66 + if (isset($field['type'])) {
67 + switch ($field['type']) {
68 + case 'signature-pad':
69 + $meta_data['%%' . $field_key . '%%'] = $this->pwh_dcfh_resolve_file_url($field['value'], $cached_entry['options']);
70 + break;
71 + case 'file':
72 + $attachments = is_array($field['value']) ? $field['value'] : explode(',', $field['value']);
73 + foreach ($attachments as $attachment_key => $attachment) {
74 + $attachments[$attachment_key] = $this->pwh_dcfh_resolve_file_url($attachment, $cached_entry['options']);
86 75 }
87 - $processed_fields_values[$field_value['original_id']]['value'] = path_join(wp_upload_dir()['baseurl'] . $subdir, $processed_fields_values[$field_value['original_id']]['value']);
88 - } else {
89 - $contact_form_id = isset($cached_entry['_unique_id']) ? $cached_entry['_unique_id'] : '';
90 - if (function_exists('pwh_dcfh_file_helpers') && $contact_form_id) {
91 - if ($subdir && !file_exists(pwh_dcfh_file_helpers()::get_form_upload_dir($contact_form_id, $subdir, $processed_fields_values[$field_value['original_id']]['value'])) && preg_match('/^\d{4}\/\d{2}$/', $subdir)) {
92 - $tmpsubdir = date('Y/m', strtotime(str_replace('/', '-', ltrim($subdir, '/')) . " -1 month"));
93 - if (file_exists(pwh_dcfh_file_helpers()::get_form_upload_dir($contact_form_id, $tmpsubdir, $processed_fields_values[$field_value['original_id']]['value']))) {
76 + $meta_data['%%' . $field_key . '%%'] = implode(',', $attachments);
77 + break;
78 + default:
79 + $meta_data['%%' . $field_key . '%%'] = is_array($field['value']) ? implode(', ', $field['value']) : $field['value'];
80 + break;
81 + }
82 + }
83 + }
84 + } elseif (!empty($cached_entry['ET_CORE_VERSION'])) {
85 + foreach ($cached_entry as $field_key => $value) {
86 + $meta_data['%%' . $field_key . '%%'] = is_array($value) ? implode(', ', $value) : $value;
87 + }
88 + if (!isset($meta_data['%%e2pdf_entry_id%%'])) {
89 + $meta_data['%%e2pdf_entry_id%%'] = (int) $this->get('dataset');
90 + }
91 + } else {
92 + // Divi4
93 + $processed_fields_values = [];
94 + $et_contact_proccess = array_search('et_contact_proccess', $cached_entry);
95 + $et_pb_contact_form_num = $et_contact_proccess === false ? 0 : str_replace('et_pb_contactform_submit_', '', $et_contact_proccess);
96 + $current_form_fields = isset($cached_entry['et_pb_contact_email_fields_' . $et_pb_contact_form_num]) ? $cached_entry['et_pb_contact_email_fields_' . $et_pb_contact_form_num] : '';
97 + if ('' !== $current_form_fields) {
98 + $fields_data_json = str_replace('\\', '', $current_form_fields);
99 + $fields_data_array = json_decode($fields_data_json, true);
100 + if (!empty($fields_data_array)) {
101 + foreach ($fields_data_array as $field_value) {
102 + $processed_fields_values[$field_value['original_id']]['value'] = isset($cached_entry[$field_value['field_id']]) ? $cached_entry[$field_value['field_id']] : '';
103 + $processed_fields_values[$field_value['original_id']]['label'] = $field_value['field_label'];
104 +
105 + $is_file = isset($cached_entry[$field_value['field_id'] . '_is_file']) && $cached_entry[$field_value['field_id'] . '_is_file'] == 'yes';
106 + $is_signature_pad = isset($cached_entry[$field_value['field_id'] . '_is_signature_pad']) && $cached_entry[$field_value['field_id'] . '_is_signature_pad'] == 'yes';
107 +
108 + if (($is_signature_pad || $is_file) && $processed_fields_values[$field_value['original_id']]['value']) {
109 + $subdir = isset($cached_entry['_subdir']) ? $cached_entry['_subdir'] : '';
110 + if (isset($cached_entry['_save_files_to_media']) && $cached_entry['_save_files_to_media'] == 'on') {
111 + if ($subdir && !file_exists(path_join(wp_upload_dir()['basedir'] . $subdir, $processed_fields_values[$field_value['original_id']]['value'])) && preg_match('/^\/\d{4}\/\d{2}$/', $subdir)) {
112 + $tmpsubdir = '/' . date('Y/m', strtotime(str_replace('/', '-', ltrim($subdir, '/')) . ' -1 month'));
113 + if (file_exists(path_join(wp_upload_dir()['basedir'] . $tmpsubdir, $processed_fields_values[$field_value['original_id']]['value']))) {
94 114 $subdir = $tmpsubdir;
95 115 }
96 116 }
97 - $processed_fields_values[$field_value['original_id']]['value'] = pwh_dcfh_file_helpers()::get_form_upload_url($contact_form_id, $subdir, $processed_fields_values[$field_value['original_id']]['value']);
98 - } elseif (function_exists('ks_pac_dcfh_file_helper') && $contact_form_id) {
99 - if ($subdir && !file_exists(ks_pac_dcfh_file_helper()::get_form_upload_dir($contact_form_id, $subdir, $processed_fields_values[$field_value['original_id']]['value'])) && preg_match('/^\d{4}\/\d{2}$/', $subdir)) {
100 - $tmpsubdir = date('Y/m', strtotime(str_replace('/', '-', ltrim($subdir, '/')) . " -1 month"));
101 - if (file_exists(ks_pac_dcfh_file_helper()::get_form_upload_dir($contact_form_id, $tmpsubdir, $processed_fields_values[$field_value['original_id']]['value']))) {
102 - $subdir = $tmpsubdir;
117 + $processed_fields_values[$field_value['original_id']]['value'] = path_join(wp_upload_dir()['baseurl'] . $subdir, $processed_fields_values[$field_value['original_id']]['value']);
118 + } else {
119 + $contact_form_id = isset($cached_entry['_unique_id']) ? $cached_entry['_unique_id'] : '';
120 + if (function_exists('pwh_dcfh_file_helpers') && $contact_form_id) {
121 + if ($subdir && !file_exists(pwh_dcfh_file_helpers()::get_form_upload_dir($contact_form_id, $subdir, $processed_fields_values[$field_value['original_id']]['value'])) && preg_match('/^\d{4}\/\d{2}$/', $subdir)) {
122 + $tmpsubdir = date('Y/m', strtotime(str_replace('/', '-', ltrim($subdir, '/')) . " -1 month"));
123 + if (file_exists(pwh_dcfh_file_helpers()::get_form_upload_dir($contact_form_id, $tmpsubdir, $processed_fields_values[$field_value['original_id']]['value']))) {
124 + $subdir = $tmpsubdir;
125 + }
103 126 }
127 + $processed_fields_values[$field_value['original_id']]['value'] = pwh_dcfh_file_helpers()::get_form_upload_url($contact_form_id, $subdir, $processed_fields_values[$field_value['original_id']]['value']);
128 + } elseif (function_exists('ks_pac_dcfh_file_helper') && $contact_form_id) {
129 + if ($subdir && !file_exists(ks_pac_dcfh_file_helper()::get_form_upload_dir($contact_form_id, $subdir, $processed_fields_values[$field_value['original_id']]['value'])) && preg_match('/^\d{4}\/\d{2}$/', $subdir)) {
130 + $tmpsubdir = date('Y/m', strtotime(str_replace('/', '-', ltrim($subdir, '/')) . " -1 month"));
131 + if (file_exists(ks_pac_dcfh_file_helper()::get_form_upload_dir($contact_form_id, $tmpsubdir, $processed_fields_values[$field_value['original_id']]['value']))) {
132 + $subdir = $tmpsubdir;
133 + }
134 + }
135 + $processed_fields_values[$field_value['original_id']]['value'] = ks_pac_dcfh_file_helper()::get_form_upload_url($contact_form_id, $subdir, $processed_fields_values[$field_value['original_id']]['value']);
136 + } else {
137 + $processed_fields_values[$field_value['original_id']]['value'] = '';
104 138 }
105 - $processed_fields_values[$field_value['original_id']]['value'] = ks_pac_dcfh_file_helper()::get_form_upload_url($contact_form_id, $subdir, $processed_fields_values[$field_value['original_id']]['value']);
106 - } else {
107 - $processed_fields_values[$field_value['original_id']]['value'] = '';
108 139 }
109 140 }
110 141 }
111 142 }
112 143 }
144 + if (!isset($processed_fields_values['_wp_http_referer'])) {
145 + $processed_fields_values['_wp_http_referer'] = [
146 + 'value' => isset($cached_entry['_wp_http_referer']) ? $cached_entry['_wp_http_referer'] : '',
147 + 'label' => '_wp_http_referer',
148 + ];
149 + }
150 + if (!isset($processed_fields_values['e2pdf_entry_id'])) {
151 + $processed_fields_values['e2pdf_entry_id'] = [
152 + 'value' => (int) $this->get('dataset'),
153 + 'label' => 'e2pdf_entry_id',
154 + ];
155 + }
156 + foreach ($processed_fields_values as $field_key => $field_value) {
157 + $meta_data['%%' . $field_key . '%%'] = $field_value['value'];
158 + }
113 159 }
114 - if (!isset($processed_fields_values['_wp_http_referer'])) {
115 - $processed_fields_values['_wp_http_referer'] = array(
116 - 'value' => isset($cached_entry['_wp_http_referer']) ? $cached_entry['_wp_http_referer'] : '',
117 - 'label' => '_wp_http_referer',
118 - );
119 - }
120 - if (!isset($processed_fields_values['e2pdf_entry_id'])) {
121 - $processed_fields_values['e2pdf_entry_id'] = array(
122 - 'value' => (int) $this->get('dataset'),
123 - 'label' => 'e2pdf_entry_id',
124 - );
125 - }
126 160 }
127 - $meta_data = [];
128 - foreach ($processed_fields_values as $field_key => $field_value) {
129 - $meta_data['%%' . $field_key . '%%'] = $field_value['value'];
130 - }
131 161 $this->set('cached_meta', $meta_data);
132 162 }
133 163 }
134 164 break;
@@ -158,27 +188,36 @@
158 188
159 189 // items
160 190 public function items() {
161 191 global $wpdb;
162 - $condition = array(
163 - 'post_content' => array(
192 + $condition = [
193 + 'post_content' => [
164 194 'condition' => 'LIKE',
165 195 'value' => '%et_pb_contact_form%',
166 196 'type' => '%s',
167 - ),
168 - 'post_type' => array(
197 + 'or' => [
198 + [
199 + 'post_content' => [
200 + 'condition' => 'LIKE',
201 + 'value' => '%wp:divi/contact-form%',
202 + 'type' => '%s',
203 + ],
204 + ],
205 + ],
206 + ],
207 + 'post_type' => [
169 208 'condition' => '<>',
170 - 'value' => array(
209 + 'value' => [
171 210 'revision',
172 211 'et_pb_layout',
173 - ),
212 + ],
174 213 'type' => '%s',
175 - ),
176 - );
177 - $order_condition = array(
214 + ],
215 + ];
216 + $order_condition = [
178 217 'orderby' => 'id',
179 218 'order' => 'desc',
180 - );
219 + ];
181 220 $where = $this->helper->load('db')->prepare_where($condition);
182 221 $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
183 222 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
184 223 $posts = $wpdb->get_results($wpdb->prepare('SELECT * FROM `' . $wpdb->prefix . 'posts`' . $where['sql'] . $orderby . '', $where['filter']));
@@ -194,12 +233,13 @@
194 233
195 234 // get forms
196 235 public function get_forms($content) {
197 236 $forms = [];
198 - if (false !== strpos($content, 'et_pb_contact_form')) {
199 - $shortcode_tags = array(
237 +
238 + if ($this->divi4_form($content)) {
239 + $shortcode_tags = [
200 240 'et_pb_contact_form',
201 - );
241 + ];
202 242 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
203 243 $tagnames = array_intersect($shortcode_tags, $matches[1]);
204 244 if (!empty($tagnames)) {
205 245 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
@@ -212,8 +252,16 @@
212 252 }
213 253 }
214 254 }
215 255 }
256 + } elseif ($this->divi5_form($content)) {
257 + $blocks = $this->get_forms_blocks(parse_blocks($content));
258 + foreach ($blocks as $block) {
259 + $label = !empty($block['attrs']['module']['meta']['adminLabel']['desktop']['value']) ? $block['attrs']['module']['meta']['adminLabel']['desktop']['value'] : '';
260 + if ($label) {
261 + $forms[$label] = $label;
262 + }
263 + }
216 264 }
217 265 return $forms;
218 266 }
219 267
@@ -221,24 +269,24 @@
221 269 public function datasets($item_id = false, $name = false) {
222 270 global $wpdb;
223 271 $datasets = [];
224 272 if ($item_id) {
225 - $condition = array(
226 - 'extension' => array(
273 + $condition = [
274 + 'extension' => [
227 275 'condition' => '=',
228 276 'value' => 'divi',
229 277 'type' => '%s',
230 - ),
231 - 'item' => array(
278 + ],
279 + 'item' => [
232 280 'condition' => '=',
233 281 'value' => $item_id,
234 282 'type' => '%s',
235 - ),
236 - );
237 - $order_condition = array(
283 + ],
284 + ];
285 + $order_condition = [
238 286 'orderby' => 'ID',
239 287 'order' => 'desc',
240 - );
288 + ];
241 289 $where = $this->helper->load('db')->prepare_where($condition);
242 290 $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
243 291 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
244 292 $entries = $wpdb->get_results($wpdb->prepare('SELECT * FROM `' . $wpdb->prefix . 'e2pdf_datasets`' . $where['sql'] . $orderby . '', $where['filter']));
@@ -250,12 +298,12 @@
250 298 $entry_title = $this->render($name);
251 299 if (!$entry_title) {
252 300 $entry_title = $entry->ID;
253 301 }
254 - $datasets[] = array(
302 + $datasets[] = [
255 303 'key' => $entry->ID,
256 304 'value' => $entry_title,
257 - );
305 + ];
258 306 }
259 307 }
260 308 }
261 309 return $datasets;
@@ -283,8 +331,47 @@
283 331 $actions->delete = true;
284 332 return $actions;
285 333 }
286 334
335 + // get forms blocks
336 + public function get_forms_blocks($blocks) {
337 + $forms = [];
338 + foreach ($blocks as $block) {
339 + if ('divi/contact-form' === $block['blockName']) {
340 + $forms[] = $block;
341 + }
342 + if (!empty($block['innerBlocks'])) {
343 + $nested_forms = $this->get_forms_blocks($block['innerBlocks']);
344 + $forms = array_merge($forms, $nested_forms);
345 + }
346 + }
347 + return $forms;
348 + }
349 +
350 + // get fields blocks
351 + public function get_fields_blocks($form) {
352 + $fields = [];
353 + if (!empty($form['innerBlocks'])) {
354 + foreach ($form['innerBlocks'] as $block) {
355 + if ('divi/contact-field' === $block['blockName']) {
356 + $field_type = !empty($block['attrs']['fieldItem']['advanced']['type']['desktop']['value']) ? $block['attrs']['fieldItem']['advanced']['type']['desktop']['value'] : '';
357 + $field_label = !empty($block['attrs']['fieldItem']['innerContent']['desktop']['value']) ? $block['attrs']['fieldItem']['innerContent']['desktop']['value'] : '';
358 + $field_id = !empty($block['attrs']['fieldItem']['advanced']['id']['desktop']['value']) ? $block['attrs']['fieldItem']['advanced']['id']['desktop']['value'] : '';
359 + $fields[] = [
360 + 'field_type' => $field_type,
361 + 'field_title' => $field_label,
362 + 'field_id' => $field_id,
363 + ];
364 + }
365 + if (!empty($block['innerBlocks'])) {
366 + $nested_fields = $this->get_fields_blocks($block);
367 + $fields = array_merge($fields, $nested_fields);
368 + }
369 + }
370 + }
371 + return $fields;
372 + }
373 +
287 374 // item
288 375 public function item($item_id = false) {
289 376 if (!$item_id && $this->get('item')) {
290 377 $item_id = $this->get('item');
@@ -295,12 +382,12 @@
295 382 $item->name = $item_id;
296 383 $form = $this->get_form($item_id);
297 384 if (isset($form->ID)) {
298 385 $item->url = $this->helper->get_url(
299 - array(
386 + [
300 387 'post' => $form->ID,
301 388 'action' => 'edit',
302 - ), 'post.php?'
389 + ], 'post.php?'
303 390 );
304 391 } else {
305 392 $item->url = '';
306 393 }
@@ -315,34 +402,43 @@
315 402 // get form
316 403 public function get_form($item_id = false) {
317 404 global $wpdb;
318 405 $item_post = false;
319 - $condition = array(
320 - 'post_content' => array(
406 + $condition = [
407 + 'post_content' => [
321 408 'condition' => 'LIKE',
322 409 'value' => '%admin_label="' . $item_id . '"%',
323 410 'type' => '%s',
324 - ),
325 - 'post_type' => array(
411 + 'or' => [
412 + [
413 + 'post_content' => [
414 + 'condition' => 'LIKE',
415 + 'value' => '%"meta":{"adminLabel":{"desktop":{"value":"' . $item_id . '"%',
416 + 'type' => '%s',
417 + ],
418 + ],
419 + ],
420 + ],
421 + 'post_type' => [
326 422 'condition' => '<>',
327 - 'value' => array(
423 + 'value' => [
328 424 'revision',
329 425 'et_pb_layout',
330 - ),
426 + ],
331 427 'type' => '%s',
332 - ),
333 - );
428 + ],
429 + ];
334 430
335 - $order_condition = array(
431 + $order_condition = [
336 432 'orderby' => 'id',
337 433 'order' => 'desc',
338 - );
434 + ];
339 435
340 436 $where = $this->helper->load('db')->prepare_where($condition);
341 437 $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
342 438 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
343 439 $posts = $wpdb->get_results($wpdb->prepare('SELECT * FROM `' . $wpdb->prefix . 'posts`' . $where['sql'] . $orderby . '', $where['filter']));
344 - foreach ($posts as $key => $post) {
440 + foreach ($posts as $post) {
345 441 if (in_array($item_id, $this->get_forms($post->post_content))) {
346 442 $item_post = $post;
347 443 break;
348 444 }
@@ -387,24 +483,12 @@
387 483
388 484 // strip shortcodes
389 485 public function strip_shortcodes($value) {
390 486 $value = preg_replace('~(?:\[/?)[^/\]]+/?\]~s', '', $value);
391 - $value = preg_replace('~%%[^%]*%%~', '', $value);
487 + $value = preg_replace('~%%[^%%]*%%~', '', $value);
392 488 return $value;
393 489 }
394 490
395 - public function strip_math($value, &$replacements) {
396 - if ($value) {
397 - preg_match_all('~%%[^%]*%%~', $value, $matches);
398 - foreach ($matches[0] as $match) {
399 - $index = count($replacements) + 1;
400 - $replacements[] = $match;
401 - $value = str_replace($match, '%' . $index . '$s', $value);
402 - }
403 - }
404 - return $value;
405 - }
406 -
407 491 // convert shortcodes
408 492 public function convert_shortcodes($value, $to = false, $html = false) {
409 493 if ($value) {
410 494 if ($to) {
@@ -422,19 +506,21 @@
422 506
423 507 // auto
424 508 public function auto() {
425 509
426 - $response = [];
427 510 $elements = [];
428 511
429 512 if ($this->get('item')) {
430 513 $post = $this->get_form($this->get('item'));
431 514 if ($post && isset($post->post_content)) {
515 +
516 + $source = '';
432 517 $content = $post->post_content;
433 - if (false !== strpos($content, '[')) {
434 - $shortcode_tags = array(
518 +
519 + if ($this->divi4_form($content)) {
520 + $shortcode_tags = [
435 521 'et_pb_contact_form',
436 - );
522 + ];
437 523 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
438 524 $tagnames = array_intersect($shortcode_tags, $matches[1]);
439 525 if (!empty($tagnames)) {
440 526 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
@@ -440,248 +526,289 @@
440 526 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
441 527 foreach ($shortcodes[0] as $key => $shortcode_value) {
442 528 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
443 529 $atts = shortcode_parse_atts($shortcode[3]);
444 - if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item') && defined('ET_BUILDER_DIR')) {
445 -
446 - require_once ET_BUILDER_DIR . 'class-et-builder-element.php';
447 - require_once ET_BUILDER_DIR . 'functions.php';
448 - require_once ET_BUILDER_DIR . 'ab-testing.php';
449 - require_once ET_BUILDER_DIR . 'class-et-global-settings.php';
450 - if (file_exists(ET_BUILDER_DIR . 'module/type/WithSpamProtection.php')) {
451 - require_once ET_BUILDER_DIR . 'module/type/WithSpamProtection.php';
452 - }
453 - require_once ET_BUILDER_DIR . 'module/ContactForm.php';
454 - require_once ET_BUILDER_DIR . 'module/ContactFormItem.php';
455 -
456 - new ET_Builder_Module_Contact_Form();
457 - new ET_Builder_Module_Contact_Form_Item();
458 -
530 + if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
531 + $this->divi4_load();
459 532 $source = do_shortcode($shortcode_value);
460 - $dom = new DOMDocument();
461 - $html = $this->helper->load('convert')->load_html($source, $dom, true);
462 - if ($html) {
463 - $xml = $this->helper->load('xml');
464 - $xpath = new DomXPath($dom);
465 - $blocks = $xpath->query("//*[contains(@class, 'et_pb_contact_field')]");
466 - foreach ($blocks as $element) {
533 + }
534 + }
535 + }
536 + } elseif ($this->divi5_form($content)) {
537 + $blocks = $this->get_forms_blocks(parse_blocks($content));
538 + foreach ($blocks as $key => $block) {
539 + $label = !empty($block['attrs']['module']['meta']['adminLabel']['desktop']['value']) ? $block['attrs']['module']['meta']['adminLabel']['desktop']['value'] : '';
540 + if ($label == $this->get('item')) {
541 + $source = render_block($block);
542 + break;
543 + }
544 + }
545 + }
467 546
468 - if ($xml->get_node_value($element, 'data-type') == 'radio') {
547 + if ($source) {
548 + $dom = new DOMDocument();
549 + $html = $this->helper->load('convert')->load_html($source, $dom, true);
550 + if ($html) {
551 + $xml = $this->helper->load('xml');
552 + $xpath = new DomXPath($dom);
469 553
470 - $label = $xpath->query('.//label', $element)->item(0);
471 - $check_handler = $xpath->query(".//input[contains(@class, 'et_pb_checkbox_handle')]", $element)->item(0);
554 + // remove parent by class
555 + $remove_parent_by_class = [
556 + 'et_pb_contact_captcha_question',
557 + ];
558 + foreach ($remove_parent_by_class as $key => $class) {
559 + $xml_elements = $xpath->query("//*[contains(@class, '{$class}')]/parent::*");
560 + foreach ($xml_elements as $xml_element) {
561 + $xml_element->parentNode->removeChild($xml_element);
562 + }
563 + }
472 564
473 - $name = '';
474 - if ($check_handler) {
475 - $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
476 - }
565 + $blocks = $xpath->query("//*[contains(@class, 'et_pb_contact_field')]");
566 + foreach ($blocks as $element) {
477 567
478 - if ($label) {
479 - $elements[] = $this->auto_field(
480 - $element,
481 - array(
482 - 'type' => 'e2pdf-html',
483 - 'block' => true,
484 - 'class' => $xml->get_node_value($element, 'class'),
485 - 'properties' => array(
486 - 'top' => '20',
487 - 'left' => '20',
488 - 'right' => '20',
489 - 'width' => '100%',
490 - 'height' => 'auto',
491 - 'value' => $label->nodeValue,
492 - ),
493 - )
494 - );
495 - }
568 + if ($xml->get_node_value($element, 'data-type') == 'radio') {
496 569
497 - $fields = $xpath->query("//*[contains(@class, 'et_pb_contact_field_radio')]", $element);
498 - foreach ($fields as $field) {
499 - $radio_label = $xpath->query('.//label', $field)->item(0);
500 - $radio = $xpath->query(".//input[@type='radio']", $field)->item(0);
570 + $label = $xpath->query('.//label', $element)->item(0);
571 + $check_handler = $xpath->query(".//input[contains(@class, 'et_pb_checkbox_handle')]", $element)->item(0);
501 572
502 - if (
503 - $radio->attributes->getNamedItem('data-original_id') &&
504 - $radio->attributes->getNamedItem('value')
505 - ) {
506 - $elements[] = $this->auto_field(
507 - $field,
508 - array(
509 - 'type' => 'e2pdf-radio',
510 - 'class' => $xml->get_node_value($field, 'class'),
511 - 'properties' => array(
512 - 'top' => '5',
513 - 'width' => 'auto',
514 - 'height' => 'auto',
515 - 'value' => '%%' . $xml->get_node_value($radio, 'data-original_id') . '%%',
516 - 'option' => $xml->get_node_value($radio, 'value'),
517 - 'group' => '%%' . $xml->get_node_value($radio, 'data-original_id') . '%%',
518 - ),
519 - )
520 - );
521 - }
573 + $name = '';
574 + if ($check_handler) {
575 + $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
576 + }
522 577
523 - if ($radio_label) {
524 - $elements[] = $this->auto_field(
525 - $radio,
526 - array(
527 - 'type' => 'e2pdf-html',
528 - 'float' => true,
529 - 'class' => $xml->get_node_value($radio, 'class'),
530 - 'properties' => array(
531 - 'left' => '5',
532 - 'width' => '100%',
533 - 'height' => 'auto',
534 - 'value' => $radio_label->nodeValue,
535 - ),
536 - )
537 - );
538 - }
539 - }
540 - } elseif ($xml->get_node_value($element, 'data-type') == 'checkbox') {
578 + if ($label) {
579 + $elements[] = $this->auto_field(
580 + $element,
581 + [
582 + 'type' => 'e2pdf-html',
583 + 'block' => true,
584 + 'class' => $xml->get_node_value($element, 'class'),
585 + 'properties' => [
586 + 'top' => '20',
587 + 'left' => '20',
588 + 'right' => '20',
589 + 'width' => '100%',
590 + 'height' => 'auto',
591 + 'value' => $label->nodeValue,
592 + ],
593 + ]
594 + );
595 + }
541 596
542 - $label = $xpath->query('.//label', $element)->item(0);
543 - $check_handler = $xpath->query(".//input[contains(@class, 'et_pb_checkbox_handle')]", $element)->item(0);
597 + $fields = $xpath->query(".//*[contains(@class, 'et_pb_contact_field_radio')]", $element);
598 + foreach ($fields as $field) {
599 + $radio_label = $xpath->query('.//label', $field)->item(0);
600 + $radio = $xpath->query(".//input[@type='radio']", $field)->item(0);
544 601
545 - $name = '';
546 - if ($check_handler) {
547 - $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
548 - }
602 + if (
603 + $radio->attributes->getNamedItem('data-original_id') &&
604 + $radio->attributes->getNamedItem('value')
605 + ) {
606 + $elements[] = $this->auto_field(
607 + $field,
608 + [
609 + 'type' => 'e2pdf-radio',
610 + 'class' => $xml->get_node_value($field, 'class'),
611 + 'properties' => [
612 + 'top' => '5',
613 + 'width' => 'auto',
614 + 'height' => 'auto',
615 + 'value' => '%%' . $xml->get_node_value($radio, 'data-original_id') . '%%',
616 + 'option' => sanitize_text_field($xml->get_node_value($radio, 'value')),
617 + 'group' => '%%' . $xml->get_node_value($radio, 'data-original_id') . '%%',
618 + ],
619 + ]
620 + );
621 + }
549 622
550 - if ($label) {
551 - $elements[] = $this->auto_field(
552 - $element,
553 - array(
554 - 'type' => 'e2pdf-html',
555 - 'block' => true,
556 - 'class' => $xml->get_node_value($element, 'class'),
557 - 'properties' => array(
558 - 'top' => '20',
559 - 'left' => '20',
560 - 'right' => '20',
561 - 'width' => '100%',
562 - 'height' => 'auto',
563 - 'value' => $label->nodeValue,
564 - ),
565 - )
566 - );
567 - }
623 + if ($radio_label) {
624 + $elements[] = $this->auto_field(
625 + $radio,
626 + [
627 + 'type' => 'e2pdf-html',
628 + 'float' => true,
629 + 'class' => $xml->get_node_value($radio, 'class'),
630 + 'properties' => [
631 + 'left' => '5',
632 + 'width' => '100%',
633 + 'height' => 'auto',
634 + 'value' => $radio_label->nodeValue,
635 + ],
636 + ]
637 + );
638 + }
639 + }
640 + } elseif ($xml->get_node_value($element, 'data-type') == 'checkbox') {
641 + $label = $xpath->query('.//label', $element)->item(0);
642 + $check_handler = $xpath->query(".//input[contains(@class, 'et_pb_checkbox_handle')]", $element)->item(0);
568 643
569 - $fields = $xpath->query("//*[contains(@class, 'et_pb_contact_field_checkbox')]", $element);
570 - foreach ($fields as $field) {
571 - $checkbox_label = $xpath->query('.//label', $field)->item(0);
572 - $checkbox = $xpath->query(".//input[@type='checkbox']", $field)->item(0);
644 + $name = '';
645 + if ($check_handler) {
646 + $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
647 + }
573 648
574 - $elements[] = $this->auto_field(
575 - $field,
576 - array(
577 - 'type' => 'e2pdf-checkbox',
578 - 'class' => $xml->get_node_value($field, 'class'),
579 - 'properties' => array(
580 - 'top' => '5',
581 - 'width' => 'auto',
582 - 'height' => 'auto',
583 - 'value' => $name,
584 - 'option' => $xml->get_node_value($checkbox, 'value'),
585 - ),
586 - )
587 - );
649 + if ($label) {
650 + $elements[] = $this->auto_field(
651 + $element,
652 + [
653 + 'type' => 'e2pdf-html',
654 + 'block' => true,
655 + 'class' => $xml->get_node_value($element, 'class'),
656 + 'properties' => [
657 + 'top' => '20',
658 + 'left' => '20',
659 + 'right' => '20',
660 + 'width' => '100%',
661 + 'height' => 'auto',
662 + 'value' => $label->nodeValue,
663 + ],
664 + ]
665 + );
666 + }
588 667
589 - if ($checkbox_label) {
590 - $elements[] = $this->auto_field(
591 - $checkbox,
592 - array(
593 - 'type' => 'e2pdf-html',
594 - 'float' => true,
595 - 'class' => $xml->get_node_value($checkbox, 'class'),
596 - 'properties' => array(
597 - 'left' => '5',
598 - 'width' => '100%',
599 - 'height' => 'auto',
600 - 'value' => $checkbox_label->nodeValue,
601 - ),
602 - )
603 - );
604 - }
605 - }
606 - } else {
668 + $fields = $xpath->query(".//*[contains(@class, 'et_pb_contact_field_checkbox')]", $element);
669 + foreach ($fields as $field) {
670 + $checkbox_label = $xpath->query('.//label', $field)->item(0);
671 + $checkbox = $xpath->query(".//input[@type='checkbox']", $field)->item(0);
607 672
608 - $label = $xpath->query('.//label', $element)->item(0);
609 - $input_text = $xpath->query(".//input[@type='text']", $element)->item(0);
610 - $select = $xpath->query('.//select', $element)->item(0);
611 - $textarea = $xpath->query('.//textarea', $element)->item(0);
673 + $elements[] = $this->auto_field(
674 + $field,
675 + [
676 + 'type' => 'e2pdf-checkbox',
677 + 'class' => $xml->get_node_value($field, 'class'),
678 + 'properties' => [
679 + 'top' => '5',
680 + 'width' => 'auto',
681 + 'height' => 'auto',
682 + 'value' => $name,
683 + 'option' => sanitize_text_field($xml->get_node_value($checkbox, 'value')),
684 + ],
685 + ]
686 + );
612 687
613 - if ($label && ($input_text || $select || $textarea)) {
614 - $elements[] = $this->auto_field(
615 - $element,
616 - array(
617 - 'type' => 'e2pdf-html',
618 - 'block' => true,
619 - 'class' => $xml->get_node_value($element, 'class'),
620 - 'properties' => array(
621 - 'top' => '20',
622 - 'left' => '20',
623 - 'right' => '20',
624 - 'width' => '100%',
625 - 'height' => 'auto',
626 - 'value' => $label->nodeValue,
627 - ),
628 - )
629 - );
630 - }
688 + if ($checkbox_label) {
689 + $elements[] = $this->auto_field(
690 + $checkbox,
691 + [
692 + 'type' => 'e2pdf-html',
693 + 'float' => true,
694 + 'class' => $xml->get_node_value($checkbox, 'class'),
695 + 'properties' => [
696 + 'left' => '5',
697 + 'width' => '100%',
698 + 'height' => 'auto',
699 + 'value' => $checkbox_label->nodeValue,
700 + ],
701 + ]
702 + );
703 + }
704 + }
705 + } else {
706 + $label = $xpath->query('.//label', $element)->item(0);
707 + $input_text = $xpath->query(".//input[@type='text']", $element)->item(0);
708 + $select = $xpath->query('.//select', $element)->item(0);
709 + $textarea = $xpath->query('.//textarea', $element)->item(0);
631 710
632 - if ($input_text) {
633 - $elements[] = $this->auto_field(
634 - $input_text,
635 - array(
636 - 'type' => 'e2pdf-input',
637 - 'class' => $xml->get_node_value($input_text, 'class'),
638 - 'properties' => array(
639 - 'top' => '5',
640 - 'width' => '100%',
641 - 'height' => 'auto',
642 - 'value' => '%%' . $xml->get_node_value($input_text, 'data-original_id') . '%%',
643 - ),
644 - )
645 - );
646 - } elseif ($select) {
647 - $options_tmp = [];
648 - $options = $xpath->query('.//option', $select);
649 - foreach ($options as $option) {
650 - $options_tmp[] = $xml->get_node_value($option, 'value');
651 - }
711 + if ($label && ($input_text || $select || $textarea)) {
712 + $elements[] = $this->auto_field(
713 + $element,
714 + [
715 + 'type' => 'e2pdf-html',
716 + 'block' => true,
717 + 'class' => $xml->get_node_value($element, 'class'),
718 + 'properties' => [
719 + 'top' => '20',
720 + 'left' => '20',
721 + 'right' => '20',
722 + 'width' => '100%',
723 + 'height' => 'auto',
724 + 'value' => $label->nodeValue,
725 + ],
726 + ]
727 + );
728 + }
652 729
653 - $elements[] = $this->auto_field(
654 - $select,
655 - array(
656 - 'type' => 'e2pdf-select',
657 - 'class' => $xml->get_node_value($select, 'class'),
658 - 'properties' => array(
659 - 'top' => '5',
660 - 'width' => '100%',
661 - 'height' => 'auto',
662 - 'options' => implode("\n", $options_tmp),
663 - 'value' => '%%' . $xml->get_node_value($select, 'data-original_id') . '%%',
664 - ),
665 - )
666 - );
667 - } elseif ($textarea) {
668 - $elements[] = $this->auto_field(
669 - $textarea,
670 - array(
671 - 'type' => 'e2pdf-textarea',
672 - 'class' => $xml->get_node_value($textarea, 'class'),
673 - 'properties' => array(
674 - 'top' => '5',
675 - 'width' => '100%',
676 - 'height' => '150',
677 - 'value' => '%%' . $xml->get_node_value($textarea, 'data-original_id') . '%%',
678 - ),
679 - )
680 - );
681 - }
682 - }
730 + if ($input_text) {
731 + $data_type = $input_text->parentNode->getAttribute('data-type');
732 + if ($data_type === 'signature-pad') {
733 + $elements[] = $this->auto_field(
734 + $input_text,
735 + [
736 + 'type' => 'e2pdf-signature',
737 + 'properties' => [
738 + 'top' => '5',
739 + 'width' => '100%',
740 + 'height' => '150',
741 + 'dimension' => '1',
742 + 'block_dimension' => '1',
743 + 'value' => '%%' . $xml->get_node_value($input_text, 'data-original_id') . '%%',
744 + ],
745 + ]
746 + );
747 + } elseif ($data_type === 'file') {
748 + $elements[] = $this->auto_field(
749 + $input_text,
750 + [
751 + 'type' => 'e2pdf-textarea',
752 + 'class' => $xml->get_node_value($input_text, 'class'),
753 + 'properties' => [
754 + 'top' => '5',
755 + 'width' => '100%',
756 + 'height' => '150',
757 + 'value' => '%%' . $xml->get_node_value($input_text, 'data-original_id') . '%%',
758 + ],
759 + ]
760 + );
761 + } else {
762 + $elements[] = $this->auto_field(
763 + $input_text,
764 + [
765 + 'type' => 'e2pdf-input',
766 + 'class' => $xml->get_node_value($input_text, 'class'),
767 + 'properties' => [
768 + 'top' => '5',
769 + 'width' => '100%',
770 + 'height' => 'auto',
771 + 'value' => '%%' . $xml->get_node_value($input_text, 'data-original_id') . '%%',
772 + ],
773 + ]
774 + );
683 775 }
776 + } elseif ($select) {
777 + $options_tmp = [];
778 + $options = $xpath->query('.//option', $select);
779 + foreach ($options as $option) {
780 + $options_tmp[] = sanitize_text_field($xml->get_node_value($option, 'value'));
781 + }
782 +
783 + $elements[] = $this->auto_field(
784 + $select,
785 + [
786 + 'type' => 'e2pdf-select',
787 + 'class' => $xml->get_node_value($select, 'class'),
788 + 'properties' => [
789 + 'top' => '5',
790 + 'width' => '100%',
791 + 'height' => 'auto',
792 + 'options' => implode("\n", $options_tmp),
793 + 'value' => '%%' . $xml->get_node_value($select, 'data-original_id') . '%%',
794 + ],
795 + ]
796 + );
797 + } elseif ($textarea) {
798 + $elements[] = $this->auto_field(
799 + $textarea,
800 + [
801 + 'type' => 'e2pdf-textarea',
802 + 'class' => $xml->get_node_value($textarea, 'class'),
803 + 'properties' => [
804 + 'top' => '5',
805 + 'width' => '100%',
806 + 'height' => '150',
807 + 'value' => '%%' . $xml->get_node_value($textarea, 'data-original_id') . '%%',
808 + ],
809 + ]
810 + );
684 811 }
685 812 }
686 813 }
687 814 }
@@ -687,18 +814,17 @@
687 814 }
688 815 }
689 816 }
690 817 }
691 -
692 - $response['page'] = array(
693 - 'bottom' => '20',
694 - 'top' => '20',
695 - 'right' => '20',
696 - 'left' => '20',
697 - );
698 - $response['elements'] = $elements;
699 -
700 - return $response;
818 + return [
819 + 'page' => [
820 + 'bottom' => '20',
821 + 'top' => '20',
822 + 'right' => '20',
823 + 'left' => '20',
824 + ],
825 + 'elements' => $elements,
826 + ];
701 827 }
702 828
703 829 // auto map
704 830 public function auto_map($name = false) {
@@ -706,13 +832,12 @@
706 832 if ($item) {
707 833 $post = $this->get_form($item);
708 834 if ($post && isset($post->post_content)) {
709 835 $content = $post->post_content;
710 -
711 - if (false !== strpos($content, '[')) {
712 - $shortcode_tags = array(
836 + if ($this->divi4_form($content)) {
837 + $shortcode_tags = [
713 838 'et_pb_contact_form',
714 - );
839 + ];
715 840 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
716 841 $tagnames = array_intersect($shortcode_tags, $matches[1]);
717 842 if (!empty($tagnames)) {
718 843 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
@@ -720,11 +845,11 @@
720 845 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
721 846 $atts = shortcode_parse_atts($shortcode[3]);
722 847 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
723 848 $field_content = $shortcode_value;
724 - $field_shortcode_tags = array(
849 + $field_shortcode_tags = [
725 850 'et_pb_contact_field',
726 - );
851 + ];
727 852 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $field_content, $field_matches);
728 853 $field_tagnames = array_intersect($field_shortcode_tags, $field_matches[1]);
729 854 if (!empty($field_tagnames)) {
730 855 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($field_tagnames) . '/', $field_content, $field_shortcodes);
@@ -730,12 +855,12 @@
730 855 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($field_tagnames) . '/', $field_content, $field_shortcodes);
731 856 foreach ($field_shortcodes[0] as $field_key => $field_shortcode_value) {
732 857 $field_shortcode = [];
733 858 $field_shortcode[3] = $field_shortcodes[3][$field_key];
734 - $field_atts = shortcode_parse_atts($field_shortcode[3]);
735 - if (isset($field_atts['field_title']) && isset($field_atts['field_id'])) {
736 - if ($field_atts['field_title'] == $name || $field_atts['field_id'] == $name) {
737 - return '%%' . strtolower($field_atts['field_id']) . '%%';
859 + $field = shortcode_parse_atts($field_shortcode[3]);
860 + if (isset($field['field_title']) && isset($field['field_id'])) {
861 + if ($field['field_title'] == $name || $field['field_id'] == $name) {
862 + return '%%' . strtolower($field['field_id']) . '%%';
738 863 }
739 864 }
740 865 }
741 866 }
@@ -741,8 +866,26 @@
741 866 }
742 867 }
743 868 }
744 869 }
870 + } elseif ($this->divi5_form($content)) {
871 + $blocks = $this->get_forms_blocks(parse_blocks($content));
872 + foreach ($blocks as $key => $block) {
873 + $label = !empty($block['attrs']['module']['meta']['adminLabel']['desktop']['value']) ? $block['attrs']['module']['meta']['adminLabel']['desktop']['value'] : '';
874 + if ($label == $this->get('item')) {
875 + $fields = $this->get_fields_blocks($block);
876 + if (!empty($fields)) {
877 + foreach ($fields as $field) {
878 + if (isset($field['field_title']) && isset($field['field_id'])) {
879 + if ($field['field_title'] == $name || $field['field_id'] == $name) {
880 + return '%%' . strtolower($field['field_id']) . '%%';
881 + }
882 + }
883 + }
884 + }
885 + }
886 + break;
887 + }
745 888 }
746 889 }
747 890 }
748 891
@@ -769,11 +912,11 @@
769 912 $classes = explode(' ', $element['class']);
770 913 unset($element['class']);
771 914 }
772 915
773 - $float_classes = array(
916 + $float_classes = [
774 917 'et_pb_contact_field_half',
775 - );
918 + ];
776 919 $array_intersect = array_intersect($classes, $float_classes);
777 920
778 921 if (!empty($array_intersect) && $element['block']) {
779 922 $element['float'] = true;
@@ -815,12 +958,12 @@
815 958 $post = $this->get_form($this->get('item'));
816 959 if ($post && isset($post->post_content)) {
817 960 $content = $post->post_content;
818 961
819 - if (false !== strpos($content, '[')) {
820 - $shortcode_tags = array(
962 + if ($this->divi4_form($content)) {
963 + $shortcode_tags = [
821 964 'et_pb_contact_form',
822 - );
965 + ];
823 966 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
824 967 $tagnames = array_intersect($shortcode_tags, $matches[1]);
825 968 if (!empty($tagnames)) {
826 969 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
@@ -827,98 +970,123 @@
827 970 foreach ($shortcodes[0] as $key => $shortcode_value) {
828 971 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
829 972 $atts = shortcode_parse_atts($shortcode[3]);
830 973 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
831 - require_once ET_BUILDER_DIR . 'class-et-builder-element.php';
832 - require_once ET_BUILDER_DIR . 'functions.php';
833 - require_once ET_BUILDER_DIR . 'ab-testing.php';
834 - require_once ET_BUILDER_DIR . 'class-et-global-settings.php';
835 - if (file_exists(ET_BUILDER_DIR . 'module/type/WithSpamProtection.php')) {
836 - require_once ET_BUILDER_DIR . 'module/type/WithSpamProtection.php';
837 - }
838 - require_once ET_BUILDER_DIR . 'module/ContactForm.php';
839 - require_once ET_BUILDER_DIR . 'module/ContactFormItem.php';
840 - new ET_Builder_Module_Contact_Form();
841 - new ET_Builder_Module_Contact_Form_Item();
974 + $this->divi4_load();
842 975 $source = do_shortcode($shortcode_value);
843 - if ($source) {
844 - $dom = new DOMDocument();
845 - $html = $this->helper->load('convert')->load_html($source, $dom, true);
846 - }
847 - if (!$source) {
848 - return '<div class="e2pdf-vm-error">' . __("The form source is empty or doesn't exist", 'e2pdf') . '</div>';
849 - } elseif (!$html) {
850 - return '<div class="e2pdf-vm-error">' . __('The form could not be parsed due the incorrect HTML', 'e2pdf') . '</div>';
851 - } else {
852 - $xml = $this->helper->load('xml');
853 - $xpath = new DomXPath($dom);
976 + }
977 + }
978 + }
979 + } elseif ($this->divi5_form($content)) {
980 + $blocks = $this->get_forms_blocks(parse_blocks($content));
981 + foreach ($blocks as $key => $block) {
982 + $label = !empty($block['attrs']['module']['meta']['adminLabel']['desktop']['value']) ? $block['attrs']['module']['meta']['adminLabel']['desktop']['value'] : '';
983 + if ($label == $this->get('item')) {
984 + $source = render_block($block);
985 + break;
986 + }
987 + }
988 + }
854 989
855 - // remove by name
856 - $remove_by_name = array(
857 - 'et_pb_contactform_submit_0',
858 - '_wpnonce-et-pb-contact-form-submitted-0',
859 - '_wp_http_referer',
860 - );
861 - foreach ($remove_by_name as $key => $name) {
862 - $elements = $xpath->query('//*[@name="' . $name . '"]');
863 - foreach ($elements as $element) {
864 - $element->parentNode->removeChild($element);
865 - }
866 - }
990 + if ($source) {
991 + $dom = new DOMDocument();
992 + $html = $this->helper->load('convert')->load_html($source, $dom, true);
993 + }
994 + if (!$source) {
995 + return '<div class="e2pdf-vm-error">' . __("The form source is empty or doesn't exist", 'e2pdf') . '</div>';
996 + } elseif (!$html) {
997 + return '<div class="e2pdf-vm-error">' . __('The form could not be parsed due the incorrect HTML', 'e2pdf') . '</div>';
998 + } else {
999 + $xml = $this->helper->load('xml');
1000 + $xpath = new DomXPath($dom);
867 1001
868 - // replace names
869 - $fields = $xpath->query("//*[contains(@name, 'et_pb_contact_')]");
870 - foreach ($fields as $element) {
871 - $xml->set_node_value($element, 'name', '%%' . $xml->get_node_value($element, 'data-original_id') . '%%');
872 - }
1002 + // remove by name
1003 + $remove_by_name = [
1004 + 'et_pb_contactform_submit_0',
1005 + '_wpnonce-et-pb-contact-form-submitted-0',
1006 + '_wp_http_referer',
1007 + ];
1008 + foreach ($remove_by_name as $key => $name) {
1009 + $xml_elements = $xpath->query('//*[@name="' . $name . '"]');
1010 + foreach ($xml_elements as $xml_element) {
1011 + $xml_element->parentNode->removeChild($xml_element);
1012 + }
1013 + }
873 1014
874 - $checkboxes = $xpath->query("//*[contains(@class, 'et_pb_contact_field') and @data-type='checkbox']");
875 - foreach ($checkboxes as $element) {
876 - $check_handler = $xpath->query(".//input[contains(@class, 'et_pb_checkbox_handle')]", $element)->item(0);
877 - $name = '';
878 - if ($check_handler) {
879 - $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
880 - }
881 - $checks = $xpath->query(".//input[@type='checkbox']", $element);
882 - foreach ($checks as $check) {
883 - $xml->set_node_value($check, 'name', $name);
884 - }
885 - }
1015 + // replace names
1016 + $fields = $xpath->query("//*[contains(@name, 'et_pb_contact_')]");
1017 + foreach ($fields as $xml_element) {
1018 + $xml->set_node_value($xml_element, 'name', '%%' . $xml->get_node_value($xml_element, 'data-original_id') . '%%');
1019 + }
886 1020
887 - // remove by class
888 - $remove_by_class = array(
889 - 'et_pb_contact_submit',
890 - 'et_pb_contactform_validate_field',
891 - 'et_pb_checkbox_handle',
892 - );
893 - foreach ($remove_by_class as $key => $class) {
894 - $elements = $xpath->query("//*[contains(@class, '{$class}')]");
895 - foreach ($elements as $element) {
896 - $element->parentNode->removeChild($element);
897 - }
898 - }
1021 + // checkboxes
1022 + $checkboxes = $xpath->query("//*[contains(@class, 'et_pb_contact_field') and @data-type='checkbox']");
1023 + foreach ($checkboxes as $xml_element) {
1024 + $check_handler = $xpath->query(".//input[contains(@class, 'et_pb_checkbox_handle')]", $xml_element)->item(0);
1025 + $name = '';
1026 + if ($check_handler) {
1027 + $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
1028 + }
1029 + $checks = $xpath->query(".//input[@type='checkbox']", $xml_element);
1030 + foreach ($checks as $check) {
1031 + $xml->set_node_value($check, 'name', $name);
1032 + $xml->set_node_value($check, 'value', sanitize_text_field($xml->get_node_value($check, 'value')));
1033 + }
1034 + }
899 1035
900 - // remove parent by class
901 - $remove_parent_by_class = array(
902 - 'et_pb_contact_captcha_question',
903 - );
904 - foreach ($remove_parent_by_class as $key => $class) {
905 - $elements = $xpath->query("//*[contains(@class, '{$class}')]/parent::*");
906 - foreach ($elements as $element) {
907 - $element->parentNode->removeChild($element);
908 - }
909 - }
910 - }
1036 + // uploads
1037 + $uploads = $xpath->query("//*[contains(@class, 'et_pb_contact_hidden_files')]");
1038 + foreach ($uploads as $xml_element) {
1039 + $xml->set_node_value($xml_element, 'type', 'file');
1040 + }
911 1041
912 - if (defined('LIBXML_HTML_NOIMPLIED') && defined('LIBXML_HTML_NODEFDTD')) {
913 - return str_replace(array('<html>', '</html>'), '', $dom->saveHTML());
914 - } else {
915 - return $dom->saveHTML();
916 - }
917 - }
1042 + $radios = $xpath->query("//input[@type='radio']");
1043 + foreach ($radios as $xml_element) {
1044 + $xml->set_node_value($xml_element, 'value', sanitize_text_field($xml->get_node_value($xml_element, 'value')));
1045 + }
1046 +
1047 + $selects = $xpath->query('//select/option');
1048 + foreach ($selects as $xml_element) {
1049 + $xml->set_node_value($xml_element, 'value', sanitize_text_field($xml->get_node_value($xml_element, 'value')));
1050 + }
1051 +
1052 + // remove by class
1053 + $remove_by_class = [
1054 + 'et_pb_contact_submit',
1055 + 'et_pb_contactform_validate_field',
1056 + 'et_pb_checkbox_handle',
1057 + 'et_pb_form_bottom_stepper_container',
1058 + 'stepper__progress',
1059 + ];
1060 + foreach ($remove_by_class as $key => $class) {
1061 + $xml_elements = $xpath->query("//*[contains(@class, '{$class}')]");
1062 + foreach ($xml_elements as $xml_element) {
1063 + $xml_element->parentNode->removeChild($xml_element);
918 1064 }
919 1065 }
1066 +
1067 + $xml_elements = $xpath->query('//*[@data-step]');
1068 + foreach ($xml_elements as $xml_element) {
1069 + $xml_element->removeAttribute('style');
1070 + }
1071 +
1072 + // remove parent by class
1073 + $remove_parent_by_class = [
1074 + 'et_pb_contact_captcha_question',
1075 + ];
1076 + foreach ($remove_parent_by_class as $key => $class) {
1077 + $xml_elements = $xpath->query("//*[contains(@class, '{$class}')]/parent::*");
1078 + foreach ($xml_elements as $xml_element) {
1079 + $xml_element->parentNode->removeChild($xml_element);
1080 + }
1081 + }
920 1082 }
1083 +
1084 + if (defined('LIBXML_HTML_NOIMPLIED') && defined('LIBXML_HTML_NODEFDTD')) {
1085 + return str_replace(['<html>', '</html>'], '', $dom->saveHTML());
1086 + } else {
1087 + return $dom->saveHTML();
1088 + }
921 1089 }
922 1090 }
923 1091
924 1092 return false;
@@ -923,27 +1091,28 @@
923 1091
924 1092 return false;
925 1093 }
926 1094
927 - // filter mail for Divi Contact Form Helper
928 - public function filter_wp_mail_pwh_dcfh($args) {
929 - if (isset($args['message']) && $args['message']) {
930 - $args['message'] = preg_replace('/(\{\{)((e2pdf-download|e2pdf-view|e2pdf-save|e2pdf-attachment|e2pdf-adobesign|e2pdf-zapier)[^\}]*?)(\}\})/', '[$2]', $args['message']);
1095 + // filter mail
1096 + public function filter_wp_mail($args) {
1097 +
1098 + if (!$this->get('process')) {
1099 + return $args;
931 1100 }
932 - return $this->filter_wp_mail($args);
933 - }
934 1101
935 - // filter mail
936 - public function filter_wp_mail($args) {
1102 + if ((defined('PWH_DCFH_PLUGIN_VERSION') && version_compare(PWH_DCFH_PLUGIN_VERSION, '1.5.1', '>=')) || defined('KS_PAC_DCFH_PLUGIN_FILE')) {
1103 + $args['message'] = preg_replace('/(\{)((e2pdf-download|e2pdf-view|e2pdf-save|e2pdf-attachment|e2pdf-adobesign|e2pdf-zapier)[^\}]*?)(\})/', '[$2]', $args['message']);
1104 + }
1105 +
937 1106 if (isset($args['message'])) {
938 1107 if (false !== strpos($args['message'], '[')) {
939 - $shortcode_tags = array(
1108 + $shortcode_tags = [
940 1109 'e2pdf-download',
941 1110 'e2pdf-save',
942 1111 'e2pdf-attachment',
943 1112 'e2pdf-adobesign',
944 1113 'e2pdf-zapier',
945 - );
1114 + ];
946 1115 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $args['message'], $matches);
947 1116 $tagnames = array_intersect($shortcode_tags, $matches[1]);
948 1117 if (!empty($tagnames)) {
949 1118 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $args['message'], $shortcodes);
@@ -972,8 +1141,14 @@
972 1141 } else {
973 1142 $this->helper->add('divi_attachments', $file);
974 1143 }
975 1144 $args['attachments'][] = $file;
1145 + if (!has_action('wp_mail_succeeded', [$this, 'filter_wp_mail_attachments'])) {
1146 + add_action('wp_mail_succeeded', [$this, 'filter_wp_mail_attachments']);
1147 + }
1148 + if (!has_action('wp_mail_failed', [$this, 'filter_wp_mail_attachments'])) {
1149 + add_action('wp_mail_failed', [$this, 'filter_wp_mail_attachments']);
1150 + }
976 1151 }
977 1152 $args['message'] = str_replace($shortcode_value, '', $args['message']);
978 1153 } else {
979 1154 if (is_array($args['headers']) && !in_array('Content-Type: text/html; charset=UTF-8', $args['headers'])) {
@@ -985,35 +1160,430 @@
985 1160 }
986 1161 }
987 1162 }
988 1163 }
989 -
990 - $wp_mail = array(
1164 + $wp_mail = [
991 1165 'to' => $args['to'],
992 1166 'subject' => $args['subject'],
993 1167 'message' => $args['message'],
994 1168 'headers' => $args['headers'],
995 1169 'attachments' => $args['attachments'],
996 - );
1170 + ];
1171 + return $wp_mail;
1172 + }
997 1173
998 - return $wp_mail;
1174 + public function filter_wp_mail_attachments() {
1175 + $files = $this->helper->get('divi_attachments');
1176 + if (is_array($files) && !empty($files)) {
1177 + foreach ($files as $key => $file) {
1178 + $this->helper->delete_dir(dirname($file) . '/');
1179 + }
1180 + $this->helper->deset('divi_attachments');
1181 + }
999 1182 }
1000 1183
1001 1184 // load actions
1002 1185 public function load_actions() { // phpcs:ignore Squiz.WhiteSpace.SuperfluousWhitespace.EndLine
1186 + add_action('et_pb_contact_form_submit', [$this, 'action_et_pb_contact_form_submit'], 11);
1003 1187 }
1004 1188
1189 + public function action_et_pb_contact_form_submit() {
1190 + if ($this->divi5()) {
1191 + add_filter('wp_mail', [$this, 'filter_wp_mail'], 1000);
1192 + }
1193 + }
1194 +
1005 1195 // load filters
1006 1196 public function load_filters() {
1007 1197 // Divi Contact Form Helper Confirmation Email compatibility fix
1008 1198 if (defined('PWH_DCFH_PLUGIN_FILE') || defined('KS_PAC_DCFH_PLUGIN_FILE')) {
1009 - add_filter('et_pb_module_shortcode_attributes', array($this, 'filter_et_pb_module_shortcode_attributes'), 9, 5);
1199 + add_filter('et_pb_module_shortcode_attributes', [$this, 'filter_et_pb_module_shortcode_attributes'], 9, 5);
1010 1200 } else {
1011 - add_filter('et_pb_module_shortcode_attributes', array($this, 'filter_et_pb_module_shortcode_attributes'), 30, 5);
1201 + add_filter('et_pb_module_shortcode_attributes', [$this, 'filter_et_pb_module_shortcode_attributes'], 30, 5);
1012 1202 }
1013 - add_filter('et_module_shortcode_output', array($this, 'filter_et_module_shortcode_output'), 30, 3);
1203 + add_filter('et_module_shortcode_output', [$this, 'filter_et_module_shortcode_output'], 30, 3);
1204 +
1205 + // Divi 5
1206 + add_filter('divi_module_library_register_module_attrs', [$this, 'filter_divi_module_library_register_module_attrs'], 11, 2);
1014 1207 }
1015 1208
1209 + public function filter_divi_module_library_register_module_attrs($module_attrs, $filter_args) {
1210 +
1211 + if ('divi/contact-form' !== $filter_args['name']) {
1212 + return $module_attrs;
1213 + }
1214 +
1215 + if (!isset($_SERVER['REQUEST_METHOD']) || 'POST' !== $_SERVER['REQUEST_METHOD']) {
1216 + return $module_attrs;
1217 + }
1218 +
1219 + $module_id = !empty($filter_args['id']) ? $filter_args['id'] : '';
1220 + $store_instance = !empty($filter_args['storeInstance']) ? $filter_args['storeInstance'] : 0;
1221 +
1222 + if (
1223 + !class_exists('\ET\Builder\FrontEnd\BlockParser\BlockParserStore') ||
1224 + !method_exists('\ET\Builder\FrontEnd\BlockParser\BlockParserStore', 'get')
1225 + ) {
1226 + return $module_attrs;
1227 + }
1228 +
1229 + $module = \ET\Builder\FrontEnd\BlockParser\BlockParserStore::get($module_id, $store_instance);
1230 +
1231 + if (!$module) {
1232 + return $module_attrs;
1233 + }
1234 +
1235 + if (
1236 + !class_exists('\ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormUtils') ||
1237 + !method_exists('\ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormUtils', 'get_unique_id') ||
1238 + !class_exists('\ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormHandler') ||
1239 + !class_exists('\ET\Builder\Packages\ModuleLibrary\ContactField\ContactFieldModule') ||
1240 + !method_exists('\ET\Builder\Packages\ModuleLibrary\ContactField\ContactFieldModule', 'get_field_unique_id')
1241 + ) {
1242 + return $module_attrs;
1243 + }
1244 +
1245 + $unique_id = \ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormUtils::get_unique_id($module_attrs, (array) $module);
1246 +
1247 + $submitted = isset($_POST['_wpnonce-et-pb-contact-form-submitted-' . $unique_id]);
1248 + if (!$submitted) {
1249 + return $module_attrs;
1250 + }
1251 +
1252 + if (!wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['_wpnonce-et-pb-contact-form-submitted-' . $unique_id])), 'et-pb-contact-form-submit-' . $unique_id)) {
1253 + return $module_attrs;
1254 + }
1255 +
1256 + $use_basic_captcha = $module_attrs['module']['advanced']['spamProtection']['desktop']['value']['useBasicCaptcha'] ?? 'on';
1257 + $use_spam_service = $module_attrs['module']['advanced']['spamProtection']['desktop']['value']['enabled'] ?? 'off';
1258 +
1259 + if ('on' === $use_basic_captcha && 'off' === $use_spam_service) {
1260 + $captcha_answer = sanitize_text_field(wp_unslash($_POST['et_pb_contact_captcha_' . $unique_id] ?? ''));
1261 + $first_digit = sanitize_text_field(wp_unslash($_POST['et_pb_contact_captcha_first_digit_' . $unique_id] ?? ''));
1262 + $second_digit = sanitize_text_field(wp_unslash($_POST['et_pb_contact_captcha_second_digit_' . $unique_id] ?? ''));
1263 +
1264 + if (!$captcha_answer || ((int) $first_digit + (int) $second_digit) !== (int) $captcha_answer) {
1265 + return $module_attrs;
1266 + }
1267 + } elseif ('on' === $use_spam_service) {
1268 + $provider = $module_attrs['module']['advanced']['spamProtection']['desktop']['value']['provider'] ?? 'recaptcha';
1269 + $account = $module_attrs['module']['advanced']['spamProtection']['desktop']['value']['account'] ?? '';
1270 + $min_score = (float) ($module_attrs['module']['advanced']['spamProtection']['desktop']['value']['minScore'] ?? 0.0);
1271 +
1272 + if (empty($_POST['token']) || !SpamProtectionService::validate_token($provider, $account, $min_score)) {
1273 + return $module_attrs;
1274 + }
1275 + }
1276 +
1277 + $messages = [
1278 + 'successMessage' => isset($module_attrs['module']['advanced']['successMessage']['desktop']['value']) ? $module_attrs['module']['advanced']['successMessage']['desktop']['value'] : '',
1279 + ];
1280 + if (defined('KS_PAC_DCFH_PLUGIN_FILE')) {
1281 + $send_admin_email = isset($module_attrs['adminEmail']['advanced']['adminEmailEnabled']['desktop']['value']) ? $module_attrs['adminEmail']['advanced']['adminEmailEnabled']['desktop']['value'] : 'on';
1282 + if ($send_admin_email === 'on') {
1283 + $admin_email_rich_text = isset($module_attrs['adminEmail']['advanced']['emailRichTextEnabled']['desktop']['value']) ? $module_attrs['adminEmail']['advanced']['emailRichTextEnabled']['desktop']['value'] : 'off';
1284 + if ($admin_email_rich_text === 'on') {
1285 + $messages['adminEmailRichTextMessage'] = isset($module_attrs['adminEmail']['innerContent']['emailRichTextMessage']['desktop']['value']) ? $this->decode_shortcodes($module_attrs['adminEmail']['innerContent']['emailRichTextMessage']['desktop']['value']) : '';
1286 + } else {
1287 + $messages['email'] = isset($module_attrs['email']['innerContent']['desktop']['value']) ? $module_attrs['email']['innerContent']['desktop']['value'] : '';
1288 + }
1289 + }
1290 + $send_user_email = isset($module_attrs['confirmationEmail']['advanced']['sendEmailToSubmitter']['desktop']['value']) ? $module_attrs['confirmationEmail']['advanced']['sendEmailToSubmitter']['desktop']['value'] : 'off';
1291 + if ($send_user_email === 'on') {
1292 + $user_email_rich_text = isset($module_attrs['confirmationEmail']['advanced']['emailMessageRichTextEnabled']['desktop']['value']) ? $module_attrs['confirmationEmail']['advanced']['emailMessageRichTextEnabled']['desktop']['value'] : 'off';
1293 + if ($user_email_rich_text === 'on') {
1294 + $messages['confirmationEmailRichTextMessage'] = isset($module_attrs['confirmationEmail']['innerContent']['emailRichTextMessage']['desktop']['value']) ? $this->decode_shortcodes($module_attrs['confirmationEmail']['innerContent']['emailRichTextMessage']['desktop']['value']) : '';
1295 + } else {
1296 + $messages['confirmationEmailMessage'] = isset($module_attrs['confirmationEmail']['innerContent']['emailMessage']['desktop']['value']) ? $module_attrs['confirmationEmail']['innerContent']['emailMessage']['desktop']['value'] : '';
1297 + }
1298 + }
1299 + } else {
1300 + $messages['email'] = isset($module_attrs['email']['innerContent']['desktop']['value']) ? $module_attrs['email']['innerContent']['desktop']['value'] : '';
1301 + }
1302 +
1303 + foreach ($messages as $message_key => $message) {
1304 + if (false !== strpos($message, '[')) {
1305 + $shortcode_tags = [
1306 + 'e2pdf-download',
1307 + 'e2pdf-save',
1308 + 'e2pdf-view',
1309 + 'e2pdf-adobesign',
1310 + 'e2pdf-zapier',
1311 + 'e2pdf-attachment',
1312 + ];
1313 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $message, $matches);
1314 + $tagnames = array_intersect($shortcode_tags, $matches[1]);
1315 + if (!empty($tagnames)) {
1316 + $this->set('process', true);
1317 + } else {
1318 + unset($messages[$message_key]);
1319 + }
1320 + } else {
1321 + unset($messages[$message_key]);
1322 + }
1323 + }
1324 +
1325 + $_POST = $this->sanitize($_POST);
1326 +
1327 + if (!$this->get('process')) {
1328 + return $module_attrs;
1329 + }
1330 +
1331 + if (
1332 + !class_exists('\ET\Builder\Packages\ModuleLibrary\ModuleRegistration') ||
1333 + !method_exists('\ET\Builder\Packages\ModuleLibrary\ModuleRegistration', 'get_default_attrs')) {
1334 + return $module_attrs;
1335 + }
1336 +
1337 + $fields_raw = [];
1338 + $filtered_field_attrs = [];
1339 + $fields = \ET\Builder\FrontEnd\BlockParser\BlockParserStore::get_children($module_id, $store_instance);
1340 + $default_child_attrs = \ET\Builder\Packages\ModuleLibrary\ModuleRegistration::get_default_attrs(
1341 + 'divi/contact-field'
1342 + );
1343 + foreach ($fields as $field) {
1344 + // Skip nested modules (Text, Button, Divider, etc.), only process Contact Field modules.
1345 + if ('divi/contact-field' !== $field->blockName) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- This is a property of the WP Core class.
1346 + continue;
1347 + }
1348 + $merged_child_attrs = array_replace_recursive(
1349 + $default_child_attrs,
1350 + $field->attrs ?? []
1351 + );
1352 + $child_filter_args = [
1353 + 'id' => $field->id,
1354 + 'name' => $field->blockName,
1355 + 'parentId' => $module_id,
1356 + 'parentName' => 'divi/contact-form',
1357 + 'parentAttrs' => $module_attrs,
1358 + 'storeInstance' => $store_instance,
1359 + ];
1360 + $filtered_field_attrs[$field->id] = apply_filters(
1361 + 'divi_module_library_register_module_attrs',
1362 + $merged_child_attrs,
1363 + $child_filter_args
1364 + );
1365 +
1366 + // Use pre-filtered field attributes if provided, otherwise use field attributes from storage.
1367 + $field_attrs = !empty($filtered_field_attrs[$field->id]) ? $filtered_field_attrs[$field->id] : $field->attrs;
1368 + $field_unique_id = \ET\Builder\Packages\ModuleLibrary\ContactField\ContactFieldModule::get_field_unique_id($field->id, $store_instance);
1369 + $field_type = $field_attrs['fieldItem']['advanced']['type']['desktop']['value'] ?? 'input';
1370 + $field_id = $field_attrs['fieldItem']['advanced']['id']['desktop']['value'] ?? '';
1371 + $field_key = strtolower($field_id);
1372 + $field_label = $field_attrs['fieldItem']['innerContent']['desktop']['value'] ?? '';
1373 +
1374 + if (!$field_label) {
1375 + $field_label = __('New Field', 'et_builder_5');
1376 + }
1377 +
1378 + $fields_raw[$field_key]['id'] = $field_id;
1379 + $fields_raw[$field_key]['label'] = $field_label;
1380 + $fields_raw[$field_key]['type'] = $field_type;
1381 + $fields_raw[$field_key]['allowedSymbols'] = $field_attrs['fieldItem']['advanced']['allowedSymbols']['desktop']['value'] ?? '';
1382 + $fields_raw[$field_key]['maxLength'] = $field_attrs['fieldItem']['advanced']['maxLength']['desktop']['value'] ?? '';
1383 + $fields_raw[$field_key]['minLength'] = $field_attrs['fieldItem']['advanced']['minLength']['desktop']['value'] ?? '';
1384 + $fields_raw[$field_key]['isRequired'] = 'on' === ($field_attrs['fieldItem']['advanced']['required']['desktop']['value'] ?? 'on');
1385 +
1386 + $fields_raw[$field_key]['conditionalLogic'] = [
1387 + 'enabled' => 'on' === ($field_attrs['conditionalLogic']['advanced']['enable']['desktop']['value'] ?? 'off'),
1388 + 'matchAll' => 'on' === ($field_attrs['conditionalLogic']['advanced']['relation']['desktop']['value'] ?? 'off'),
1389 + 'rules' => $field_attrs['conditionalLogic']['innerContent']['desktop']['value'] ?? [],
1390 + ];
1391 +
1392 + if ('text' === $field_type) {
1393 + $fields_raw[$field_key]['value'] = isset($_POST[$field_unique_id]) ? sanitize_textarea_field(wp_unslash($_POST[$field_unique_id])) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Validated and sanitized.
1394 + } elseif ('checkbox' === $field_type) {
1395 + // For checkbox fields, decode and sanitize immediately, store as array.
1396 + $raw_value = isset($_POST[$field_unique_id]) ? wp_unslash($_POST[$field_unique_id]) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Validated and sanitized.
1397 +
1398 + if ('' !== $raw_value) {
1399 + // Split the URL-encoded comma-separated values.
1400 + $parts = explode(',', $raw_value);
1401 + $parts = array_map('urldecode', $parts);
1402 + $parts = array_map('sanitize_text_field', $parts);
1403 + $parts = array_map('trim', $parts);
1404 + $fields_raw[$field_key]['value'] = $parts;
1405 + } else {
1406 + $fields_raw[$field_key]['value'] = [];
1407 + }
1408 + } else {
1409 + $fields_raw[$field_key]['value'] = isset($_POST[$field_unique_id]) ? sanitize_text_field(wp_unslash($_POST[$field_unique_id])) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Validated and sanitized.
1410 + }
1411 +
1412 + switch ($field_type) {
1413 + case 'checkbox':
1414 + $options = $field_attrs['fieldItem']['advanced']['checkboxOptions']['desktop']['value'] ?? [];
1415 + $fields_raw[$field_key]['options'] = is_array($options) ? array_map(
1416 + function ($option) {
1417 + return wp_strip_all_tags($option['value'] ?? '');
1418 + },
1419 + $options
1420 + ) : [];
1421 + break;
1422 + case 'radio':
1423 + $options = $field_attrs['fieldItem']['advanced']['radioOptions']['desktop']['value'] ?? [];
1424 + $fields_raw[$field_key]['options'] = is_array($options) ? array_map(
1425 + function ($option) {
1426 + return sanitize_text_field($option['value'] ?? '');
1427 + },
1428 + $options
1429 + ) : [];
1430 + break;
1431 + case 'select':
1432 + $options = $field_attrs['fieldItem']['advanced']['selectOptions']['desktop']['value'] ?? [];
1433 + $fields_raw[$field_key]['options'] = is_array($options) ? array_map(
1434 + function ($option) {
1435 + return sanitize_text_field($option['value'] ?? '');
1436 + },
1437 + $options
1438 + ) : [];
1439 + break;
1440 + default:
1441 + $fields_raw[$field_key]['options'] = [];
1442 + break;
1443 + }
1444 + }
1445 +
1446 + $refClass = new ReflectionClass('\ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormHandler');
1447 + $obj = $refClass->newInstanceWithoutConstructor();
1448 +
1449 + try {
1450 + $refFields = $refClass->getProperty('_fields_raw');
1451 + $refFields->setAccessible(true);
1452 + $refFields->setValue($obj, $fields_raw);
1453 +
1454 + $refError = $refClass->getProperty('_error');
1455 + $refError->setAccessible(true);
1456 + $refError->setValue($obj, new WP_Error());
1457 + } catch (\ReflectionException $e) {
1458 + return $module_attrs;
1459 + }
1460 +
1461 + $obj->validate_fields();
1462 + $errorObj = $refError->getValue($obj);
1463 +
1464 + if ($errorObj->has_errors()) {
1465 + return $module_attrs;
1466 + }
1467 +
1468 + $fields_raw = $refFields->getValue($obj);
1469 +
1470 + $item = !empty($module_attrs['module']['meta']['adminLabel']['desktop']['value']) ? $module_attrs['module']['meta']['adminLabel']['desktop']['value'] : '';
1471 + if (!$item) {
1472 + return $module_attrs;
1473 + }
1474 +
1475 + $data = [
1476 + 'E2PDF_VERSION' => '1.32.40',
1477 + 'fields' => [],
1478 + 'options' => [
1479 + 'timestamp' => current_time('mysql'),
1480 + 'saveFilesToMedia' => !empty($module_attrs['entryPreferences']['advanced']['saveFilesToMedia']['desktop']['value']) ? $module_attrs['entryPreferences']['advanced']['saveFilesToMedia']['desktop']['value'] : '',
1481 + 'uniqueId' => !empty($module_attrs['module']['advanced']['uniqueId']['desktop']['value']) ? $module_attrs['module']['advanced']['uniqueId']['desktop']['value'] : '',
1482 + ],
1483 + ];
1484 +
1485 + if (!empty($fields_raw) && is_array($fields_raw)) {
1486 + foreach ($fields_raw as $field_key => $field_raw) {
1487 + if (isset($field_raw['value'])) {
1488 + $data['fields'][$field_key] = [
1489 + 'type' => isset($field_raw['type']) ? $field_raw['type'] : '',
1490 + 'value' => $field_raw['value'],
1491 + ];
1492 + }
1493 + }
1494 + }
1495 + if (empty($data['fields']['_wp_http_referer']) && !empty($_POST['_wp_http_referer'])) {
1496 + $data['fields']['_wp_http_referer'] = [
1497 + 'type' => '',
1498 + 'value' => esc_url_raw($_POST['_wp_http_referer']),
1499 + ];
1500 + }
1501 +
1502 + $entry = new Model_E2pdf_Dataset();
1503 + $entry->set('extension', 'divi');
1504 + $entry->set('item', $item);
1505 + $entry->set('entry', $data);
1506 + $dataset = $entry->save();
1507 +
1508 + foreach ($messages as $message_key => $message) {
1509 + if (false !== strpos($message, '[')) {
1510 + $shortcode_tags = [
1511 + 'e2pdf-download',
1512 + 'e2pdf-save',
1513 + 'e2pdf-view',
1514 + 'e2pdf-adobesign',
1515 + 'e2pdf-zapier',
1516 + 'e2pdf-attachment',
1517 + ];
1518 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $message, $matches);
1519 + $tagnames = array_intersect($shortcode_tags, $matches[1]);
1520 + if (!empty($tagnames)) {
1521 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $message, $shortcodes);
1522 + foreach ($shortcodes[0] as $key => $shortcode_value) {
1523 + $item = false;
1524 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1525 + $atts = shortcode_parse_atts($shortcode[3]);
1526 +
1527 + if (!isset($atts['dataset']) && isset($atts['id'])) {
1528 + $template = new Model_E2pdf_Template();
1529 + $template->load($atts['id']);
1530 + if ($template->get('extension') === 'divi') {
1531 + $item = $template->get('item');
1532 + $atts['dataset'] = $dataset;
1533 + $shortcode[3] .= ' dataset="' . $dataset . '"';
1534 + }
1535 + }
1536 + if (!isset($atts['apply'])) {
1537 + $shortcode[3] .= ' apply="true"';
1538 + }
1539 + if (!isset($atts['iframe_download'])) {
1540 + $shortcode[3] .= ' iframe_download="true"';
1541 + }
1542 + switch ($message_key) {
1543 + case 'successMessage':
1544 + $module_attrs['module']['advanced']['successMessage']['desktop']['value'] = str_replace($shortcode_value, do_shortcode_tag($shortcode), $module_attrs['module']['advanced']['successMessage']['desktop']['value']);
1545 + break;
1546 + case 'email':
1547 + $module_attrs['email']['innerContent']['desktop']['value'] = str_replace($shortcode_value, '[' . $shortcode[2] . $shortcode[3] . ']', $module_attrs['email']['innerContent']['desktop']['value']);
1548 + break;
1549 + case 'adminEmailRichTextMessage':
1550 + case 'confirmationEmailMessage':
1551 + case 'confirmationEmailRichTextMessage':
1552 + $messages[$message_key] = str_replace($shortcode_value, '{' . $shortcode[2] . $shortcode[3] . '}', $messages[$message_key]);
1553 + break;
1554 + default:
1555 + break;
1556 + }
1557 + }
1558 + }
1559 + }
1560 + }
1561 +
1562 + foreach ($messages as $message_key => $message) {
1563 + switch ($message_key) {
1564 + case 'adminEmailRichTextMessage':
1565 + $class = '\KS_PAC_DCFH\Frontend\Controllers\ContactFormDataRepository';
1566 + if (class_exists($class) && method_exists($class, 'instance')) {
1567 + $contact_form_rep = $class::instance();
1568 + $contact_form_rep->admin_message = $messages[$message_key];
1569 + }
1570 + break;
1571 + case 'confirmationEmailMessage':
1572 + case 'confirmationEmailRichTextMessage':
1573 + $class = '\KS_PAC_DCFH\Frontend\Services\ConfirmationEmailService';
1574 + if (class_exists($class) && method_exists($class, 'instance')) {
1575 + $contact_form_rep = $class::instance();
1576 + $contact_form_rep->email_message = $messages[$message_key];
1577 + }
1578 + break;
1579 + default:
1580 + break;
1581 + }
1582 + }
1583 + return $module_attrs;
1584 + }
1585 +
1016 1586 // filter shortcode attributes
1017 1587 public function filter_et_pb_module_shortcode_attributes($props, $attrs, $render_slug, $address, $content) {
1018 1588
1019 1589 if ($render_slug !== 'et_pb_contact_form') {
@@ -1024,78 +1594,78 @@
1024 1594 if ($et_contact_proccess === false) {
1025 1595 return $props;
1026 1596 }
1027 1597
1028 - $e2pdf_shortcodes = false;
1598 + $success_message = isset($props['success_message']) ? $this->decode_shortcodes($props['success_message'], true) : '';
1029 1599
1030 - $success_message = isset($props['success_message']) ? str_replace(array('&#91;', '&#93;', '&quot;'), array('[', ']', '"'), $props['success_message']) : '';
1031 1600 if (false !== strpos($success_message, '[')) {
1032 - $shortcode_tags = array(
1601 + $shortcode_tags = [
1033 1602 'e2pdf-download',
1034 1603 'e2pdf-save',
1035 1604 'e2pdf-view',
1036 1605 'e2pdf-adobesign',
1037 1606 'e2pdf-zapier',
1038 - );
1607 + ];
1039 1608 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1040 1609 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1041 1610 if (!empty($tagnames)) {
1042 - $e2pdf_shortcodes = true;
1611 + $this->set('process', true);
1043 1612 } else {
1044 1613 $success_message = '';
1045 1614 }
1046 1615 }
1047 1616
1048 - $use_custom_message_richtext = isset($props['use_custom_message_richtext']) && $props['use_custom_message_richtext'] == 'on' && isset($props['custom_message_richtext']) ? true : false;
1049 - if ($use_custom_message_richtext) {
1050 - $custom_message = str_replace(array('&#91;', '&#93;'), array('[', ']'), $props['custom_message_richtext']);
1617 + $admin_email_rich_text = isset($props['use_custom_message_richtext']) && $props['use_custom_message_richtext'] == 'on' && isset($props['custom_message_richtext']) ? true : false;
1618 + if ($admin_email_rich_text) {
1619 + $admin_email_message = $this->decode_shortcodes($props['custom_message_richtext']);
1051 1620 } else {
1052 - $custom_message = isset($props['custom_message']) ? str_replace(array('&#91;', '&#93;'), array('[', ']'), $props['custom_message']) : '';
1621 + $admin_email_message = isset($props['custom_message']) ? $this->decode_shortcodes($props['custom_message']) : '';
1053 1622 }
1054 - if (false !== strpos($custom_message, '[')) {
1055 - $shortcode_tags = array(
1623 + if (false !== strpos($admin_email_message, '[')) {
1624 + $shortcode_tags = [
1056 1625 'e2pdf-download',
1057 1626 'e2pdf-save',
1058 1627 'e2pdf-attachment',
1059 1628 'e2pdf-adobesign',
1060 1629 'e2pdf-zapier',
1061 - );
1062 -
1063 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $custom_message, $matches);
1630 + ];
1631 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $admin_email_message, $matches);
1064 1632 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1065 1633 if (!empty($tagnames)) {
1066 - $e2pdf_shortcodes = true;
1634 + $this->set('process', true);
1067 1635 } else {
1068 - $custom_message = '';
1636 + $admin_email_message = '';
1069 1637 }
1070 1638 }
1071 1639
1072 1640 /* Divi Contact Form Helper Confirmation Email and Confirmation Email RichText */
1073 - $use_confirmation_message_richtext = isset($props['use_confirmation_email']) && $props['use_confirmation_email'] == 'on' && isset($props['use_confirmation_message_richtext']) && $props['use_confirmation_message_richtext'] == 'on' && isset($props['confirmation_message_richtext']) ? true : false;
1074 - if ($use_confirmation_message_richtext) {
1075 - $confirmation_email_message = str_replace(array('&#91;', '&#93;'), array('[', ']'), $props['confirmation_message_richtext']);
1641 + $user_email_rich_text = isset($props['use_confirmation_email']) && $props['use_confirmation_email'] == 'on' && isset($props['use_confirmation_message_richtext']) && $props['use_confirmation_message_richtext'] == 'on' && isset($props['confirmation_message_richtext']) ? true : false;
1642 + if ($user_email_rich_text) {
1643 + $user_email_message = $this->decode_shortcodes($props['confirmation_message_richtext']);
1076 1644 } else {
1077 - $confirmation_email_message = isset($props['use_confirmation_email']) && $props['use_confirmation_email'] == 'on' && isset($props['confirmation_email_message']) ? str_replace(array('&#91;', '&#93;'), array('[', ']'), $props['confirmation_email_message']) : '';
1645 + $user_email_message = isset($props['use_confirmation_email']) && $props['use_confirmation_email'] == 'on' && isset($props['confirmation_email_message']) ? $this->decode_shortcodes($props['confirmation_email_message']) : '';
1078 1646 }
1079 - if (false !== strpos($confirmation_email_message, '[')) {
1080 - $shortcode_tags = array(
1647 + if (false !== strpos($user_email_message, '[')) {
1648 + $shortcode_tags = [
1081 1649 'e2pdf-download',
1082 1650 'e2pdf-save',
1083 1651 'e2pdf-attachment',
1084 1652 'e2pdf-adobesign',
1085 1653 'e2pdf-zapier',
1086 - );
1087 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $confirmation_email_message, $matches);
1654 + ];
1655 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $user_email_message, $matches);
1088 1656 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1089 1657 if (!empty($tagnames)) {
1090 - $e2pdf_shortcodes = true;
1658 + $this->set('process', true);
1091 1659 } else {
1092 - $confirmation_email_message = '';
1660 + $user_email_message = '';
1093 1661 }
1094 1662 }
1095 1663
1664 + $_POST = $this->sanitize($_POST);
1665 +
1096 1666 // check if E2Pdf shortcodes exist in messages
1097 - if (!$e2pdf_shortcodes) {
1667 + if (!$this->get('process')) {
1098 1668 return $props;
1099 1669 }
1100 1670
1101 1671 $data = $_POST;
@@ -1152,9 +1722,9 @@
1152 1722 }
1153 1723
1154 1724 // check all fields on current form and generate error message if needed
1155 1725 if (!empty($fields_data_array)) {
1156 - foreach ($fields_data_array as $index => $value) {
1726 + foreach ($fields_data_array as $value) {
1157 1727 if (isset($value['field_id']) && 'et_pb_contact_et_number_' . $et_pb_contact_form_num === $value['field_id']) {
1158 1728 continue;
1159 1729 }
1160 1730 /* Check all the required fields, generate error message if required field is empty */
@@ -1179,17 +1749,27 @@
1179 1749 $et_contact_error = true;
1180 1750 }
1181 1751
1182 1752 if (!$et_contact_error && $nonce_result) {
1753 + // divi contact form helper 2.1.3 bug fix wp_mail filter removed at maybe_filter_wp_mail
1754 + if (defined('KS_PAC_DCFH_PLUGIN_VERSION') && version_compare(KS_PAC_DCFH_PLUGIN_VERSION, '2.1.3', '>=')) {
1755 + add_filter(
1756 + 'wp_mail', function ($args) {
1757 + return $args;
1758 + }, 999
1759 + );
1760 + }
1761 + add_filter('wp_mail', [$this, 'filter_wp_mail'], 1000);
1762 +
1183 1763 $dataset = false;
1184 1764 if (false !== strpos($success_message, '[')) {
1185 - $shortcode_tags = array(
1765 + $shortcode_tags = [
1186 1766 'e2pdf-download',
1187 1767 'e2pdf-save',
1188 1768 'e2pdf-view',
1189 1769 'e2pdf-adobesign',
1190 1770 'e2pdf-zapier',
1191 - );
1771 + ];
1192 1772 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1193 1773 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1194 1774 if (!empty($tagnames)) {
1195 1775 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $success_message, $shortcodes);
@@ -1220,28 +1800,26 @@
1220 1800 }
1221 1801 if (!isset($atts['iframe_download'])) {
1222 1802 $shortcode[3] .= ' iframe_download="true"';
1223 1803 }
1224 - $props['success_message'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['success_message']);
1804 + $props['success_message'] = str_replace($this->encode_shortcodes($shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['success_message']);
1225 1805 }
1226 1806 }
1227 1807 }
1228 1808 }
1229 1809
1230 - if (false !== strpos($custom_message, '[')) {
1231 - $shortcode_tags = array(
1810 + if (false !== strpos($admin_email_message, '[')) {
1811 + $shortcode_tags = [
1232 1812 'e2pdf-download',
1233 1813 'e2pdf-save',
1234 1814 'e2pdf-attachment',
1235 1815 'e2pdf-adobesign',
1236 1816 'e2pdf-zapier',
1237 - );
1238 -
1239 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $custom_message, $matches);
1817 + ];
1818 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $admin_email_message, $matches);
1240 1819 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1241 1820 if (!empty($tagnames)) {
1242 - preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $custom_message, $shortcodes);
1243 - add_filter('wp_mail', array($this, 'filter_wp_mail'), 11);
1821 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $admin_email_message, $shortcodes);
1244 1822 foreach ($shortcodes[0] as $key => $shortcode_value) {
1245 1823 $item = false;
1246 1824 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1247 1825 $atts = shortcode_parse_atts($shortcode[3]);
@@ -1260,34 +1838,33 @@
1260 1838 $atts['dataset'] = $dataset;
1261 1839 $shortcode[3] .= ' dataset="' . $dataset . '"';
1262 1840 }
1263 1841 }
1264 - if ($use_custom_message_richtext) {
1842 + if ($admin_email_rich_text) {
1265 1843 if ((defined('PWH_DCFH_PLUGIN_VERSION') && version_compare(PWH_DCFH_PLUGIN_VERSION, '1.5.1', '>=')) || defined('KS_PAC_DCFH_PLUGIN_FILE')) {
1266 - $props['custom_message_richtext'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), '{{' . $shortcode[2] . $shortcode[3] . '}}', $props['custom_message_richtext']);
1844 + $props['custom_message_richtext'] = str_replace($this->encode_shortcodes($shortcode_value), '{' . $shortcode[2] . $shortcode[3] . '}', $props['custom_message_richtext']);
1267 1845 } else {
1268 - $props['custom_message_richtext'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['custom_message_richtext']);
1846 + $props['custom_message_richtext'] = str_replace($this->encode_shortcodes($shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['custom_message_richtext']);
1269 1847 }
1270 1848 } else {
1271 - $props['custom_message'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['custom_message']);
1849 + $props['custom_message'] = str_replace($this->encode_shortcodes($shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['custom_message']);
1272 1850 }
1273 1851 }
1274 1852 }
1275 1853 }
1276 1854
1277 - if (false !== strpos($confirmation_email_message, '[')) {
1278 - $shortcode_tags = array(
1855 + if (false !== strpos($user_email_message, '[')) {
1856 + $shortcode_tags = [
1279 1857 'e2pdf-download',
1280 1858 'e2pdf-save',
1281 1859 'e2pdf-attachment',
1282 1860 'e2pdf-adobesign',
1283 1861 'e2pdf-zapier',
1284 - );
1285 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $confirmation_email_message, $matches);
1862 + ];
1863 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $user_email_message, $matches);
1286 1864 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1287 1865 if (!empty($tagnames)) {
1288 - preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $confirmation_email_message, $shortcodes);
1289 - add_filter('wp_mail', array($this, 'filter_wp_mail_pwh_dcfh'), 11);
1866 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $user_email_message, $shortcodes);
1290 1867 foreach ($shortcodes[0] as $key => $shortcode_value) {
1291 1868 $item = false;
1292 1869 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1293 1870 $atts = shortcode_parse_atts($shortcode[3]);
@@ -1307,18 +1884,18 @@
1307 1884 $shortcode[3] .= ' dataset="' . $dataset . '"';
1308 1885 }
1309 1886 }
1310 1887 if ((defined('PWH_DCFH_PLUGIN_VERSION') && version_compare(PWH_DCFH_PLUGIN_VERSION, '1.5.1', '>=')) || defined('KS_PAC_DCFH_PLUGIN_FILE')) {
1311 - if ($use_confirmation_message_richtext) {
1312 - $props['confirmation_message_richtext'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), '{{' . $shortcode[2] . $shortcode[3] . '}}', $props['confirmation_message_richtext']);
1888 + if ($user_email_rich_text) {
1889 + $props['confirmation_message_richtext'] = str_replace($this->encode_shortcodes($shortcode_value), '{' . $shortcode[2] . $shortcode[3] . '}', $props['confirmation_message_richtext']);
1313 1890 } else {
1314 - $props['confirmation_email_message'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), '{{' . $shortcode[2] . $shortcode[3] . '}}', $props['confirmation_email_message']);
1891 + $props['confirmation_email_message'] = str_replace($this->encode_shortcodes($shortcode_value), '{' . $shortcode[2] . $shortcode[3] . '}', $props['confirmation_email_message']);
1315 1892 }
1316 1893 } else {
1317 - if ($use_confirmation_message_richtext) {
1318 - $props['confirmation_message_richtext'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['confirmation_message_richtext']);
1894 + if ($user_email_rich_text) {
1895 + $props['confirmation_message_richtext'] = str_replace($this->encode_shortcodes($shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['confirmation_message_richtext']);
1319 1896 } else {
1320 - $props['confirmation_email_message'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['confirmation_email_message']);
1897 + $props['confirmation_email_message'] = str_replace($this->encode_shortcodes($shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['confirmation_email_message']);
1321 1898 }
1322 1899 }
1323 1900 }
1324 1901 }
@@ -1339,9 +1916,9 @@
1339 1916 if ($et_contact_proccess === false) {
1340 1917 return $output;
1341 1918 }
1342 1919
1343 - $et_pb_contact_form_num = str_replace(array('pwh_dcfh_et_pb_contactform_submit_', 'et_pb_contactform_submit_'), array('', ''), $et_contact_proccess);
1920 + $et_pb_contact_form_num = str_replace(['pwh_dcfh_et_pb_contactform_submit_', 'et_pb_contactform_submit_'], ['', ''], $et_contact_proccess);
1344 1921 $nonce_result = isset($_POST['_wpnonce-et-pb-contact-form-submitted-' . $et_pb_contact_form_num]) && wp_verify_nonce($_POST['_wpnonce-et-pb-contact-form-submitted-' . $et_pb_contact_form_num], 'et-pb-contact-form-submit') ? true : false;
1345 1922
1346 1923 if ($nonce_result && (
1347 1924 (isset($_POST['et_pb_contactform_submit_' . $et_pb_contact_form_num]) && empty($_POST['et_pb_contact_et_number_' . $et_pb_contact_form_num])) ||
@@ -1347,18 +1924,17 @@
1347 1924 (isset($_POST['et_pb_contactform_submit_' . $et_pb_contact_form_num]) && empty($_POST['et_pb_contact_et_number_' . $et_pb_contact_form_num])) ||
1348 1925 (isset($_POST['pwh_dcfh_et_pb_contactform_submit_' . $et_pb_contact_form_num]) && $_POST['pwh_dcfh_et_pb_contactform_submit_' . $et_pb_contact_form_num] == 'et_contact_proccess')
1349 1926 )
1350 1927 ) {
1351 -
1352 - $success_message = isset($form->props['success_message']) ? str_replace(array('&#91;', '&#93;', '&quot;'), array('[', ']', '"'), $form->props['success_message']) : '';
1928 + $success_message = isset($form->props['success_message']) ? $this->decode_shortcodes($form->props['success_message'], true) : '';
1353 1929 if (false !== strpos($success_message, '[')) {
1354 - $shortcode_tags = array(
1930 + $shortcode_tags = [
1355 1931 'e2pdf-download',
1356 1932 'e2pdf-save',
1357 1933 'e2pdf-view',
1358 1934 'e2pdf-adobesign',
1359 1935 'e2pdf-zapier',
1360 - );
1936 + ];
1361 1937 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1362 1938 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1363 1939 if (!empty($tagnames)) {
1364 1940 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $success_message, $shortcodes);
@@ -1366,26 +1942,14 @@
1366 1942 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1367 1943 if (isset($form->props['enable_multistep']) && 'on' === $form->props['enable_multistep']) {
1368 1944 $output = str_replace($shortcode_value, do_shortcode_tag($shortcode), $output);
1369 1945 } else {
1370 - $output = str_replace(str_replace(array('"'), array('&quot;'), $shortcode_value), do_shortcode_tag($shortcode), $output);
1946 + $output = str_replace(str_replace(['"'], ['&quot;'], $shortcode_value), do_shortcode_tag($shortcode), $output);
1371 1947 }
1372 1948 }
1373 1949 }
1374 1950 }
1375 1951 }
1376 -
1377 - remove_filter('wp_mail', array($this, 'filter_wp_mail'), 11);
1378 - remove_filter('wp_mail', array($this, 'filter_wp_mail_pwh_dcfh'), 11);
1379 -
1380 - $files = $this->helper->get('divi_attachments');
1381 - if (is_array($files) && !empty($files)) {
1382 - foreach ($files as $key => $file) {
1383 - $this->helper->delete_dir(dirname($file) . '/');
1384 - }
1385 - $this->helper->deset('divi_attachments');
1386 - }
1387 -
1388 1952 return $output;
1389 1953 }
1390 1954
1391 1955 // delete item
@@ -1394,13 +1958,13 @@
1394 1958 $template = new Model_E2pdf_Template();
1395 1959 if ($template_id && $dataset && $template->load($template_id)) {
1396 1960 if ($template->get('extension') === 'divi' && $template->get('item')) {
1397 1961 $item = $template->get('item');
1398 - $where = array(
1962 + $where = [
1399 1963 'ID' => $dataset,
1400 1964 'item' => $item,
1401 1965 'extension' => 'divi',
1402 - );
1966 + ];
1403 1967 $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1404 1968 return true;
1405 1969 }
1406 1970 }
@@ -1412,12 +1976,12 @@
1412 1976 global $wpdb;
1413 1977 $template = new Model_E2pdf_Template();
1414 1978 if ($template_id && $template->load($template_id)) {
1415 1979 if ($template->get('extension') === 'divi' && $template->get('item')) {
1416 - $where = array(
1980 + $where = [
1417 1981 'item' => $template->get('item'),
1418 1982 'extension' => 'divi',
1419 - );
1983 + ];
1420 1984 $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1421 1985 return true;
1422 1986 }
1423 1987 }
@@ -1425,10 +1989,172 @@
1425 1989 }
1426 1990
1427 1991 // styles
1428 1992 public function styles($item_id = false) {
1429 - $styles = array(
1430 - plugins_url('css/extension/divi.css?v=' . time(), $this->helper->get('plugin_file_path')),
1993 + $styles = [];
1994 + if ($this->divi5()) {
1995 + $assets_list = \ET\Builder\FrontEnd\Assets\DynamicAssetsUtils::get_assets_list(
1996 + [
1997 + 'prefix' => \ET\Builder\FrontEnd\Assets\DynamicAssetsUtils::get_dynamic_assets_path(),
1998 + 'suffix' => '',
1999 + 'specialty_suffix' => '',
2000 + ]
2001 + );
2002 + foreach ($assets_list as $list) {
2003 + if (!empty($list['css']) && is_array($list['css'])) {
2004 + foreach ($list['css'] as $css) {
2005 + $styles[] = $this->wp_convert_path_to_url($css);
2006 + }
2007 + }
2008 + }
2009 + }
2010 + $styles[] = plugins_url('css/extension/divi.css?v=' . time(), $this->helper->get('plugin_file_path'));
2011 + return $styles;
2012 + }
2013 +
2014 + public function wp_convert_path_to_url($path) {
2015 + // Standardize slashes for Windows/Linux compatibility
2016 + $path = wp_normalize_path($path);
2017 + $root = wp_normalize_path(ABSPATH);
2018 +
2019 + // Replace the server root with the Site URL
2020 + return str_replace($root, site_url('/'), $path);
2021 + }
2022 +
2023 + // sanitize
2024 + public function sanitize($value) {
2025 + if (is_array($value)) {
2026 + foreach ($value as $k => $v) {
2027 + $value[$k] = $this->sanitize($v);
2028 + }
2029 + return $value;
2030 + }
2031 + if (!is_string($value)) {
2032 + return $value;
2033 + }
2034 + if (stripos($value, 'e2pdf-') === false) {
2035 + return $value;
2036 + }
2037 + return preg_replace('/(?:\[|&#91;|\{)(e2pdf-download|e2pdf-view|e2pdf-save|e2pdf-attachment|e2pdf-adobesign|e2pdf-zapier)[^\]}\r\n]*(?:\]|&#93;|\})/i', '', $value);
2038 + }
2039 +
2040 + // decode shortcodes
2041 + public function decode_shortcodes($value = '', $quote = false) {
2042 + return preg_replace_callback(
2043 + '/(&#91;)((e2pdf-download|e2pdf-view|e2pdf-save|e2pdf-attachment|e2pdf-adobesign|e2pdf-zapier)[^&]*?)(&#93;)/',
2044 + function ($m) use ($quote) {
2045 + $shortcode = $m[2];
2046 + if ($quote !== false) {
2047 + $shortcode = str_replace('&quot;', '"', $shortcode);
2048 + }
2049 +
2050 + return '[' . $shortcode . ']';
2051 + },
2052 + $value
1431 2053 );
1432 - return $styles;
2054 + }
2055 +
2056 + // encode shortcodes
2057 + public function encode_shortcodes($value = '', $quote = false) {
2058 + return preg_replace_callback(
2059 + '/(\[)((e2pdf-download|e2pdf-view|e2pdf-save|e2pdf-attachment|e2pdf-adobesign|e2pdf-zapier)[^\]]*?)(\])/',
2060 + function ($m) use ($quote) {
2061 + $shortcode = $m[2];
2062 + if ($quote !== false) {
2063 + $shortcode = str_replace('"', '&quot;', $shortcode);
2064 + }
2065 +
2066 + return '&#91;' . $shortcode . '&#93;';
2067 + },
2068 + $value
2069 + );
2070 + }
2071 +
2072 + // divi4 load
2073 + public function divi4_load() {
2074 + if (defined('ET_BUILDER_DIR') && !$this->divi5()) {
2075 + require_once ET_BUILDER_DIR . 'class-et-builder-element.php';
2076 + require_once ET_BUILDER_DIR . 'functions.php';
2077 + require_once ET_BUILDER_DIR . 'ab-testing.php';
2078 + require_once ET_BUILDER_DIR . 'class-et-global-settings.php';
2079 + if (file_exists(ET_BUILDER_DIR . 'module/type/WithSpamProtection.php')) {
2080 + require_once ET_BUILDER_DIR . 'module/type/WithSpamProtection.php';
2081 + }
2082 + require_once ET_BUILDER_DIR . 'module/ContactForm.php';
2083 + require_once ET_BUILDER_DIR . 'module/ContactFormItem.php';
2084 + new ET_Builder_Module_Contact_Form();
2085 + new ET_Builder_Module_Contact_Form_Item();
2086 + }
2087 + }
2088 +
2089 + // is divi5
2090 + public function divi5() {
2091 + if (defined('ET_CORE_VERSION') && version_compare(ET_CORE_VERSION, '4.99', '>')) {
2092 + return true;
2093 + }
2094 + return false;
2095 + }
2096 +
2097 + // is divi4 form
2098 + public function divi4_form($content = '') {
2099 + return (false !== strpos($content, '[et_pb_contact_form'));
2100 + }
2101 +
2102 + // is divi 5 form
2103 + public function divi5_form($content = '') {
2104 + return (false !== strpos($content, 'wp:divi/contact-form'));
2105 + }
2106 +
2107 + // pwh dcfh resolve file url
2108 + public function pwh_dcfh_resolve_file_url($file, $options) {
2109 +
2110 + if (!$file) {
2111 + return $file;
2112 + }
2113 +
2114 + if (!function_exists('ks_pac_dcfh_app') || !function_exists('path_join')) {
2115 + return $file;
2116 + }
2117 +
2118 + $contact_form_id = $options['uniqueId'];
2119 + $timestamp = strtotime($options['timestamp']);
2120 + $saveFilesToMedia = $options['saveFilesToMedia'] === 'on' ? true : false;
2121 +
2122 + $upload_dir = path_join(
2123 + 'pwh-dcfh-uploads',
2124 + 'forms/' . $contact_form_id . '/'
2125 + );
2126 + $upload_path = ks_pac_dcfh_app()->file_utils()::get_wp_upload_dir(
2127 + $upload_dir,
2128 + 'basedir'
2129 + );
2130 + $upload_url = ks_pac_dcfh_app()->file_utils()::get_wp_upload_dir(
2131 + $upload_dir,
2132 + 'baseurl'
2133 + );
2134 + if ($saveFilesToMedia) {
2135 + $wp_upload_dir = wp_upload_dir();
2136 + $upload_path = $wp_upload_dir['basedir'];
2137 + $upload_url = $wp_upload_dir['baseurl'];
2138 + }
2139 + $dates = [
2140 + date('Y/m', $timestamp),
2141 + date('Y/m', strtotime('-1 month', $timestamp)),
2142 + date('Y/m', strtotime('+1 month', $timestamp)),
2143 + ];
2144 +
2145 + foreach ($dates as $date) {
2146 + $date_path = path_join(
2147 + $upload_path,
2148 + $date
2149 + );
2150 + if (@file_exists(path_join($date_path, $file))) {
2151 + $file = path_join(
2152 + trailingslashit($upload_url) . $date,
2153 + $file
2154 + );
2155 + break;
2156 + }
2157 + }
2158 + return $file;
1433 2159 }
1434 2160 }