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 +1675 -1094 1.06.02 → 1.32.53 View file →
@@ -1,14 +1,12 @@
1 1 <?php
2 2
3 3 /**
4 - * E2pdf Divi Extension
5 - *
6 - * @copyright Copyright 2017 https://e2pdf.com
7 - * @license GPL v2
8 - * @version 1
9 - * @link https://e2pdf.com
10 - * @since 0.00.01
4 + * File: /extension/e2pdf-divi.php
5 + *
6 + * @package E2Pdf
7 + * @license GPLv3
8 + * @link https://e2pdf.com
11 9 */
12 10 if (!defined('ABSPATH')) {
13 11 die('Access denied.');
14 12 }
@@ -15,43 +13,30 @@
15 13
16 14 class Extension_E2pdf_Divi extends Model_E2pdf_Model {
17 15
18 16 private $options;
19 - private $info = array(
17 + private $info = [
20 18 'key' => 'divi',
21 - 'title' => 'Divi'
22 - );
19 + 'title' => 'Divi Forms',
20 + ];
23 21
24 - function __construct() {
25 - parent::__construct();
26 - }
27 -
28 - /**
29 - * Get info about extension
30 - *
31 - * @param string $key - Key to get assigned extension info value
32 - *
33 - * @return array|string - Extension Key and Title or Assigned extension info value
34 - */
22 + // info
35 23 public function info($key = false) {
36 24 if ($key && isset($this->info[$key])) {
37 25 return $this->info[$key];
38 26 } else {
39 - return array(
40 - $this->info['key'] => $this->info['title']
41 - );
27 + return [
28 + $this->info['key'] => $this->info['title'],
29 + ];
42 30 }
43 31 }
44 32
45 - /**
46 - * Check if needed plugin active
47 - *
48 - * @return bool - Activated/Not Activated plugin
49 - */
33 + // active
50 34 public function active() {
51 - if (file_exists(get_template_directory() . "/et-pagebuilder/et-pagebuilder.php")) {
52 - require_once(get_template_directory() . "/et-pagebuilder/et-pagebuilder.php");
53 - if (defined('ET_BUILDER_THEME')) {
35 + if (file_exists(get_template_directory() . '/et-pagebuilder/et-pagebuilder.php')) {
36 + return true;
37 + } else {
38 + if (defined('E2PDF_DIVI_EXTENSION') || $this->helper->load('extension')->is_plugin_active('divi-builder/divi-builder.php')) {
54 39 return true;
55 40 }
56 41 }
57 42 return false;
@@ -56,119 +41,211 @@
56 41 }
57 42 return false;
58 43 }
59 44
60 - /**
61 - * Set option
62 - *
63 - * @param string $attr - Key of option
64 - * @param string $value - Value of option
65 - *
66 - * @return bool - Status of setting option
67 - */
45 + // set
68 46 public function set($key, $value) {
69 47 if (!isset($this->options)) {
70 48 $this->options = new stdClass();
71 49 }
50 + $this->options->$key = $value;
51 + switch ($key) {
52 + case 'dataset':
53 + $this->set('cached_entry', []);
54 + $this->set('cached_meta', []);
55 + if ($this->get('item') && $this->get('dataset')) {
56 + $entry = new Model_E2pdf_Dataset();
57 + if ($entry->load($this->get('dataset'), $this->get('item'), 'divi')) {
58 + $cached_entry = $entry->get('entry');
59 + $this->set('cached_entry', $cached_entry);
72 60
73 - $this->options->$key = $value;
61 + $meta_data = [];
62 + if ($cached_entry && is_array($cached_entry)) {
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']);
75 + }
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']))) {
114 + $subdir = $tmpsubdir;
115 + }
116 + }
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 + }
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'] = '';
138 + }
139 + }
140 + }
141 + }
142 + }
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 + }
159 + }
160 + }
161 + $this->set('cached_meta', $meta_data);
162 + }
163 + }
164 + break;
165 + default:
166 + break;
167 + }
74 168 }
75 169
76 - /**
77 - * Get option by key
78 - *
79 - * @param string $key - Key to get assigned option value
80 - *
81 - * @return mixed
82 - */
170 + // get
83 171 public function get($key) {
84 172 if (isset($this->options->$key)) {
85 173 $value = $this->options->$key;
86 - return $value;
87 - } elseif ($key == 'args') {
88 - return array();
89 174 } else {
90 - return false;
175 + switch ($key) {
176 + case 'args':
177 + case 'cached_entry':
178 + case 'cached_meta':
179 + $value = [];
180 + break;
181 + default:
182 + $value = false;
183 + break;
184 + }
91 185 }
186 + return $value;
92 187 }
93 188
94 - /**
95 - * Get items to work with
96 - *
97 - * @return array() - List of available items
98 - */
189 + // items
99 190 public function items() {
100 191 global $wpdb;
101 -
102 - $condition = array(
103 - 'post_content' => array(
192 + $condition = [
193 + 'post_content' => [
104 194 'condition' => 'LIKE',
105 195 'value' => '%et_pb_contact_form%',
106 - 'type' => '%s'
107 - ),
108 - 'post_type' => array(
196 + 'type' => '%s',
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' => [
109 208 'condition' => '<>',
110 - 'value' => array(
209 + 'value' => [
111 210 'revision',
112 - 'et_pb_layout'
113 - ),
114 - 'type' => '%s'
115 - ),
116 - );
117 -
118 - $order_condition = array(
211 + 'et_pb_layout',
212 + ],
213 + 'type' => '%s',
214 + ],
215 + ];
216 + $order_condition = [
119 217 'orderby' => 'id',
120 218 'order' => 'desc',
121 - );
122 -
219 + ];
123 220 $where = $this->helper->load('db')->prepare_where($condition);
124 221 $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
222 + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
223 + $posts = $wpdb->get_results($wpdb->prepare('SELECT * FROM `' . $wpdb->prefix . 'posts`' . $where['sql'] . $orderby . '', $where['filter']));
125 224
126 - $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'posts' . $where['sql'] . $orderby . "", $where['filter']));
127 -
128 - $content = array();
225 + $content = [];
129 226 foreach ($posts as $key => $post) {
130 - if ($forms_labels = $this->get_forms($post->post_content)) {
131 - foreach ($forms_labels as $form_key => $form_value) {
132 - $content[] = $this->item($form_key);
133 - }
227 + foreach ($this->get_forms($post->post_content) as $form_key => $form_value) {
228 + $content[] = $this->item($form_key);
134 229 }
135 230 }
136 231 return $content;
137 232 }
138 233
139 - /**
140 - * Parse available forms from pages
141 - *
142 - * @param string $content - Page content
143 - *
144 - * @return array() - Forms list
145 - */
234 + // get forms
146 235 public function get_forms($content) {
236 + $forms = [];
147 237
148 - $forms = array();
149 - if (false !== strpos($content, 'et_pb_contact_form')) {
150 - $shortcode_tags = array(
238 + if ($this->divi4_form($content)) {
239 + $shortcode_tags = [
151 240 'et_pb_contact_form',
152 - );
153 -
241 + ];
154 242 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
155 243 $tagnames = array_intersect($shortcode_tags, $matches[1]);
156 -
157 244 if (!empty($tagnames)) {
158 - $pattern = get_shortcode_regex($tagnames);
159 -
160 - preg_match_all("/$pattern/", $content, $shortcodes);
245 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
161 246 foreach ($shortcodes[0] as $key => $shortcode_value) {
162 -
163 - $shortcode = array();
164 - $shortcode[1] = $shortcodes[1][$key];
165 - $shortcode[2] = $shortcodes[2][$key];
166 - $shortcode[3] = $shortcodes[3][$key];
167 - $shortcode[4] = $shortcodes[4][$key];
168 - $shortcode[5] = $shortcodes[5][$key];
169 - $shortcode[6] = $shortcodes[6][$key];
170 -
247 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
171 248 preg_match_all('/admin_label="(.*?)"/', $shortcode[3], $labels);
172 249 if (isset($labels['1'])) {
173 250 foreach ($labels['1'] as $label) {
174 251 $forms[$label] = $label;
@@ -175,520 +252,338 @@
175 252 }
176 253 }
177 254 }
178 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 + }
179 264 }
180 -
181 265 return $forms;
182 266 }
183 267
184 - /**
185 - * Get entries for export
186 - *
187 - * @param string $item - Item
188 - * @param string $name - Entries names
189 - *
190 - * @return array() - Entries list
191 - */
192 - public function datasets($item = false, $name = false) {
193 -
268 + // datasets
269 + public function datasets($item_id = false, $name = false) {
194 270 global $wpdb;
195 -
196 - $datasets = array();
197 -
198 - if ($item) {
199 - $condition = array(
200 - 'extension' => array(
271 + $datasets = [];
272 + if ($item_id) {
273 + $condition = [
274 + 'extension' => [
201 275 'condition' => '=',
202 276 'value' => 'divi',
203 - 'type' => '%s'
204 - ),
205 - 'item' => array(
277 + 'type' => '%s',
278 + ],
279 + 'item' => [
206 280 'condition' => '=',
207 - 'value' => $item,
208 - 'type' => '%s'
209 - ),
210 - );
211 -
212 - $order_condition = array(
281 + 'value' => $item_id,
282 + 'type' => '%s',
283 + ],
284 + ];
285 + $order_condition = [
213 286 'orderby' => 'ID',
214 287 'order' => 'desc',
215 - );
216 -
288 + ];
217 289 $where = $this->helper->load('db')->prepare_where($condition);
218 290 $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
291 + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
292 + $entries = $wpdb->get_results($wpdb->prepare('SELECT * FROM `' . $wpdb->prefix . 'e2pdf_datasets`' . $where['sql'] . $orderby . '', $where['filter']));
219 293
220 - $datasets_tmp = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'e2pdf_datasets' . $where['sql'] . $orderby . "", $where['filter']));
221 -
222 - if ($datasets_tmp) {
223 - foreach ($datasets_tmp as $key => $dataset) {
224 - $this->set('item', $item);
225 - $this->set('dataset', $dataset->ID);
226 - $dataset_title = $this->render($name);
227 - if (!$dataset_title) {
228 - $dataset_title = $dataset->ID;
294 + if ($entries) {
295 + $this->set('item', $item_id);
296 + foreach ($entries as $key => $entry) {
297 + $this->set('dataset', $entry->ID);
298 + $entry_title = $this->render($name);
299 + if (!$entry_title) {
300 + $entry_title = $entry->ID;
229 301 }
230 - $datasets[] = array(
231 - 'key' => $dataset->ID,
232 - 'value' => $dataset_title
233 - );
302 + $datasets[] = [
303 + 'key' => $entry->ID,
304 + 'value' => $entry_title,
305 + ];
234 306 }
235 307 }
236 308 }
237 -
238 309 return $datasets;
239 310 }
240 311
241 - /**
242 - * Get dataset
243 - *
244 - * @param int $dataset - Dataset ID
245 - *
246 - * @return object - Dataset
247 - */
248 - public function dataset($dataset = false) {
312 + // get dataset actions
313 + public function get_dataset_actions($dataset_id = false) {
314 + $dataset_id = (int) $dataset_id;
315 + if (!$dataset_id) {
316 + return;
317 + }
318 + $actions = new stdClass();
319 + $actions->view = false;
320 + $actions->delete = true;
321 + return $actions;
322 + }
249 323
250 - $dataset = (int) $dataset;
251 -
252 - if (!$dataset) {
324 + // get template actions
325 + public function get_template_actions($template = false) {
326 + $template = (int) $template;
327 + if (!$template) {
253 328 return;
254 329 }
330 + $actions = new stdClass();
331 + $actions->delete = true;
332 + return $actions;
333 + }
255 334
256 - $data = new stdClass();
257 - $data->url = false;
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 + }
258 349
259 - return $data;
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;
260 372 }
261 373
262 - /**
263 - * Get item
264 - *
265 - * @param string $item - Item
266 - *
267 - * @return object - Item
268 - */
269 - public function item($item = false) {
270 -
271 - $form = new stdClass();
272 -
273 - if (!$item && $this->get('item')) {
274 - $item = $this->get('item');
374 + // item
375 + public function item($item_id = false) {
376 + if (!$item_id && $this->get('item')) {
377 + $item_id = $this->get('item');
275 378 }
276 -
277 - if ($item) {
278 - $form->id = (string) $item;
279 - $form->name = $item;
280 - $post = $this->get_post($item);
281 - $form->url = isset($post->ID) ? $this->helper->get_url(array('post' => $post->ID, 'action' => 'edit'), 'post.php?') : 'javascript:void(0);';
379 + $item = new stdClass();
380 + if ($item_id) {
381 + $item->id = (string) $item_id;
382 + $item->name = $item_id;
383 + $form = $this->get_form($item_id);
384 + if (isset($form->ID)) {
385 + $item->url = $this->helper->get_url(
386 + [
387 + 'post' => $form->ID,
388 + 'action' => 'edit',
389 + ], 'post.php?'
390 + );
391 + } else {
392 + $item->url = '';
393 + }
282 394 } else {
283 - $form->id = '';
284 - $form->name = '';
285 - $form->url = 'javascript:void(0);';
395 + $item->id = '';
396 + $item->name = '';
397 + $item->url = '';
286 398 }
287 - return $form;
399 + return $item;
288 400 }
289 401
290 - /**
291 - * Get post
292 - *
293 - * @param string $item - Form label
294 - *
295 - * @return object - Post
296 - */
297 - public function get_post($item = false) {
402 + // get form
403 + public function get_form($item_id = false) {
298 404 global $wpdb;
299 -
300 405 $item_post = false;
301 -
302 - $condition = array(
303 - 'post_content' => array(
406 + $condition = [
407 + 'post_content' => [
304 408 'condition' => 'LIKE',
305 - 'value' => '%admin_label="' . $item . '"%',
306 - 'type' => '%s'
307 - ),
308 - 'post_type' => array(
409 + 'value' => '%admin_label="' . $item_id . '"%',
410 + 'type' => '%s',
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' => [
309 422 'condition' => '<>',
310 - 'value' => array(
423 + 'value' => [
311 424 'revision',
312 - 'et_pb_layout'
313 - ),
314 - 'type' => '%s'
315 - ),
316 - );
425 + 'et_pb_layout',
426 + ],
427 + 'type' => '%s',
428 + ],
429 + ];
317 430
318 - $order_condition = array(
431 + $order_condition = [
319 432 'orderby' => 'id',
320 433 'order' => 'desc',
321 - );
434 + ];
322 435
323 436 $where = $this->helper->load('db')->prepare_where($condition);
324 437 $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
325 -
326 - $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'posts' . $where['sql'] . $orderby . "", $where['filter']));
327 - foreach ($posts as $key => $post) {
328 - if ($forms_labels = $this->get_forms($post->post_content)) {
329 - if (in_array($item, $forms_labels)) {
330 - $item_post = $post;
331 - break;
332 - }
438 + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
439 + $posts = $wpdb->get_results($wpdb->prepare('SELECT * FROM `' . $wpdb->prefix . 'posts`' . $where['sql'] . $orderby . '', $where['filter']));
440 + foreach ($posts as $post) {
441 + if (in_array($item_id, $this->get_forms($post->post_content))) {
442 + $item_post = $post;
443 + break;
333 444 }
334 445 }
335 446 return $item_post;
336 447 }
337 448
338 - /**
339 - * Render value according to content
340 - *
341 - * @param string $value - Content
342 - * @param string $type - Type of rendering value
343 - * @param array $field - Field details
344 - *
345 - * @return string - Fully rendered value
346 - */
347 - public function render($value, $type = false, $field = array()) {
348 -
349 - $value = $this->render_shortcodes($value, $type, $field);
350 - $value = $this->strip_shortcodes($value);
351 -
352 - if ($type === 'value' && isset($field['type']) && $field['type'] === 'e2pdf-checkbox' && isset($field['properties']['option'])) {
353 - $option = $this->render($field['properties']['option']);
354 - $options = explode(', ', $value);
355 - $option_options = explode(', ', $option);
356 - if (is_array($options) && is_array($option_options) && !array_diff($option_options, $options)) {
357 - return $option;
358 - } else {
359 - return "";
360 - }
449 + // render
450 + public function render($value, $field = [], $convert_shortcodes = true, $raw = false) {
451 + $value = $this->render_shortcodes($value, $field);
452 + if (!$raw) {
453 + $value = $this->strip_shortcodes($value);
454 + $value = $this->convert_shortcodes($value, $convert_shortcodes, isset($field['type']) && $field['type'] == 'e2pdf-html' ? true : false);
455 + $value = $this->helper->load('field')->render_checkbox($value, $this, $field);
361 456 }
362 -
363 - if ($type === 'value') {
364 - $value = $this->convert_shortcodes($value, true);
365 - }
366 -
367 457 return $value;
368 458 }
369 459
370 - /**
371 - * Render shortcodes which available in this extension
372 - *
373 - * @param string $value - Content
374 - * @param string $type - Type of rendering value
375 - * @param array $field - Field details
376 - *
377 - * @return string - Value with rendered shortcodes
378 - */
379 - public function render_shortcodes($value, $type = false, $field = array()) {
380 - global $wpdb;
381 -
382 - $dataset = $this->get('dataset');
383 - $item = $this->get('item');
384 - $user_id = $this->get('user_id');
385 - $args = $this->get('args');
386 - $template_id = $this->get('template_id') ? $this->get('template_id') : '0';
387 - $element_id = isset($field['element_id']) ? $field['element_id'] : '0';
388 -
460 + // render shortcodes
461 + public function render_shortcodes($value, $field = []) {
462 + $element_id = isset($field['element_id']) ? $field['element_id'] : false;
389 463 if ($this->verify()) {
390 -
391 - $args = apply_filters('e2pdf_extension_render_shortcodes_args', $args, $element_id, $template_id, $item, $dataset);
392 -
393 - $condition = array(
394 - 'ID' => array(
395 - 'condition' => '=',
396 - 'value' => $dataset,
397 - 'type' => '%d'
398 - ),
399 - 'item' => array(
400 - 'condition' => '=',
401 - 'value' => $item,
402 - 'type' => '%s'
403 - ),
404 - 'extension' => array(
405 - 'condition' => '=',
406 - 'value' => 'divi',
407 - 'type' => '%s'
408 - ),
464 + if (false !== strpos($value, '[')) {
465 + $value = $this->helper->load('field')->pre_shortcodes($value, $this, $field);
466 + $value = $this->helper->load('field')->inner_shortcodes($value, $this, $field);
467 + $value = $this->helper->load('field')->wrapper_shortcodes($value, $this, $field);
468 + }
469 + $value = $this->helper->load('field')->do_shortcodes($value, $this, $field);
470 + if (!empty($this->get('cached_meta'))) {
471 + $value = $this->helper->load('convert')->stritr($value, $this->get('cached_meta'));
472 + }
473 + $value = $this->helper->load('field')->render(
474 + apply_filters('e2pdf_extension_render_shortcodes_pre_value', $value, $element_id, $this->get('template_id'), $this->get('item'), $this->get('dataset'), false, false),
475 + $this,
476 + $field
409 477 );
410 -
411 - $where = $this->helper->load('db')->prepare_where($condition);
412 -
413 - $entry = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'e2pdf_datasets' . $where['sql'] . "", $where['filter']));
414 -
415 - $processed_fields_values = array();
416 - if ($entry) {
417 - $post = unserialize($entry->entry);
418 - if ($post && is_array($post)) {
419 -
420 - $et_pb_contact_form_num = 0;
421 -
422 - $current_form_fields = isset($post['et_pb_contact_email_fields_' . $et_pb_contact_form_num]) ? $post['et_pb_contact_email_fields_' . $et_pb_contact_form_num] : '';
423 - $hidden_form_fields = isset($post['et_pb_contact_email_hidden_fields_' . $et_pb_contact_form_num]) ? $post['et_pb_contact_email_hidden_fields_' . $et_pb_contact_form_num] : false;
424 - $processed_fields_values = array();
425 -
426 - if ('' !== $current_form_fields) {
427 - $fields_data_json = str_replace('\\', '', $current_form_fields);
428 - $fields_data_array = json_decode($fields_data_json, true);
429 -
430 - if (!empty($fields_data_array)) {
431 - foreach ($fields_data_array as $index => $field_value) {
432 - $processed_fields_values[$field_value['original_id']]['value'] = isset($post[$field_value['field_id']]) ? $post[$field_value['field_id']] : '';
433 - $processed_fields_values[$field_value['original_id']]['label'] = $field_value['field_label'];
434 - }
435 - }
436 - }
437 - }
438 -
439 - $replace = array();
440 - foreach ($processed_fields_values as $field_key => $field_value) {
441 - $replace["%%" . $field_key . "%%"] = wp_strip_all_tags($field_value['value']);
442 - }
443 -
444 - if (false !== strpos($value, '[')) {
445 -
446 - $shortcode_tags = array(
447 - 'e2pdf-user',
448 - 'e2pdf-arg'
449 - );
450 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $value, $matches);
451 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
452 -
453 - if (!empty($tagnames)) {
454 - $pattern = get_shortcode_regex($tagnames);
455 -
456 - preg_match_all("/$pattern/", $value, $shortcodes);
457 -
458 - foreach ($shortcodes[0] as $key => $shortcode_value) {
459 - $shortcode = array();
460 - $shortcode[1] = $shortcodes[1][$key];
461 - $shortcode[2] = $shortcodes[2][$key];
462 - $shortcode[3] = $shortcodes[3][$key];
463 - $shortcode[4] = $shortcodes[4][$key];
464 - $shortcode[5] = $shortcodes[5][$key];
465 - $shortcode[6] = $shortcodes[6][$key];
466 -
467 - $atts = shortcode_parse_atts($shortcode[3]);
468 -
469 - if ($shortcode['2'] == 'e2pdf-user') {
470 - if (!isset($atts['id']) && $user_id) {
471 - $shortcode[3] .= " id=\"" . $user_id . "\"";
472 - $value = str_replace($shortcode_value, "[" . $shortcode['2'] . $shortcode['3'] . "]", $value);
473 - }
474 - } elseif ($shortcode['2'] == 'e2pdf-arg') {
475 - if (isset($atts['key']) && isset($args[$atts['key']])) {
476 - $sub_value = $this->strip_shortcodes($args[$atts['key']]);
477 - $value = str_replace($shortcode_value, $sub_value, $value);
478 - } else {
479 - $value = str_replace($shortcode_value, '', $value);
480 - }
481 - }
482 - }
483 - }
484 -
485 - $shortcode_tags = array(
486 - 'e2pdf-format-number',
487 - 'e2pdf-format-date',
488 - 'e2pdf-format-output',
489 - );
490 - $shortcode_tags = apply_filters('e2pdf_extension_render_shortcodes_tags', $shortcode_tags);
491 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $value, $matches);
492 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
493 -
494 - if (!empty($tagnames)) {
495 -
496 - $pattern = get_shortcode_regex($tagnames);
497 - preg_match_all("/$pattern/", $value, $shortcodes);
498 - foreach ($shortcodes[0] as $key => $shortcode_value) {
499 - $shortcode = array();
500 - $shortcode[1] = $shortcodes[1][$key];
501 - $shortcode[2] = $shortcodes[2][$key];
502 - $shortcode[3] = $shortcodes[3][$key];
503 - $shortcode[4] = $shortcodes[4][$key];
504 - $shortcode[5] = $shortcodes[5][$key];
505 - $shortcode[6] = $shortcodes[6][$key];
506 -
507 - if (isset($shortcode['5'])) {
508 - if (isset($field['type']) && ($field['type'] === 'e2pdf-image' || $field['type'] === 'e2pdf-signature')) {
509 - $sub_value = $this->render($shortcode['5'], $type);
510 - } else {
511 - $sub_value = $this->render($shortcode['5'], $type, $field);
512 - }
513 - $value = str_replace($shortcode_value, "[" . $shortcode['2'] . $shortcode['3'] . "]" . $sub_value . "[/" . $shortcode['2'] . "]", $value);
514 - }
515 - }
516 - }
517 - }
518 -
519 - $value = do_shortcode($value);
520 -
521 - if ($entry) {
522 - $value = $this->helper->load('convert')->stritr($value, $replace);
523 - }
524 -
525 - if (isset($field['type']) && ($field['type'] === 'e2pdf-image' || $field['type'] === 'e2pdf-signature')) {
526 - $esig = isset($field['properties']['esig']) && $field['properties']['esig'] ? true : false;
527 - if ($esig) {
528 - //process e-signature
529 - $value = "";
530 - } else {
531 - if (!$this->helper->load('image')->get_image($value)) {
532 - $value = $this->strip_shortcodes($value);
533 - if (
534 - $value &&
535 - trim($value) != "" &&
536 - extension_loaded('gd') &&
537 - function_exists('imagettftext')
538 - ) {
539 - if (isset($field['properties']['text_color']) && $field['properties']['text_color']) {
540 - $penColour = $this->helper->load('convert')->to_hex_color($field['properties']['text_color']);
541 - } else {
542 - $penColour = array(0x14, 0x53, 0x94);
543 - }
544 -
545 - $default_options = array(
546 - 'imageSize' => array(isset($field['width']) ? $field['width'] : '400', isset($field['height']) ? $field['height'] : '150'),
547 - 'bgColour' => 'transparent',
548 - 'penColour' => $penColour
549 - );
550 -
551 - $options = array();
552 - $options = apply_filters('e2pdf_image_sig_output_options', $options, $element_id, $template_id);
553 - $options = array_merge($default_options, $options);
554 -
555 - $model_e2pdf_font = new Model_E2pdf_Font();
556 -
557 - $font = false;
558 - if (isset($field['properties']['text_font']) && $field['properties']['text_font']) {
559 - $font = $model_e2pdf_font->get_font_path($field['properties']['text_font']);
560 - }
561 - if (!$font) {
562 - $font = $model_e2pdf_font->get_font_path('Noto Sans');
563 - }
564 -
565 - $size = 150;
566 - if (isset($field['properties']['text_font_size']) && $field['properties']['text_font_size']) {
567 - $size = $field['properties']['text_font_size'];
568 - }
569 -
570 - $model_e2pdf_signature = new Model_E2pdf_Signature();
571 - $value = $model_e2pdf_signature->ttf_signature($value, $size, $font, $options);
572 - } else {
573 - $value = "";
574 - }
575 - }
576 - }
577 - } else {
578 - $value = $this->convert_shortcodes($value);
579 - }
580 - }
581 478 }
582 -
583 - return $value;
479 + return apply_filters(
480 + 'e2pdf_extension_render_shortcodes_value', $value, $element_id, $this->get('template_id'), $this->get('item'), $this->get('dataset'), false, false
481 + );
584 482 }
585 483
586 - /**
587 - * Strip unused shortcodes
588 - *
589 - * @param string $value - Content
590 - *
591 - * @return string - Value with removed unused shortcodes
592 - */
484 + // strip shortcodes
593 485 public function strip_shortcodes($value) {
594 - $value = preg_replace('~(?:\[/?)[^/\]]+/?\]~s', "", $value);
595 - $value = preg_replace('~(?:%%/?)[^/%%]+/?%%~s', "", $value);
486 + $value = preg_replace('~(?:\[/?)[^/\]]+/?\]~s', '', $value);
487 + $value = preg_replace('~%%[^%%]*%%~', '', $value);
596 488 return $value;
597 489 }
598 490
599 - public function convert_shortcodes($value, $to = false) {
491 + // convert shortcodes
492 + public function convert_shortcodes($value, $to = false, $html = false) {
600 493 if ($value) {
601 494 if ($to) {
602 - $value = str_replace("&#91;", "[", $value);
603 - //$value = str_replace("&#37;", "%", $value);
495 + $value = stripslashes_deep($value);
496 + $value = str_replace('&#91;', '[', $value);
497 + if (!$html) {
498 + $value = wp_specialchars_decode($value, ENT_QUOTES);
499 + }
604 500 } else {
605 - $value = str_replace("[", "&#91;", $value);
606 - //$value = str_replace("%", "&#37;", $value);
501 + $value = str_replace('[', '&#91;', $value);
607 502 }
608 503 }
609 504 return $value;
610 505 }
611 506
507 + // auto
612 508 public function auto() {
613 509
614 - $response = array();
615 - $elements = array();
510 + $elements = [];
616 511
617 512 if ($this->get('item')) {
618 - $post = $this->get_post($this->get('item'));
513 + $post = $this->get_form($this->get('item'));
619 514 if ($post && isset($post->post_content)) {
620 515
516 + $source = '';
621 517 $content = $post->post_content;
622 518
623 - if (false !== strpos($content, '[')) {
624 - $shortcode_tags = array(
519 + if ($this->divi4_form($content)) {
520 + $shortcode_tags = [
625 521 'et_pb_contact_form',
626 - );
627 -
522 + ];
628 523 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
629 524 $tagnames = array_intersect($shortcode_tags, $matches[1]);
630 -
631 525 if (!empty($tagnames)) {
632 - $pattern = get_shortcode_regex($tagnames);
633 -
634 - preg_match_all("/$pattern/", $content, $shortcodes);
635 -
526 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
636 527 foreach ($shortcodes[0] as $key => $shortcode_value) {
637 -
638 - $shortcode = array();
639 - $shortcode[1] = $shortcodes[1][$key];
640 - $shortcode[2] = $shortcodes[2][$key];
641 - $shortcode[3] = $shortcodes[3][$key];
642 - $shortcode[4] = $shortcodes[4][$key];
643 - $shortcode[5] = $shortcodes[5][$key];
644 - $shortcode[6] = $shortcodes[6][$key];
645 -
528 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
646 529 $atts = shortcode_parse_atts($shortcode[3]);
647 530 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
648 -
649 - require_once(ET_BUILDER_DIR . 'class-et-builder-element.php');
650 - require_once(ET_BUILDER_DIR . 'functions.php');
651 - require_once(ET_BUILDER_DIR . 'ab-testing.php');
652 - require_once(ET_BUILDER_DIR . 'class-et-global-settings.php');
653 - require_once(ET_BUILDER_DIR . 'module/ContactForm.php');
654 - require_once(ET_BUILDER_DIR . 'module/ContactFormItem.php');
655 -
656 - new ET_Builder_Module_Contact_Form();
657 - new ET_Builder_Module_Contact_Form_Item();
658 -
531 + $this->divi4_load();
659 532 $source = do_shortcode($shortcode_value);
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 + }
660 546
661 - libxml_use_internal_errors(true);
662 - $dom = new DOMDocument();
663 - if (function_exists('mb_convert_encoding')) {
664 - $html = $dom->loadHTML(mb_convert_encoding($source, 'HTML-ENTITIES', 'UTF-8'));
665 - } else {
666 - $html = $dom->loadHTML('<?xml encoding="UTF-8">' . $source);
667 - }
668 - libxml_clear_errors();
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);
669 553
670 - if ($html) {
671 - $xpath = new DomXPath($dom);
672 - $blocks = $xpath->query("//*[contains(@class, 'et_pb_contact_field')]");
673 - foreach ($blocks as $element) {
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 + }
674 564
675 - $data_type = $element->attributes->getNamedItem("data-type")->nodeValue;
565 + $blocks = $xpath->query("//*[contains(@class, 'et_pb_contact_field')]");
566 + foreach ($blocks as $element) {
676 567
677 - if ($data_type == 'radio') {
568 + if ($xml->get_node_value($element, 'data-type') == 'radio') {
678 569
679 - $label = $xpath->query(".//label", $element)->item(0);
680 - $check_handler = $xpath->query(".//input[contains(@class, 'et_pb_checkbox_handle')]", $element)->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);
681 572
682 - $name = "";
683 - if ($check_handler) {
684 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
685 - }
573 + $name = '';
574 + if ($check_handler) {
575 + $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
576 + }
686 577
687 - $elements[] = $this->auto_field($element, array(
578 + if ($label) {
579 + $elements[] = $this->auto_field(
580 + $element,
581 + [
688 582 'type' => 'e2pdf-html',
689 583 'block' => true,
690 - 'properties' => array(
584 + 'class' => $xml->get_node_value($element, 'class'),
585 + 'properties' => [
691 586 'top' => '20',
692 587 'left' => '20',
693 588 'right' => '20',
694 589 'width' => '100%',
@@ -693,52 +588,73 @@
693 588 'right' => '20',
694 589 'width' => '100%',
695 590 'height' => 'auto',
696 591 'value' => $label->nodeValue,
697 - )
698 - ));
592 + ],
593 + ]
594 + );
595 + }
699 596
700 - $fields = $xpath->query("//*[contains(@class, 'et_pb_contact_field_radio')]", $element);
701 - foreach ($fields as $field) {
702 - $radio_label = $xpath->query(".//label", $field)->item(0);
703 - $radio = $xpath->query(".//input[@type='radio']", $field)->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);
704 601
705 - $elements[] = $this->auto_field($field, array(
602 + if (
603 + $radio->attributes->getNamedItem('data-original_id') &&
604 + $radio->attributes->getNamedItem('value')
605 + ) {
606 + $elements[] = $this->auto_field(
607 + $field,
608 + [
706 609 'type' => 'e2pdf-radio',
707 - 'properties' => array(
610 + 'class' => $xml->get_node_value($field, 'class'),
611 + 'properties' => [
708 612 'top' => '5',
709 613 'width' => 'auto',
710 614 'height' => 'auto',
711 - 'value' => "%%" . $radio->attributes->getNamedItem("data-original_id")->nodeValue . "%%",
712 - 'option' => $radio->attributes->getNamedItem("value")->nodeValue,
713 - 'group' => $radio->attributes->getNamedItem("data-original_id")->nodeValue,
714 - )
715 - ));
716 - $elements[] = $this->auto_field($radio, array(
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 + }
622 +
623 + if ($radio_label) {
624 + $elements[] = $this->auto_field(
625 + $radio,
626 + [
717 627 'type' => 'e2pdf-html',
718 628 'float' => true,
719 - 'properties' => array(
629 + 'class' => $xml->get_node_value($radio, 'class'),
630 + 'properties' => [
720 631 'left' => '5',
721 632 'width' => '100%',
722 633 'height' => 'auto',
723 - 'value' => $radio_label->nodeValue
724 - )
725 - ));
726 - }
727 - } elseif ($data_type == 'checkbox') {
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);
728 643
729 - $label = $xpath->query(".//label", $element)->item(0);
730 - $check_handler = $xpath->query(".//input[contains(@class, 'et_pb_checkbox_handle')]", $element)->item(0);
644 + $name = '';
645 + if ($check_handler) {
646 + $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
647 + }
731 648
732 - $name = "";
733 - if ($check_handler) {
734 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
735 - }
736 -
737 - $elements[] = $this->auto_field($element, array(
649 + if ($label) {
650 + $elements[] = $this->auto_field(
651 + $element,
652 + [
738 653 'type' => 'e2pdf-html',
739 654 'block' => true,
740 - 'properties' => array(
655 + 'class' => $xml->get_node_value($element, 'class'),
656 + 'properties' => [
741 657 'top' => '20',
742 658 'left' => '20',
743 659 'right' => '20',
744 660 'width' => '100%',
@@ -743,102 +659,156 @@
743 659 'right' => '20',
744 660 'width' => '100%',
745 661 'height' => 'auto',
746 662 'value' => $label->nodeValue,
747 - )
748 - ));
663 + ],
664 + ]
665 + );
666 + }
749 667
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);
750 672
751 - $fields = $xpath->query("//*[contains(@class, 'et_pb_contact_field_checkbox')]", $element);
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 + );
752 687
753 - foreach ($fields as $field) {
754 - $checkbox_label = $xpath->query(".//label", $field)->item(0);
755 - $checkbox = $xpath->query(".//input[@type='checkbox']", $field)->item(0);
756 -
757 -
758 - $elements[] = $this->auto_field($field, array(
759 - 'type' => 'e2pdf-checkbox',
760 - 'properties' => array(
761 - 'top' => '5',
762 - 'width' => 'auto',
763 - 'height' => 'auto',
764 - 'value' => $name,
765 - 'option' => $checkbox->attributes->getNamedItem("value")->nodeValue
766 - )
767 - ));
768 - $elements[] = $this->auto_field($checkbox, array(
688 + if ($checkbox_label) {
689 + $elements[] = $this->auto_field(
690 + $checkbox,
691 + [
769 692 'type' => 'e2pdf-html',
770 693 'float' => true,
771 - 'properties' => array(
694 + 'class' => $xml->get_node_value($checkbox, 'class'),
695 + 'properties' => [
772 696 'left' => '5',
773 697 'width' => '100%',
774 698 'height' => 'auto',
775 - 'value' => $checkbox_label->nodeValue
776 - )
777 - ));
778 - }
779 - } else {
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);
780 710
781 - $label = $xpath->query(".//label", $element)->item(0);
782 - $input_text = $xpath->query(".//input[@type='text']", $element)->item(0);
783 - $select = $xpath->query(".//select", $element)->item(0);
784 - $textarea = $xpath->query(".//textarea", $element)->item(0);
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 + }
785 729
786 - if ($label && ($input_text || $select || $textarea)) {
787 - $elements[] = $this->auto_field($element, array(
788 - 'type' => 'e2pdf-html',
789 - 'block' => true,
790 - 'properties' => array(
791 - 'top' => '20',
792 - 'left' => '20',
793 - 'right' => '20',
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',
794 739 'width' => '100%',
795 - 'height' => 'auto',
796 - 'value' => $label->nodeValue,
797 - )
798 - ));
799 - }
800 -
801 - if ($input_text) {
802 - $elements[] = $this->auto_field($input_text, array(
803 - 'type' => 'e2pdf-input',
804 - 'properties' => array(
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' => [
805 754 'top' => '5',
806 755 'width' => '100%',
807 - 'height' => 'auto',
808 - 'value' => "%%{$input_text->attributes->getNamedItem("data-original_id")->nodeValue}%%",
809 - )
810 - ));
811 - } elseif ($select) {
812 - $options_tmp = array();
813 - $options = $xpath->query(".//option", $select);
814 - foreach ($options as $option) {
815 - $options_tmp[] = $option->attributes->getNamedItem("value")->nodeValue;
816 - }
817 -
818 - $elements[] = $this->auto_field($select, array(
819 - 'type' => 'e2pdf-select',
820 - 'properties' => array(
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' => [
821 768 'top' => '5',
822 769 'width' => '100%',
823 770 'height' => 'auto',
824 - 'options' => implode("\n", $options_tmp),
825 - 'value' => "%%{$select->attributes->getNamedItem("data-original_id")->nodeValue}%%",
826 - )
827 - ));
828 - } elseif ($textarea) {
829 - $elements[] = $this->auto_field($textarea, array(
830 - 'type' => 'e2pdf-textarea',
831 - 'properties' => array(
832 - 'top' => '5',
833 - 'width' => '100%',
834 - 'height' => '150',
835 - 'value' => "%%{$textarea->attributes->getNamedItem("data-original_id")->nodeValue}%%",
836 - )
837 - ));
838 - }
839 - }
771 + 'value' => '%%' . $xml->get_node_value($input_text, 'data-original_id') . '%%',
772 + ],
773 + ]
774 + );
840 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 + );
841 811 }
842 812 }
843 813 }
844 814 }
@@ -844,81 +814,53 @@
844 814 }
845 815 }
846 816 }
847 817 }
848 -
849 - $response['page'] = array(
850 - 'bottom' => '20',
851 - 'top' => '20',
852 - 'right' => '20',
853 - 'left' => '20'
854 - );
855 - $response['elements'] = $elements;
856 -
857 - return $response;
818 + return [
819 + 'page' => [
820 + 'bottom' => '20',
821 + 'top' => '20',
822 + 'right' => '20',
823 + 'left' => '20',
824 + ],
825 + 'elements' => $elements,
826 + ];
858 827 }
859 828
860 - /**
861 - * Convert Field name to Value
862 - * @since 0.01.34
863 - *
864 - * @param string $name - Field name
865 - *
866 - * @return bool|string - Converted value or false
867 - */
829 + // auto map
868 830 public function auto_map($name = false) {
869 831 $item = $this->get('item');
870 832 if ($item) {
871 - $post = $this->get_post($item);
833 + $post = $this->get_form($item);
872 834 if ($post && isset($post->post_content)) {
873 835 $content = $post->post_content;
874 -
875 - if (false !== strpos($content, '[')) {
876 - $shortcode_tags = array(
836 + if ($this->divi4_form($content)) {
837 + $shortcode_tags = [
877 838 'et_pb_contact_form',
878 - );
879 -
839 + ];
880 840 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
881 841 $tagnames = array_intersect($shortcode_tags, $matches[1]);
882 -
883 842 if (!empty($tagnames)) {
884 - $pattern = get_shortcode_regex($tagnames);
885 -
886 - preg_match_all("/$pattern/", $content, $shortcodes);
887 -
843 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
888 844 foreach ($shortcodes[0] as $key => $shortcode_value) {
889 -
890 - $shortcode = array();
891 - $shortcode[1] = $shortcodes[1][$key];
892 - $shortcode[2] = $shortcodes[2][$key];
893 - $shortcode[3] = $shortcodes[3][$key];
894 - $shortcode[4] = $shortcodes[4][$key];
895 - $shortcode[5] = $shortcodes[5][$key];
896 - $shortcode[6] = $shortcodes[6][$key];
897 -
845 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
898 846 $atts = shortcode_parse_atts($shortcode[3]);
899 847 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
900 -
901 848 $field_content = $shortcode_value;
902 - $field_shortcode_tags = array(
849 + $field_shortcode_tags = [
903 850 'et_pb_contact_field',
904 - );
905 -
851 + ];
906 852 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $field_content, $field_matches);
907 853 $field_tagnames = array_intersect($field_shortcode_tags, $field_matches[1]);
908 -
909 854 if (!empty($field_tagnames)) {
910 - $field_pattern = get_shortcode_regex($field_tagnames);
911 -
912 - preg_match_all("/$field_pattern/", $field_content, $field_shortcodes);
913 -
855 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($field_tagnames) . '/', $field_content, $field_shortcodes);
914 856 foreach ($field_shortcodes[0] as $field_key => $field_shortcode_value) {
915 - $field_shortcode = array();
857 + $field_shortcode = [];
916 858 $field_shortcode[3] = $field_shortcodes[3][$field_key];
917 - $field_atts = shortcode_parse_atts($field_shortcode[3]);
918 - if (isset($field_atts['field_title']) && isset($field_atts['field_id'])) {
919 - if ($field_atts['field_title'] == $name || $field_atts['field_id'] == $name) {
920 - 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']) . '%%';
921 863 }
922 864 }
923 865 }
924 866 }
@@ -924,8 +866,26 @@
924 866 }
925 867 }
926 868 }
927 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 + }
928 888 }
929 889 }
930 890 }
931 891
@@ -931,18 +891,10 @@
931 891
932 892 return false;
933 893 }
934 894
935 - /**
936 - * Generate field for Auto PDF
937 - *
938 - * @param object $field - Formidable field object
939 - * @param string $type - Field type
940 - * @param array $options - Field additional options
941 - *
942 - * @return array - Prepared auto field
943 - */
944 - public function auto_field($field = false, $element = array()) {
895 + // auto field
896 + public function auto_field($field = false, $element = []) {
945 897
946 898 if (!$field) {
947 899 return false;
948 900 }
@@ -954,16 +906,17 @@
954 906 if (!isset($element['float'])) {
955 907 $element['float'] = false;
956 908 }
957 909
958 - $classes = array();
959 - if (isset($field->attributes->getNamedItem("class")->nodeValue)) {
960 - $classes = explode(" ", $field->attributes->getNamedItem("class")->nodeValue);
910 + $classes = [];
911 + if (isset($element['class']) && $element['class']) {
912 + $classes = explode(' ', $element['class']);
913 + unset($element['class']);
961 914 }
962 915
963 - $float_classes = array(
916 + $float_classes = [
964 917 'et_pb_contact_field_half',
965 - );
918 + ];
966 919 $array_intersect = array_intersect($classes, $float_classes);
967 920
968 921 if (!empty($array_intersect) && $element['block']) {
969 922 $element['float'] = true;
@@ -986,52 +939,17 @@
986 939
987 940 return $element;
988 941 }
989 942
990 - /**
991 - * Verify if form and dataset exists
992 - *
993 - * @return bool - Exists/Not exists
994 - */
943 + // verify
995 944 public function verify() {
996 - global $wpdb;
997 - $item = $this->get('item');
998 - $dataset = $this->get('dataset');
999 -
1000 - if ($item && $dataset) {
1001 - $condition = array(
1002 - 'ID' => array(
1003 - 'condition' => '=',
1004 - 'value' => $dataset,
1005 - 'type' => '%d'
1006 - ),
1007 - 'extension' => array(
1008 - 'condition' => '=',
1009 - 'value' => 'divi',
1010 - 'type' => '%s'
1011 - ),
1012 - 'item' => array(
1013 - 'condition' => '=',
1014 - 'value' => $item,
1015 - 'type' => '%s'
1016 - ),
1017 - );
1018 -
1019 - $where = $this->helper->load('db')->prepare_where($condition);
1020 - $entry = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'e2pdf_datasets' . $where['sql'] . "", $where['filter']));
1021 -
1022 - if ($entry) {
1023 - return true;
1024 - }
945 + if ($this->get('cached_entry')) {
946 + return true;
1025 947 }
1026 948 return false;
1027 949 }
1028 950
1029 - /**
1030 - * Visual Mapper for Mapping field
1031 - *
1032 - * @return bool|string - Prepared form or false
1033 - */
951 + // visual mapper
1034 952 public function visual_mapper() {
1035 953
1036 954 $source = '';
1037 955 $html = '';
@@ -1036,128 +954,139 @@
1036 954 $source = '';
1037 955 $html = '';
1038 956
1039 957 if ($this->get('item')) {
1040 - $post = $this->get_post($this->get('item'));
958 + $post = $this->get_form($this->get('item'));
1041 959 if ($post && isset($post->post_content)) {
1042 -
1043 960 $content = $post->post_content;
1044 961
1045 - if (false !== strpos($content, '[')) {
1046 - $shortcode_tags = array(
962 + if ($this->divi4_form($content)) {
963 + $shortcode_tags = [
1047 964 'et_pb_contact_form',
1048 - );
1049 -
965 + ];
1050 966 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
1051 967 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1052 -
1053 968 if (!empty($tagnames)) {
1054 - $pattern = get_shortcode_regex($tagnames);
1055 -
1056 - preg_match_all("/$pattern/", $content, $shortcodes);
1057 -
969 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
1058 970 foreach ($shortcodes[0] as $key => $shortcode_value) {
1059 -
1060 - $shortcode = array();
1061 - $shortcode[1] = $shortcodes[1][$key];
1062 - $shortcode[2] = $shortcodes[2][$key];
1063 - $shortcode[3] = $shortcodes[3][$key];
1064 - $shortcode[4] = $shortcodes[4][$key];
1065 - $shortcode[5] = $shortcodes[5][$key];
1066 - $shortcode[6] = $shortcodes[6][$key];
1067 -
971 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1068 972 $atts = shortcode_parse_atts($shortcode[3]);
1069 973 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
1070 -
1071 - require_once(ET_BUILDER_DIR . 'class-et-builder-element.php');
1072 - require_once(ET_BUILDER_DIR . 'functions.php');
1073 - require_once(ET_BUILDER_DIR . 'ab-testing.php');
1074 - require_once(ET_BUILDER_DIR . 'class-et-global-settings.php');
1075 - require_once(ET_BUILDER_DIR . 'module/ContactForm.php');
1076 - require_once(ET_BUILDER_DIR . 'module/ContactFormItem.php');
1077 -
1078 - new ET_Builder_Module_Contact_Form();
1079 - new ET_Builder_Module_Contact_Form_Item();
1080 -
974 + $this->divi4_load();
1081 975 $source = do_shortcode($shortcode_value);
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 + }
1082 989
1083 - if ($source) {
1084 - libxml_use_internal_errors(true);
1085 - $dom = new DOMDocument();
1086 - if (function_exists('mb_convert_encoding')) {
1087 - $html = $dom->loadHTML(mb_convert_encoding($source, 'HTML-ENTITIES', 'UTF-8'));
1088 - } else {
1089 - $html = $dom->loadHTML('<?xml encoding="UTF-8">' . $source);
1090 - }
1091 - libxml_clear_errors();
1092 - }
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);
1093 1001
1094 - if (!$source) {
1095 - return __('Form source is empty', 'e2pdf');
1096 - } elseif (!$html) {
1097 - return __('Form could not be parsed due incorrect HTML', 'e2pdf');
1098 - } else {
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 + }
1099 1014
1100 - $xpath = new DomXPath($dom);
1101 - // Replace names
1102 - $fields = $xpath->query("//*[contains(@name, 'et_pb_contact_')]");
1103 - foreach ($fields as $element) {
1104 - if ($element->attributes->getNamedItem("name")) {
1105 - $element->attributes->getNamedItem("name")->nodeValue = "%%" . $element->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
1106 - }
1107 - }
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 + }
1108 1020
1109 - $checkboxes = $xpath->query("//*[contains(@class, 'et_pb_contact_field') and @data-type='checkbox']");
1110 - foreach ($checkboxes as $element) {
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 + }
1111 1035
1112 - $check_handler = $xpath->query(".//input[contains(@class, 'et_pb_checkbox_handle')]", $element)->item(0);
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 + }
1113 1041
1114 - $name = "";
1115 - if ($check_handler) {
1116 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
1117 - }
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 + }
1118 1046
1119 - $checks = $xpath->query(".//input[@type='checkbox']", $element);
1120 - foreach ($checks as $check) {
1121 - $attr = $dom->createAttribute('name');
1122 - $attr->value = $name;
1123 - $check->appendChild($attr);
1124 - }
1125 - }
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 + }
1126 1051
1127 - $remove_by_class = array(
1128 - 'et_pb_contact_submit',
1129 - 'et_pb_contactform_validate_field'
1130 - );
1131 - foreach ($remove_by_class as $key => $class) {
1132 - $elements = $xpath->query("//*[contains(@class, '{$class}')]");
1133 - foreach ($elements as $element) {
1134 - $element->parentNode->removeChild($element);
1135 - }
1136 - }
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);
1064 + }
1065 + }
1137 1066
1138 - $remove_parent_by_class = array(
1139 - 'et_pb_contact_captcha_question'
1140 - );
1141 - foreach ($remove_parent_by_class as $key => $class) {
1142 - $elements = $xpath->query("//*[contains(@class, '{$class}')]/parent::*");
1143 - foreach ($elements as $element) {
1144 - $element->parentNode->removeChild($element);
1145 - }
1146 - }
1067 + $xml_elements = $xpath->query('//*[@data-step]');
1068 + foreach ($xml_elements as $xml_element) {
1069 + $xml_element->removeAttribute('style');
1070 + }
1147 1071
1148 - if ($xpath->query("//form")->item(0)) {
1149 - $autocomplete = $dom->createAttribute('autocomplete');
1150 - $autocomplete->value = 'off';
1151 - $xpath->query("//form")->item(0)->appendChild($autocomplete);
1152 - }
1153 - }
1154 -
1155 - return $dom->saveHTML();
1156 - }
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);
1157 1080 }
1158 1081 }
1159 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 + }
1160 1089 }
1161 1090 }
1162 1091
1163 1092 return false;
@@ -1162,47 +1091,64 @@
1162 1091
1163 1092 return false;
1164 1093 }
1165 1094
1095 + // filter mail
1166 1096 public function filter_wp_mail($args) {
1097 +
1098 + if (!$this->get('process')) {
1099 + return $args;
1100 + }
1101 +
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 +
1167 1106 if (isset($args['message'])) {
1168 1107 if (false !== strpos($args['message'], '[')) {
1169 - $shortcode_tags = array(
1108 + $shortcode_tags = [
1170 1109 'e2pdf-download',
1171 1110 'e2pdf-save',
1172 1111 'e2pdf-attachment',
1173 - 'e2pdf-adobesign'
1174 - );
1175 -
1112 + 'e2pdf-adobesign',
1113 + 'e2pdf-zapier',
1114 + ];
1176 1115 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $args['message'], $matches);
1177 1116 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1178 -
1179 1117 if (!empty($tagnames)) {
1180 - $pattern = get_shortcode_regex($tagnames);
1181 -
1182 - preg_match_all("/$pattern/", $args['message'], $shortcodes);
1183 -
1118 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $args['message'], $shortcodes);
1184 1119 foreach ($shortcodes[0] as $key => $shortcode_value) {
1185 -
1186 - $shortcode = array();
1187 - $shortcode[1] = $shortcodes[1][$key];
1188 - $shortcode[2] = $shortcodes[2][$key];
1189 - $shortcode[3] = $shortcodes[3][$key];
1190 - $shortcode[4] = $shortcodes[4][$key];
1191 - $shortcode[5] = $shortcodes[5][$key];
1192 - $shortcode[6] = $shortcodes[6][$key];
1193 -
1120 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1194 1121 $atts = shortcode_parse_atts($shortcode[3]);
1195 -
1196 - if ($shortcode[2] === 'e2pdf-attachment' || $shortcode[2] === 'e2pdf-save' || $shortcode[2] === 'e2pdf-adobesign') {
1197 - $shortcode[3] .= " apply=\"true\"";
1122 + if (!isset($atts['apply'])) {
1123 + $shortcode[3] .= ' apply="true"';
1198 1124 }
1199 -
1200 - if ($shortcode[2] === 'e2pdf-attachment') {
1125 + if (!isset($atts['filter'])) {
1126 + $shortcode[3] .= ' filter="true"';
1127 + }
1128 + $file = false;
1129 + if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) {
1201 1130 $file = do_shortcode_tag($shortcode);
1202 1131 if ($file) {
1203 - $this->helper->add('divi_attachments', $file);
1132 + $tmp = false;
1133 + if (substr($file, 0, 4) === 'tmp:') {
1134 + $file = substr($file, 4);
1135 + $tmp = true;
1136 + }
1137 + if ($shortcode[2] === 'e2pdf-save' || isset($atts['pdf'])) {
1138 + if ($tmp) {
1139 + $this->helper->add('divi_attachments', $file);
1140 + }
1141 + } else {
1142 + $this->helper->add('divi_attachments', $file);
1143 + }
1204 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 + }
1205 1151 }
1206 1152 $args['message'] = str_replace($shortcode_value, '', $args['message']);
1207 1153 } else {
1208 1154 if (is_array($args['headers']) && !in_array('Content-Type: text/html; charset=UTF-8', $args['headers'])) {
@@ -1208,372 +1154,1007 @@
1208 1154 if (is_array($args['headers']) && !in_array('Content-Type: text/html; charset=UTF-8', $args['headers'])) {
1209 1155 $args['headers'][] = 'Content-Type: text/html; charset=UTF-8';
1210 1156 }
1211 1157 $args['message'] = str_replace($shortcode_value, do_shortcode_tag($shortcode), $args['message']);
1212 - $args['message'] = str_replace("\r\n", "<br/>", $args['message']);
1158 + $args['message'] = str_replace("\r\n", '<br/>', $args['message']);
1213 1159 }
1214 1160 }
1215 1161 }
1216 1162 }
1217 1163 }
1218 -
1219 - $wp_mail = array(
1164 + $wp_mail = [
1220 1165 'to' => $args['to'],
1221 1166 'subject' => $args['subject'],
1222 1167 'message' => $args['message'],
1223 1168 'headers' => $args['headers'],
1224 1169 'attachments' => $args['attachments'],
1225 - );
1170 + ];
1171 + return $wp_mail;
1172 + }
1226 1173
1227 - 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 + }
1228 1182 }
1229 1183
1230 - /**
1231 - * Load actions for this extension
1232 - */
1233 - public function load_actions() {
1234 -
1184 + // load actions
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);
1235 1187 }
1236 1188
1237 - /**
1238 - * Load filters for this extension
1239 - */
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 +
1195 + // load filters
1240 1196 public function load_filters() {
1241 - add_filter('et_pb_module_shortcode_attributes', array($this, 'filter_et_pb_module_shortcode_attributes'), 30, 5);
1242 - add_filter('et_module_shortcode_output', array($this, 'filter_et_module_shortcode_output'), 30, 3);
1197 + // Divi Contact Form Helper Confirmation Email compatibility fix
1198 + if (defined('PWH_DCFH_PLUGIN_FILE') || defined('KS_PAC_DCFH_PLUGIN_FILE')) {
1199 + add_filter('et_pb_module_shortcode_attributes', [$this, 'filter_et_pb_module_shortcode_attributes'], 9, 5);
1200 + } else {
1201 + add_filter('et_pb_module_shortcode_attributes', [$this, 'filter_et_pb_module_shortcode_attributes'], 30, 5);
1202 + }
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);
1243 1207 }
1244 1208
1245 - public function filter_et_pb_module_shortcode_attributes($props, $attrs, $render_slug, $address, $content) {
1246 - global $wpdb;
1209 + public function filter_divi_module_library_register_module_attrs($module_attrs, $filter_args) {
1247 1210
1248 - if ($render_slug && $render_slug == 'et_pb_contact_form' && !empty($_POST) && $et_contact_proccess = array_search('et_contact_proccess', $_POST)) {
1211 + if ('divi/contact-form' !== $filter_args['name']) {
1212 + return $module_attrs;
1213 + }
1249 1214
1250 - $et_pb_contact_form_num = str_replace("et_pb_contactform_submit_", "", $et_contact_proccess);
1215 + if (!isset($_SERVER['REQUEST_METHOD']) || 'POST' !== $_SERVER['REQUEST_METHOD']) {
1216 + return $module_attrs;
1217 + }
1251 1218
1252 - $et_contact_error = false;
1253 - $current_form_fields = isset($_POST['et_pb_contact_email_fields_' . $et_pb_contact_form_num]) ? $_POST['et_pb_contact_email_fields_' . $et_pb_contact_form_num] : '';
1254 - $hidden_form_fields = isset($_POST['et_pb_contact_email_hidden_fields_' . $et_pb_contact_form_num]) ? $_POST['et_pb_contact_email_hidden_fields_' . $et_pb_contact_form_num] : false;
1255 - $contact_email = '';
1256 - $processed_fields_values = array();
1219 + $module_id = !empty($filter_args['id']) ? $filter_args['id'] : '';
1220 + $store_instance = !empty($filter_args['storeInstance']) ? $filter_args['storeInstance'] : 0;
1257 1221
1258 - $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;
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 + }
1259 1228
1260 - if ($nonce_result && isset($_POST['et_pb_contactform_submit_' . $et_pb_contact_form_num]) && empty($_POST['et_pb_contactform_validate_' . $et_pb_contact_form_num])) {
1261 - if ('' !== $current_form_fields) {
1262 - $fields_data_json = str_replace('\\', '', $current_form_fields);
1263 - $fields_data_array = json_decode($fields_data_json, true);
1229 + $module = \ET\Builder\FrontEnd\BlockParser\BlockParserStore::get($module_id, $store_instance);
1264 1230
1265 - // check whether captcha field is not empty
1266 - if ('on' === $captcha && (!isset($_POST['et_pb_contact_captcha_' . $et_pb_contact_form_num]) || empty($_POST['et_pb_contact_captcha_' . $et_pb_contact_form_num]) )) {
1267 - $et_contact_error = true;
1268 - }
1231 + if (!$module) {
1232 + return $module_attrs;
1233 + }
1269 1234
1270 - // check all fields on current form and generate error message if needed
1271 - if (!empty($fields_data_array)) {
1272 - foreach ($fields_data_array as $index => $value) {
1273 - // check all the required fields, generate error message if required field is empty
1274 - $field_value = isset($_POST[$value['field_id']]) ? trim($_POST[$value['field_id']]) : '';
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 + }
1275 1244
1276 - if ('required' === $value['required_mark'] && empty($field_value) && !is_numeric($field_value)) {
1277 - $et_contact_error = true;
1278 - continue;
1279 - }
1245 + $unique_id = \ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormUtils::get_unique_id($module_attrs, (array) $module);
1280 1246
1281 - // additional check for email field
1282 - if ('email' === $value['field_type'] && 'required' === $value['required_mark'] && !empty($field_value)) {
1283 - $contact_email = isset($_POST[$value['field_id']]) ? sanitize_email($_POST[$value['field_id']]) : '';
1247 + $submitted = isset($_POST['_wpnonce-et-pb-contact-form-submitted-' . $unique_id]);
1248 + if (!$submitted) {
1249 + return $module_attrs;
1250 + }
1284 1251
1285 - if (!empty($contact_email) && !is_email($contact_email)) {
1286 - $et_contact_error = true;
1287 - }
1288 - }
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 + }
1289 1255
1290 - // prepare the array of processed field values in convenient format
1291 - if (false === $et_contact_error) {
1292 - $processed_fields_values[$value['original_id']]['value'] = $field_value;
1293 - $processed_fields_values[$value['original_id']]['label'] = $value['field_label'];
1294 - }
1295 - }
1296 - }
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']) : '';
1297 1286 } else {
1298 - $et_contact_error = true;
1287 + $messages['email'] = isset($module_attrs['email']['innerContent']['desktop']['value']) ? $module_attrs['email']['innerContent']['desktop']['value'] : '';
1299 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 + }
1300 1320 } else {
1301 - $et_contact_error = true;
1321 + unset($messages[$message_key]);
1302 1322 }
1323 + }
1303 1324
1304 - if (!$et_contact_error && $nonce_result) {
1325 + $_POST = $this->sanitize($_POST);
1305 1326
1306 - $dataset = false;
1327 + if (!$this->get('process')) {
1328 + return $module_attrs;
1329 + }
1307 1330
1308 - $success_message = '';
1309 - $custom_message = '';
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 + }
1310 1336
1311 - if (isset($props['success_message'])) {
1312 - $success_message = str_replace(array('&#91;', '&#93;', '&quot;'), array('[', ']', '"'), $props['success_message']);
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'] = [];
1313 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 + }
1314 1411
1315 - if (false !== strpos($success_message, '[')) {
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 + }
1316 1445
1317 - $shortcode_tags = array(
1318 - 'e2pdf-download',
1319 - 'e2pdf-save',
1320 - 'e2pdf-view',
1321 - 'e2pdf-adobesign'
1322 - );
1446 + $refClass = new ReflectionClass('\ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormHandler');
1447 + $obj = $refClass->newInstanceWithoutConstructor();
1323 1448
1324 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1325 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
1449 + try {
1450 + $refFields = $refClass->getProperty('_fields_raw');
1451 + $refFields->setAccessible(true);
1452 + $refFields->setValue($obj, $fields_raw);
1326 1453
1327 - if (!empty($tagnames)) {
1328 - $pattern = get_shortcode_regex($tagnames);
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 + }
1329 1460
1330 - preg_match_all("/$pattern/", $success_message, $shortcodes);
1461 + $obj->validate_fields();
1462 + $errorObj = $refError->getValue($obj);
1331 1463
1332 - foreach ($shortcodes[0] as $key => $shortcode_value) {
1464 + if ($errorObj->has_errors()) {
1465 + return $module_attrs;
1466 + }
1333 1467
1334 - $item = false;
1468 + $fields_raw = $refFields->getValue($obj);
1335 1469
1336 - $shortcode = array();
1337 - $shortcode[1] = $shortcodes[1][$key];
1338 - $shortcode[2] = $shortcodes[2][$key];
1339 - $shortcode[3] = $shortcodes[3][$key];
1340 - $shortcode[4] = $shortcodes[4][$key];
1341 - $shortcode[5] = $shortcodes[5][$key];
1342 - $shortcode[6] = $shortcodes[6][$key];
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 + }
1343 1474
1344 - $atts = shortcode_parse_atts($shortcode[3]);
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 + ];
1345 1484
1346 - if (!isset($atts['dataset']) && isset($atts['id'])) {
1347 - $template = new Model_E2pdf_Template();
1348 - $template->load($atts['id']);
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 + }
1349 1501
1350 - if ($template->get('extension') === 'divi') {
1351 - $item = $template->get('item');
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();
1352 1507
1353 - if (!$dataset) {
1354 - $serialized = serialize($_POST);
1355 - $entry = array(
1356 - 'extension' => 'divi',
1357 - 'item' => $item,
1358 - 'entry' => $serialized
1359 - );
1360 - $wpdb->insert($wpdb->prefix . 'e2pdf_datasets', $entry);
1361 - $dataset = $wpdb->insert_id;
1362 - }
1363 - $atts['dataset'] = $dataset;
1364 - $shortcode[3] .= " dataset=\"{$dataset}\" ";
1365 - }
1366 - }
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]);
1367 1526
1368 - if ($shortcode[2] === 'e2pdf-attachment' || $shortcode[2] === 'e2pdf-save') {
1369 - $shortcode[3] .= " apply=\"true\"";
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 . '"';
1370 1534 }
1371 -
1372 - $props['success_message'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), "[" . $shortcode[2] . $shortcode[3] . "]", $props['success_message']);
1373 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 + }
1374 1557 }
1375 1558 }
1559 + }
1560 + }
1376 1561
1377 - if (isset($props['custom_message'])) {
1378 - $custom_message = str_replace(array('&#91;', '&#93;'), array('[', ']'), $props['custom_message']);
1379 - }
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 + }
1380 1585
1381 - if (false !== strpos($custom_message, '[')) {
1382 - $shortcode_tags = array(
1383 - 'e2pdf-download',
1384 - 'e2pdf-save',
1385 - 'e2pdf-attachment',
1386 - 'e2pdf-adobesign'
1387 - );
1586 + // filter shortcode attributes
1587 + public function filter_et_pb_module_shortcode_attributes($props, $attrs, $render_slug, $address, $content) {
1388 1588
1389 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $custom_message, $matches);
1390 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
1589 + if ($render_slug !== 'et_pb_contact_form') {
1590 + return $props;
1591 + }
1391 1592
1392 - if (!empty($tagnames)) {
1393 - $pattern = get_shortcode_regex($tagnames);
1593 + $et_contact_proccess = array_search('et_contact_proccess', (array) $_POST);
1594 + if ($et_contact_proccess === false) {
1595 + return $props;
1596 + }
1394 1597
1395 - preg_match_all("/$pattern/", $custom_message, $shortcodes);
1598 + $success_message = isset($props['success_message']) ? $this->decode_shortcodes($props['success_message'], true) : '';
1396 1599
1397 - add_filter('wp_mail', array($this, 'filter_wp_mail'), 10, 2);
1600 + if (false !== strpos($success_message, '[')) {
1601 + $shortcode_tags = [
1602 + 'e2pdf-download',
1603 + 'e2pdf-save',
1604 + 'e2pdf-view',
1605 + 'e2pdf-adobesign',
1606 + 'e2pdf-zapier',
1607 + ];
1608 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1609 + $tagnames = array_intersect($shortcode_tags, $matches[1]);
1610 + if (!empty($tagnames)) {
1611 + $this->set('process', true);
1612 + } else {
1613 + $success_message = '';
1614 + }
1615 + }
1398 1616
1399 - foreach ($shortcodes[0] as $key => $shortcode_value) {
1400 - $item = false;
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']);
1620 + } else {
1621 + $admin_email_message = isset($props['custom_message']) ? $this->decode_shortcodes($props['custom_message']) : '';
1622 + }
1623 + if (false !== strpos($admin_email_message, '[')) {
1624 + $shortcode_tags = [
1625 + 'e2pdf-download',
1626 + 'e2pdf-save',
1627 + 'e2pdf-attachment',
1628 + 'e2pdf-adobesign',
1629 + 'e2pdf-zapier',
1630 + ];
1631 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $admin_email_message, $matches);
1632 + $tagnames = array_intersect($shortcode_tags, $matches[1]);
1633 + if (!empty($tagnames)) {
1634 + $this->set('process', true);
1635 + } else {
1636 + $admin_email_message = '';
1637 + }
1638 + }
1401 1639
1402 - $shortcode = array();
1403 - $shortcode[1] = $shortcodes[1][$key];
1404 - $shortcode[2] = $shortcodes[2][$key];
1405 - $shortcode[3] = $shortcodes[3][$key];
1406 - $shortcode[4] = $shortcodes[4][$key];
1407 - $shortcode[5] = $shortcodes[5][$key];
1408 - $shortcode[6] = $shortcodes[6][$key];
1640 + /* Divi Contact Form Helper Confirmation Email and Confirmation Email 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']);
1644 + } else {
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']) : '';
1646 + }
1647 + if (false !== strpos($user_email_message, '[')) {
1648 + $shortcode_tags = [
1649 + 'e2pdf-download',
1650 + 'e2pdf-save',
1651 + 'e2pdf-attachment',
1652 + 'e2pdf-adobesign',
1653 + 'e2pdf-zapier',
1654 + ];
1655 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $user_email_message, $matches);
1656 + $tagnames = array_intersect($shortcode_tags, $matches[1]);
1657 + if (!empty($tagnames)) {
1658 + $this->set('process', true);
1659 + } else {
1660 + $user_email_message = '';
1661 + }
1662 + }
1409 1663
1410 - $atts = shortcode_parse_atts($shortcode[3]);
1664 + $_POST = $this->sanitize($_POST);
1411 1665
1666 + // check if E2Pdf shortcodes exist in messages
1667 + if (!$this->get('process')) {
1668 + return $props;
1669 + }
1670 +
1671 + $data = $_POST;
1672 + if (isset($props['_unique_id'])) {
1673 + $data['_unique_id'] = $props['_unique_id'];
1674 + }
1675 + if (isset($props['save_files_to_media']) && $props['save_files_to_media'] == 'on') {
1676 + $data['_save_files_to_media'] = $props['save_files_to_media'];
1677 + $data['_subdir'] = wp_upload_dir()['subdir'];
1678 + } elseif (function_exists('pwh_dcfh_file_helpers')) {
1679 + $subdir = pwh_dcfh_file_helpers()::get_subdir();
1680 + if (is_array($subdir)) {
1681 + $data['_subdir'] = implode('/', $subdir);
1682 + }
1683 + } elseif (function_exists('ks_pac_dcfh_file_helper')) {
1684 + $subdir = ks_pac_dcfh_file_helper()::get_subdir();
1685 + if (is_array($subdir)) {
1686 + $data['_subdir'] = implode('/', $subdir);
1687 + }
1688 + }
1689 +
1690 + $captcha = isset($props['captcha']) ? $props['captcha'] : '';
1691 + $use_spam_service = isset($props['use_spam_service']) ? $props['use_spam_service'] : 'off';
1692 + $et_pb_contact_form_num = str_replace('et_pb_contactform_submit_', '', $et_contact_proccess);
1693 + $et_contact_error = false;
1694 + $current_form_fields = isset($data['et_pb_contact_email_fields_' . $et_pb_contact_form_num]) ? $data['et_pb_contact_email_fields_' . $et_pb_contact_form_num] : '';
1695 + $contact_email = '';
1696 + $nonce_result = isset($data['_wpnonce-et-pb-contact-form-submitted-' . $et_pb_contact_form_num]) && wp_verify_nonce($data['_wpnonce-et-pb-contact-form-submitted-' . $et_pb_contact_form_num], 'et-pb-contact-form-submit') ? true : false;
1697 +
1698 + if ($nonce_result && isset($data['et_pb_contactform_submit_' . $et_pb_contact_form_num]) && empty($data['et_pb_contact_et_number_' . $et_pb_contact_form_num])) {
1699 + if ('' !== $current_form_fields) {
1700 + $fields_data_json = str_replace('\\', '', $current_form_fields);
1701 + $fields_data_array = json_decode($fields_data_json, true);
1702 +
1703 + // check whether captcha field is not empty
1704 + if ('on' === $captcha && 'off' === $use_spam_service && (!isset($data['et_pb_contact_captcha_' . $et_pb_contact_form_num]) || empty($data['et_pb_contact_captcha_' . $et_pb_contact_form_num]))) {
1705 + $et_contact_error = true;
1706 + } elseif ('on' === $use_spam_service) {
1707 + if (class_exists('ET_Builder_Element')) {
1708 + $contact_form = ET_Builder_Element::get_module('et_pb_contact_form');
1709 + if ($contact_form && is_object($contact_form) && method_exists($contact_form, 'is_spam_submission')) {
1710 + $contact_form->props = $props;
1711 + if ($contact_form->is_spam_submission()) {
1712 + if (!empty($_POST['token'])) {
1713 + unset($_POST['token']);
1714 + }
1715 + $et_contact_error = true;
1716 + } else {
1717 + $props['use_spam_service'] = 'off';
1718 + $props['captcha'] = 'off';
1719 + }
1720 + }
1721 + }
1722 + }
1723 +
1724 + // check all fields on current form and generate error message if needed
1725 + if (!empty($fields_data_array)) {
1726 + foreach ($fields_data_array as $value) {
1727 + if (isset($value['field_id']) && 'et_pb_contact_et_number_' . $et_pb_contact_form_num === $value['field_id']) {
1728 + continue;
1729 + }
1730 + /* Check all the required fields, generate error message if required field is empty */
1731 + $field_value = isset($data[$value['field_id']]) ? trim($data[$value['field_id']]) : '';
1732 + if ('required' === $value['required_mark'] && empty($field_value) && !is_numeric($field_value)) {
1733 + $et_contact_error = true;
1734 + continue;
1735 + }
1736 + /* Additional check for email field */
1737 + if ('email' === $value['field_type'] && 'required' === $value['required_mark'] && !empty($field_value)) {
1738 + $contact_email = isset($data[$value['field_id']]) ? sanitize_email($data[$value['field_id']]) : '';
1739 + if (!empty($contact_email) && !is_email($contact_email)) {
1740 + $et_contact_error = true;
1741 + }
1742 + }
1743 + }
1744 + }
1745 + } else {
1746 + $et_contact_error = true;
1747 + }
1748 + } else {
1749 + $et_contact_error = true;
1750 + }
1751 +
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 +
1763 + $dataset = false;
1764 + if (false !== strpos($success_message, '[')) {
1765 + $shortcode_tags = [
1766 + 'e2pdf-download',
1767 + 'e2pdf-save',
1768 + 'e2pdf-view',
1769 + 'e2pdf-adobesign',
1770 + 'e2pdf-zapier',
1771 + ];
1772 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1773 + $tagnames = array_intersect($shortcode_tags, $matches[1]);
1774 + if (!empty($tagnames)) {
1775 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $success_message, $shortcodes);
1776 + foreach ($shortcodes[0] as $key => $shortcode_value) {
1777 + $item = false;
1778 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1779 + $atts = shortcode_parse_atts($shortcode[3]);
1780 + if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedIf
1781 + } else {
1412 1782 if (!isset($atts['dataset']) && isset($atts['id'])) {
1413 1783 $template = new Model_E2pdf_Template();
1414 1784 $template->load($atts['id']);
1415 1785 if ($template->get('extension') === 'divi') {
1416 1786 $item = $template->get('item');
1417 -
1418 1787 if (!$dataset) {
1419 - $serialized = serialize($_POST);
1420 - $entry = array(
1421 - 'extension' => 'divi',
1422 - 'item' => $item,
1423 - 'entry' => $serialized
1424 - );
1425 - $wpdb->insert($wpdb->prefix . 'e2pdf_datasets', $entry);
1426 - $dataset = $wpdb->insert_id;
1788 + $entry = new Model_E2pdf_Dataset();
1789 + $entry->set('extension', 'divi');
1790 + $entry->set('item', $item);
1791 + $entry->set('entry', $data);
1792 + $dataset = $entry->save();
1427 1793 }
1428 1794 $atts['dataset'] = $dataset;
1429 - $shortcode[3] .= " dataset=\"{$dataset}\"";
1795 + $shortcode[3] .= ' dataset="' . $dataset . '"';
1430 1796 }
1431 1797 }
1798 + if (!isset($atts['apply'])) {
1799 + $shortcode[3] .= ' apply="true"';
1800 + }
1801 + if (!isset($atts['iframe_download'])) {
1802 + $shortcode[3] .= ' iframe_download="true"';
1803 + }
1804 + $props['success_message'] = str_replace($this->encode_shortcodes($shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['success_message']);
1805 + }
1806 + }
1807 + }
1808 + }
1432 1809
1433 - $props['custom_message'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), "[" . $shortcode[2] . $shortcode[3] . "]", $props['custom_message']);
1810 + if (false !== strpos($admin_email_message, '[')) {
1811 + $shortcode_tags = [
1812 + 'e2pdf-download',
1813 + 'e2pdf-save',
1814 + 'e2pdf-attachment',
1815 + 'e2pdf-adobesign',
1816 + 'e2pdf-zapier',
1817 + ];
1818 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $admin_email_message, $matches);
1819 + $tagnames = array_intersect($shortcode_tags, $matches[1]);
1820 + if (!empty($tagnames)) {
1821 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $admin_email_message, $shortcodes);
1822 + foreach ($shortcodes[0] as $key => $shortcode_value) {
1823 + $item = false;
1824 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1825 + $atts = shortcode_parse_atts($shortcode[3]);
1826 + if (!isset($atts['dataset']) && isset($atts['id'])) {
1827 + $template = new Model_E2pdf_Template();
1828 + $template->load($atts['id']);
1829 + if ($template->get('extension') === 'divi') {
1830 + $item = $template->get('item');
1831 + if (!$dataset) {
1832 + $entry = new Model_E2pdf_Dataset();
1833 + $entry->set('extension', 'divi');
1834 + $entry->set('item', $item);
1835 + $entry->set('entry', $data);
1836 + $dataset = $entry->save();
1837 + }
1838 + $atts['dataset'] = $dataset;
1839 + $shortcode[3] .= ' dataset="' . $dataset . '"';
1840 + }
1434 1841 }
1842 + if ($admin_email_rich_text) {
1843 + if ((defined('PWH_DCFH_PLUGIN_VERSION') && version_compare(PWH_DCFH_PLUGIN_VERSION, '1.5.1', '>=')) || defined('KS_PAC_DCFH_PLUGIN_FILE')) {
1844 + $props['custom_message_richtext'] = str_replace($this->encode_shortcodes($shortcode_value), '{' . $shortcode[2] . $shortcode[3] . '}', $props['custom_message_richtext']);
1845 + } else {
1846 + $props['custom_message_richtext'] = str_replace($this->encode_shortcodes($shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['custom_message_richtext']);
1847 + }
1848 + } else {
1849 + $props['custom_message'] = str_replace($this->encode_shortcodes($shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['custom_message']);
1850 + }
1435 1851 }
1436 1852 }
1437 1853 }
1854 +
1855 + if (false !== strpos($user_email_message, '[')) {
1856 + $shortcode_tags = [
1857 + 'e2pdf-download',
1858 + 'e2pdf-save',
1859 + 'e2pdf-attachment',
1860 + 'e2pdf-adobesign',
1861 + 'e2pdf-zapier',
1862 + ];
1863 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $user_email_message, $matches);
1864 + $tagnames = array_intersect($shortcode_tags, $matches[1]);
1865 + if (!empty($tagnames)) {
1866 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $user_email_message, $shortcodes);
1867 + foreach ($shortcodes[0] as $key => $shortcode_value) {
1868 + $item = false;
1869 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1870 + $atts = shortcode_parse_atts($shortcode[3]);
1871 + if (!isset($atts['dataset']) && isset($atts['id'])) {
1872 + $template = new Model_E2pdf_Template();
1873 + $template->load($atts['id']);
1874 + if ($template->get('extension') === 'divi') {
1875 + $item = $template->get('item');
1876 + if (!$dataset) {
1877 + $entry = new Model_E2pdf_Dataset();
1878 + $entry->set('extension', 'divi');
1879 + $entry->set('item', $item);
1880 + $entry->set('entry', $data);
1881 + $dataset = $entry->save();
1882 + }
1883 + $atts['dataset'] = $dataset;
1884 + $shortcode[3] .= ' dataset="' . $dataset . '"';
1885 + }
1886 + }
1887 + if ((defined('PWH_DCFH_PLUGIN_VERSION') && version_compare(PWH_DCFH_PLUGIN_VERSION, '1.5.1', '>=')) || defined('KS_PAC_DCFH_PLUGIN_FILE')) {
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']);
1890 + } else {
1891 + $props['confirmation_email_message'] = str_replace($this->encode_shortcodes($shortcode_value), '{' . $shortcode[2] . $shortcode[3] . '}', $props['confirmation_email_message']);
1892 + }
1893 + } else {
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']);
1896 + } else {
1897 + $props['confirmation_email_message'] = str_replace($this->encode_shortcodes($shortcode_value), '[' . $shortcode[2] . $shortcode[3] . ']', $props['confirmation_email_message']);
1898 + }
1899 + }
1900 + }
1901 + }
1902 + }
1438 1903 }
1439 1904
1440 1905 return $props;
1441 1906 }
1442 1907
1908 + // filter shortcode output
1443 1909 public function filter_et_module_shortcode_output($output, $render_slug, $form) {
1444 1910
1445 - if ($render_slug && $render_slug == 'et_pb_contact_form' && !empty($_POST) && $et_contact_proccess = array_search('et_contact_proccess', $_POST)) {
1911 + if ($render_slug !== 'et_pb_contact_form') {
1912 + return $output;
1913 + }
1446 1914
1447 - $et_pb_contact_form_num = str_replace("et_pb_contactform_submit_", "", $et_contact_proccess);
1915 + $et_contact_proccess = array_search('et_contact_proccess', (array) $_POST);
1916 + if ($et_contact_proccess === false) {
1917 + return $output;
1918 + }
1448 1919
1449 - $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;
1920 + $et_pb_contact_form_num = str_replace(['pwh_dcfh_et_pb_contactform_submit_', 'et_pb_contactform_submit_'], ['', ''], $et_contact_proccess);
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;
1450 1922
1451 - if ($nonce_result && isset($_POST['et_pb_contactform_submit_' . $et_pb_contact_form_num]) && empty($_POST['et_pb_contactform_validate_' . $et_pb_contact_form_num])) {
1452 -
1453 - $dataset = false;
1454 -
1455 - $success_message = '';
1456 - $custom_message = '';
1457 -
1458 - if (isset($form->props['success_message'])) {
1459 - $success_message = str_replace(array('&#91;', '&#93;', '&quot;'), array('[', ']', '"'), $form->props['success_message']);
1460 - }
1461 -
1462 - if (false !== strpos($success_message, '[')) {
1463 - $shortcode_tags = array(
1464 - 'e2pdf-download',
1465 - 'e2pdf-save',
1466 - 'e2pdf-view',
1467 - 'e2pdf-adobesign'
1468 - );
1469 -
1470 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1471 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
1472 -
1473 - if (!empty($tagnames)) {
1474 - $pattern = get_shortcode_regex($tagnames);
1475 -
1476 - preg_match_all("/$pattern/", $success_message, $shortcodes);
1477 -
1478 - foreach ($shortcodes[0] as $key => $shortcode_value) {
1479 -
1480 - $shortcode = array();
1481 - $shortcode[1] = $shortcodes[1][$key];
1482 - $shortcode[2] = $shortcodes[2][$key];
1483 - $shortcode[3] = $shortcodes[3][$key];
1484 - $shortcode[4] = $shortcodes[4][$key];
1485 - $shortcode[5] = $shortcodes[5][$key];
1486 - $shortcode[6] = $shortcodes[6][$key];
1487 -
1488 - $output = str_replace(str_replace(array('"'), array('&quot;'), $shortcode_value), do_shortcode_tag($shortcode), $output);
1923 + if ($nonce_result && (
1924 + (isset($_POST['et_pb_contactform_submit_' . $et_pb_contact_form_num]) && empty($_POST['et_pb_contact_et_number_' . $et_pb_contact_form_num])) ||
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')
1926 + )
1927 + ) {
1928 + $success_message = isset($form->props['success_message']) ? $this->decode_shortcodes($form->props['success_message'], true) : '';
1929 + if (false !== strpos($success_message, '[')) {
1930 + $shortcode_tags = [
1931 + 'e2pdf-download',
1932 + 'e2pdf-save',
1933 + 'e2pdf-view',
1934 + 'e2pdf-adobesign',
1935 + 'e2pdf-zapier',
1936 + ];
1937 + preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1938 + $tagnames = array_intersect($shortcode_tags, $matches[1]);
1939 + if (!empty($tagnames)) {
1940 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $success_message, $shortcodes);
1941 + foreach ($shortcodes[0] as $key => $shortcode_value) {
1942 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1943 + if (isset($form->props['enable_multistep']) && 'on' === $form->props['enable_multistep']) {
1944 + $output = str_replace($shortcode_value, do_shortcode_tag($shortcode), $output);
1945 + } else {
1946 + $output = str_replace(str_replace(['"'], ['&quot;'], $shortcode_value), do_shortcode_tag($shortcode), $output);
1489 1947 }
1490 1948 }
1491 1949 }
1492 1950 }
1493 -
1494 - remove_filter('wp_mail', array($this, 'filter_wp_mail'), 10);
1495 -
1496 - $files = $this->helper->get('divi_attachments');
1497 - if (is_array($files) && !empty($files)) {
1498 - foreach ($files as $key => $file) {
1499 - $this->helper->delete_dir(dirname($file) . '/');
1500 - }
1501 - $this->helper->deset('divi_attachments');
1502 - }
1503 1951 }
1504 -
1505 1952 return $output;
1506 1953 }
1507 1954
1508 - /**
1509 - * Delete dataset for template
1510 - *
1511 - * @param int $template_id - Template ID
1512 - * @param int $dataset - Dataset ID
1513 - *
1514 - * @return bool - Result of removing items
1515 - */
1955 + // delete item
1516 1956 public function delete_item($template_id = false, $dataset = false) {
1517 1957 global $wpdb;
1518 -
1519 1958 $template = new Model_E2pdf_Template();
1520 1959 if ($template_id && $dataset && $template->load($template_id)) {
1521 1960 if ($template->get('extension') === 'divi' && $template->get('item')) {
1522 -
1523 1961 $item = $template->get('item');
1524 -
1525 - $where = array(
1962 + $where = [
1526 1963 'ID' => $dataset,
1527 1964 'item' => $item,
1528 - 'extension' => 'divi'
1529 - );
1965 + 'extension' => 'divi',
1966 + ];
1530 1967 $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1531 1968 return true;
1532 1969 }
1533 1970 }
1534 -
1535 1971 return false;
1536 1972 }
1537 1973
1538 - /**
1539 - * Delete all datasets for Template
1540 - *
1541 - * @param int $template_id - Template ID
1542 - *
1543 - * @return bool - Result of removing items
1544 - */
1974 + // delete items
1545 1975 public function delete_items($template_id = false) {
1546 1976 global $wpdb;
1547 -
1548 1977 $template = new Model_E2pdf_Template();
1549 -
1550 1978 if ($template_id && $template->load($template_id)) {
1551 1979 if ($template->get('extension') === 'divi' && $template->get('item')) {
1980 + $where = [
1981 + 'item' => $template->get('item'),
1982 + 'extension' => 'divi',
1983 + ];
1984 + $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1985 + return true;
1986 + }
1987 + }
1988 + return false;
1989 + }
1552 1990
1553 - $item = $template->get('item');
1991 + // styles
1992 + public function styles($item_id = false) {
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 + }
1554 2013
1555 - $where = array(
1556 - 'item' => $item,
1557 - 'extension' => 'divi'
1558 - );
1559 - $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1560 - return true;
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);
1561 2028 }
2029 + return $value;
1562 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 + }
1563 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
2053 + );
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 + }
1564 2094 return false;
1565 2095 }
1566 2096
1567 - /**
1568 - * Get styles for generating Map Field function
1569 - *
1570 - * @return array - List of css files to load
1571 - */
1572 - public function styles() {
1573 - $styles = array(
1574 - plugins_url('css/extension/divi.css?v=' . time(), $this->helper->get('plugin_file_path'))
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 . '/'
1575 2125 );
1576 - return $styles;
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;
1577 2159 }
1578 -
1579 2160 }