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 +1681 -1048 1.05.03 → 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,117 +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 174 } else {
88 - 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 + }
89 185 }
186 + return $value;
90 187 }
91 188
92 - /**
93 - * Get items to work with
94 - *
95 - * @return array() - List of available items
96 - */
189 + // items
97 190 public function items() {
98 191 global $wpdb;
99 -
100 - $condition = array(
101 - 'post_content' => array(
192 + $condition = [
193 + 'post_content' => [
102 194 'condition' => 'LIKE',
103 195 'value' => '%et_pb_contact_form%',
104 - 'type' => '%s'
105 - ),
106 - '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' => [
107 208 'condition' => '<>',
108 - 'value' => array(
209 + 'value' => [
109 210 'revision',
110 - 'et_pb_layout'
111 - ),
112 - 'type' => '%s'
113 - ),
114 - );
115 -
116 - $order_condition = array(
211 + 'et_pb_layout',
212 + ],
213 + 'type' => '%s',
214 + ],
215 + ];
216 + $order_condition = [
117 217 'orderby' => 'id',
118 218 'order' => 'desc',
119 - );
120 -
219 + ];
121 220 $where = $this->helper->load('db')->prepare_where($condition);
122 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']));
123 224
124 - $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'posts' . $where['sql'] . $orderby . "", $where['filter']));
125 -
126 - $content = array();
225 + $content = [];
127 226 foreach ($posts as $key => $post) {
128 - if ($forms_labels = $this->get_forms($post->post_content)) {
129 - foreach ($forms_labels as $form_key => $form_value) {
130 - $content[] = $this->item($form_key);
131 - }
227 + foreach ($this->get_forms($post->post_content) as $form_key => $form_value) {
228 + $content[] = $this->item($form_key);
132 229 }
133 230 }
134 231 return $content;
135 232 }
136 233
137 - /**
138 - * Parse available forms from pages
139 - *
140 - * @param string $content - Page content
141 - *
142 - * @return array() - Forms list
143 - */
234 + // get forms
144 235 public function get_forms($content) {
236 + $forms = [];
145 237
146 - $forms = array();
147 - if (false !== strpos($content, 'et_pb_contact_form')) {
148 - $shortcode_tags = array(
238 + if ($this->divi4_form($content)) {
239 + $shortcode_tags = [
149 240 'et_pb_contact_form',
150 - );
151 -
241 + ];
152 242 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
153 243 $tagnames = array_intersect($shortcode_tags, $matches[1]);
154 -
155 244 if (!empty($tagnames)) {
156 - $pattern = get_shortcode_regex($tagnames);
157 -
158 - preg_match_all("/$pattern/", $content, $shortcodes);
245 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
159 246 foreach ($shortcodes[0] as $key => $shortcode_value) {
160 -
161 - $shortcode = array();
162 - $shortcode[1] = $shortcodes[1][$key];
163 - $shortcode[2] = $shortcodes[2][$key];
164 - $shortcode[3] = $shortcodes[3][$key];
165 - $shortcode[4] = $shortcodes[4][$key];
166 - $shortcode[5] = $shortcodes[5][$key];
167 - $shortcode[6] = $shortcodes[6][$key];
168 -
247 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
169 248 preg_match_all('/admin_label="(.*?)"/', $shortcode[3], $labels);
170 249 if (isset($labels['1'])) {
171 250 foreach ($labels['1'] as $label) {
172 251 $forms[$label] = $label;
@@ -173,470 +252,338 @@
173 252 }
174 253 }
175 254 }
176 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 + }
177 264 }
178 -
179 265 return $forms;
180 266 }
181 267
182 - /**
183 - * Get entries for export
184 - *
185 - * @param string $item - Item
186 - * @param string $name - Entries names
187 - *
188 - * @return array() - Entries list
189 - */
190 - public function datasets($item = false, $name = false) {
191 -
268 + // datasets
269 + public function datasets($item_id = false, $name = false) {
192 270 global $wpdb;
193 -
194 - $datasets = array();
195 -
196 - if ($item) {
197 - $condition = array(
198 - 'extension' => array(
271 + $datasets = [];
272 + if ($item_id) {
273 + $condition = [
274 + 'extension' => [
199 275 'condition' => '=',
200 276 'value' => 'divi',
201 - 'type' => '%s'
202 - ),
203 - 'item' => array(
277 + 'type' => '%s',
278 + ],
279 + 'item' => [
204 280 'condition' => '=',
205 - 'value' => $item,
206 - 'type' => '%s'
207 - ),
208 - );
209 -
210 - $order_condition = array(
281 + 'value' => $item_id,
282 + 'type' => '%s',
283 + ],
284 + ];
285 + $order_condition = [
211 286 'orderby' => 'ID',
212 287 'order' => 'desc',
213 - );
214 -
288 + ];
215 289 $where = $this->helper->load('db')->prepare_where($condition);
216 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']));
217 293
218 - $datasets_tmp = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'e2pdf_datasets' . $where['sql'] . $orderby . "", $where['filter']));
219 -
220 - if ($datasets_tmp) {
221 - foreach ($datasets_tmp as $key => $dataset) {
222 - $this->set('item', $item);
223 - $this->set('dataset', $dataset->ID);
224 - $dataset_title = $this->render($name);
225 - if (!$dataset_title) {
226 - $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;
227 301 }
228 - $datasets[] = array(
229 - 'key' => $dataset->ID,
230 - 'value' => $dataset_title
231 - );
302 + $datasets[] = [
303 + 'key' => $entry->ID,
304 + 'value' => $entry_title,
305 + ];
232 306 }
233 307 }
234 308 }
235 -
236 309 return $datasets;
237 310 }
238 311
239 - /**
240 - * Get dataset
241 - *
242 - * @param int $dataset - Dataset ID
243 - *
244 - * @return object - Dataset
245 - */
246 - 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 + }
247 323
248 - $dataset = (int) $dataset;
249 -
250 - if (!$dataset) {
324 + // get template actions
325 + public function get_template_actions($template = false) {
326 + $template = (int) $template;
327 + if (!$template) {
251 328 return;
252 329 }
330 + $actions = new stdClass();
331 + $actions->delete = true;
332 + return $actions;
333 + }
253 334
254 - $data = new stdClass();
255 - $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 + }
256 349
257 - 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;
258 372 }
259 373
260 - /**
261 - * Get item
262 - *
263 - * @param string $item - Item
264 - *
265 - * @return object - Item
266 - */
267 - public function item($item = false) {
268 -
269 - $form = new stdClass();
270 -
271 - if (!$item && $this->get('item')) {
272 - $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');
273 378 }
274 -
275 - if ($item) {
276 - $form->id = (string) $item;
277 - $form->name = $item;
278 - $post = $this->get_post($item);
279 - $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 + }
280 394 } else {
281 - $form->id = '';
282 - $form->name = '';
283 - $form->url = 'javascript:void(0);';
395 + $item->id = '';
396 + $item->name = '';
397 + $item->url = '';
284 398 }
285 - return $form;
399 + return $item;
286 400 }
287 401
288 - /**
289 - * Get post
290 - *
291 - * @param string $item_id - Form label
292 - *
293 - * @return object - Post
294 - */
295 - public function get_post($item_id = false) {
402 + // get form
403 + public function get_form($item_id = false) {
296 404 global $wpdb;
297 -
298 405 $item_post = false;
299 -
300 - $condition = array(
301 - 'post_content' => array(
406 + $condition = [
407 + 'post_content' => [
302 408 'condition' => 'LIKE',
303 409 'value' => '%admin_label="' . $item_id . '"%',
304 - 'type' => '%s'
305 - ),
306 - 'post_type' => array(
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' => [
307 422 'condition' => '<>',
308 - 'value' => array(
423 + 'value' => [
309 424 'revision',
310 - 'et_pb_layout'
311 - ),
312 - 'type' => '%s'
313 - ),
314 - );
425 + 'et_pb_layout',
426 + ],
427 + 'type' => '%s',
428 + ],
429 + ];
315 430
316 - $order_condition = array(
431 + $order_condition = [
317 432 'orderby' => 'id',
318 433 'order' => 'desc',
319 - );
434 + ];
320 435
321 436 $where = $this->helper->load('db')->prepare_where($condition);
322 437 $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
323 -
324 - $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'posts' . $where['sql'] . $orderby . "", $where['filter']));
325 - foreach ($posts as $key => $post) {
326 - if ($forms_labels = $this->get_forms($post->post_content)) {
327 - if (in_array($item_id, $forms_labels)) {
328 - $item_post = $post;
329 - break;
330 - }
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;
331 444 }
332 445 }
333 446 return $item_post;
334 447 }
335 448
336 - /**
337 - * Render value according to content
338 - *
339 - * @param string $value - Content
340 - * @param string $type - Type of rendering value
341 - * @param array $field - Field details
342 - *
343 - * @return string - Fully rendered value
344 - */
345 - public function render($value, $type = false, $field = array()) {
346 -
347 - $value = $this->render_shortcodes($value, $type, $field);
348 - $value = $this->strip_shortcodes($value);
349 -
350 - if ($type === 'value' && isset($field['type']) && $field['type'] === 'e2pdf-checkbox' && isset($field['properties']['option'])) {
351 - $option = $this->render($field['properties']['option']);
352 - $options = explode(', ', $value);
353 - $option_options = explode(', ', $option);
354 - if (is_array($options) && is_array($option_options) && !array_diff($option_options, $options)) {
355 - return $option;
356 - } else {
357 - return "";
358 - }
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);
359 456 }
360 -
361 - if ($type === 'value') {
362 - $value = $this->convert_shortcodes($value, true);
363 - }
364 -
365 457 return $value;
366 458 }
367 459
368 - /**
369 - * Render shortcodes which available in this extension
370 - *
371 - * @param string $value - Content
372 - * @param string $type - Type of rendering value
373 - * @param array $field - Field details
374 - *
375 - * @return string - Value with rendered shortcodes
376 - */
377 - public function render_shortcodes($value, $type = false, $field = array()) {
378 - global $wpdb;
379 -
380 - $dataset_id = $this->get('dataset');
381 - $item_id = $this->get('item');
382 -
383 - $condition = array(
384 - 'ID' => array(
385 - 'condition' => '=',
386 - 'value' => $dataset_id,
387 - 'type' => '%d'
388 - ),
389 - 'item' => array(
390 - 'condition' => '=',
391 - 'value' => $item_id,
392 - 'type' => '%s'
393 - ),
394 - 'extension' => array(
395 - 'condition' => '=',
396 - 'value' => 'divi',
397 - 'type' => '%s'
398 - ),
399 - );
400 -
401 - $where = $this->helper->load('db')->prepare_where($condition);
402 -
403 - $dataset = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'e2pdf_datasets' . $where['sql'] . "", $where['filter']));
404 -
405 - $processed_fields_values = array();
406 - if ($dataset) {
407 - $post = unserialize($dataset->entry);
408 - if ($post && is_array($post)) {
409 -
410 - $et_pb_contact_form_num = 0;
411 -
412 - $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] : '';
413 - $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;
414 - $processed_fields_values = array();
415 -
416 - if ('' !== $current_form_fields) {
417 - $fields_data_json = str_replace('\\', '', $current_form_fields);
418 - $fields_data_array = json_decode($fields_data_json, true);
419 -
420 - if (!empty($fields_data_array)) {
421 - foreach ($fields_data_array as $index => $field_value) {
422 - $processed_fields_values[$field_value['original_id']]['value'] = isset($post[$field_value['field_id']]) ? $post[$field_value['field_id']] : '';
423 - $processed_fields_values[$field_value['original_id']]['label'] = $field_value['field_label'];
424 - }
425 - }
426 - }
427 - }
428 -
429 - $replace = array();
430 - foreach ($processed_fields_values as $field_key => $field_value) {
431 - $replace["%%" . $field_key . "%%"] = wp_strip_all_tags($field_value['value']);
432 - }
433 -
460 + // render shortcodes
461 + public function render_shortcodes($value, $field = []) {
462 + $element_id = isset($field['element_id']) ? $field['element_id'] : false;
463 + if ($this->verify()) {
434 464 if (false !== strpos($value, '[')) {
435 -
436 - $shortcode_tags = array(
437 - 'e2pdf-format-number',
438 - 'e2pdf-format-date',
439 - 'e2pdf-format-output',
440 - );
441 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $value, $matches);
442 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
443 -
444 - if (!empty($tagnames)) {
445 -
446 - $pattern = get_shortcode_regex($tagnames);
447 - preg_match_all("/$pattern/", $value, $shortcodes);
448 - foreach ($shortcodes[0] as $key => $shortcode_value) {
449 - $shortcode = array();
450 - $shortcode[1] = $shortcodes[1][$key];
451 - $shortcode[2] = $shortcodes[2][$key];
452 - $shortcode[3] = $shortcodes[3][$key];
453 - $shortcode[4] = $shortcodes[4][$key];
454 - $shortcode[5] = $shortcodes[5][$key];
455 - $shortcode[6] = $shortcodes[6][$key];
456 -
457 - if (isset($shortcode['5'])) {
458 - if (isset($field['type']) && ($field['type'] === 'e2pdf-image' || $field['type'] === 'e2pdf-signature')) {
459 - $sub_value = $this->render($shortcode['5'], $type);
460 - } else {
461 - $sub_value = $this->render($shortcode['5'], $type, $field);
462 - }
463 - $value = str_replace($shortcode_value, "[" . $shortcode['2'] . $shortcode['3'] . "]" . $sub_value . "[/" . $shortcode['2'] . "]", $value);
464 - }
465 - }
466 - }
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);
467 468 }
468 -
469 - $value = do_shortcode($value);
470 -
471 - if ($dataset) {
472 - $value = $this->helper->load('convert')->stritr($value, $replace);
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'));
473 472 }
474 -
475 - if (isset($field['type']) && ($field['type'] === 'e2pdf-image' || $field['type'] === 'e2pdf-signature')) {
476 - $esig = isset($field['properties']['esig']) && $field['properties']['esig'] ? true : false;
477 - if ($esig) {
478 - //process e-signature
479 - $value = "";
480 - } else {
481 - if (!$this->helper->load('image')->get_image($value)) {
482 - $value = $this->strip_shortcodes($value);
483 - if (
484 - $value &&
485 - trim($value) != "" &&
486 - extension_loaded('gd') &&
487 - function_exists('imagettftext')
488 - ) {
489 - if (isset($field['properties']['text_color']) && $field['properties']['text_color']) {
490 - $penColour = $this->helper->load('convert')->to_hex_color($field['properties']['text_color']);
491 - } else {
492 - $penColour = array(0x14, 0x53, 0x94);
493 - }
494 -
495 - $default_options = array(
496 - 'imageSize' => array(isset($field['width']) ? $field['width'] : '400', isset($field['height']) ? $field['height'] : '150'),
497 - 'bgColour' => 'transparent',
498 - 'penColour' => $penColour
499 - );
500 -
501 - $options = array();
502 - $options = array_merge($default_options, $options);
503 -
504 - $model_e2pdf_font = new Model_E2pdf_Font();
505 -
506 - $font = false;
507 - if (isset($field['properties']['text_font']) && $field['properties']['text_font']) {
508 - $font = $model_e2pdf_font->get_font_path($field['properties']['text_font']);
509 - }
510 - if (!$font) {
511 - $font = $model_e2pdf_font->get_font_path('Noto Sans');
512 - }
513 -
514 - $size = 150;
515 - if (isset($field['properties']['text_font_size']) && $field['properties']['text_font_size']) {
516 - $size = $field['properties']['text_font_size'];
517 - }
518 -
519 - $model_e2pdf_signature = new Model_E2pdf_Signature();
520 - $value = $model_e2pdf_signature->ttf_signature($value, $size, $font, $options);
521 - } else {
522 - $value = "";
523 - }
524 - }
525 - }
526 - } else {
527 - $value = $this->convert_shortcodes($value);
528 - }
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
477 + );
529 478 }
530 -
531 - 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 + );
532 482 }
533 483
534 - /**
535 - * Strip unused shortcodes
536 - *
537 - * @param string $value - Content
538 - *
539 - * @return string - Value with removed unused shortcodes
540 - */
484 + // strip shortcodes
541 485 public function strip_shortcodes($value) {
542 - $value = preg_replace('~(?:\[/?)[^/\]]+/?\]~s', "", $value);
543 - $value = preg_replace('~(?:%%/?)[^/%%]+/?%%~s', "", $value);
486 + $value = preg_replace('~(?:\[/?)[^/\]]+/?\]~s', '', $value);
487 + $value = preg_replace('~%%[^%%]*%%~', '', $value);
544 488 return $value;
545 489 }
546 490
547 - public function convert_shortcodes($value, $to = false) {
491 + // convert shortcodes
492 + public function convert_shortcodes($value, $to = false, $html = false) {
548 493 if ($value) {
549 494 if ($to) {
550 - $value = str_replace("&#91;", "[", $value);
551 - //$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 + }
552 500 } else {
553 - $value = str_replace("[", "&#91;", $value);
554 - //$value = str_replace("%", "&#37;", $value);
501 + $value = str_replace('[', '&#91;', $value);
555 502 }
556 503 }
557 504 return $value;
558 505 }
559 506
507 + // auto
560 508 public function auto() {
561 509
562 - $response = array();
563 - $elements = array();
510 + $elements = [];
564 511
565 512 if ($this->get('item')) {
566 - $post = $this->get_post($this->get('item'));
513 + $post = $this->get_form($this->get('item'));
567 514 if ($post && isset($post->post_content)) {
568 515
516 + $source = '';
569 517 $content = $post->post_content;
570 518
571 - if (false !== strpos($content, '[')) {
572 - $shortcode_tags = array(
519 + if ($this->divi4_form($content)) {
520 + $shortcode_tags = [
573 521 'et_pb_contact_form',
574 - );
575 -
522 + ];
576 523 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
577 524 $tagnames = array_intersect($shortcode_tags, $matches[1]);
578 -
579 525 if (!empty($tagnames)) {
580 - $pattern = get_shortcode_regex($tagnames);
581 -
582 - preg_match_all("/$pattern/", $content, $shortcodes);
583 -
526 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
584 527 foreach ($shortcodes[0] as $key => $shortcode_value) {
585 -
586 - $shortcode = array();
587 - $shortcode[1] = $shortcodes[1][$key];
588 - $shortcode[2] = $shortcodes[2][$key];
589 - $shortcode[3] = $shortcodes[3][$key];
590 - $shortcode[4] = $shortcodes[4][$key];
591 - $shortcode[5] = $shortcodes[5][$key];
592 - $shortcode[6] = $shortcodes[6][$key];
593 -
528 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
594 529 $atts = shortcode_parse_atts($shortcode[3]);
595 530 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
596 -
597 - require_once(ET_BUILDER_DIR . 'class-et-builder-element.php');
598 - require_once(ET_BUILDER_DIR . 'functions.php');
599 - require_once(ET_BUILDER_DIR . 'ab-testing.php');
600 - require_once(ET_BUILDER_DIR . 'class-et-global-settings.php');
601 - require_once(ET_BUILDER_DIR . 'module/ContactForm.php');
602 - require_once(ET_BUILDER_DIR . 'module/ContactFormItem.php');
603 -
604 - new ET_Builder_Module_Contact_Form();
605 - new ET_Builder_Module_Contact_Form_Item();
606 -
531 + $this->divi4_load();
607 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 + }
608 546
609 - libxml_use_internal_errors(true);
610 - $dom = new DOMDocument();
611 - if (function_exists('mb_convert_encoding')) {
612 - $html = $dom->loadHTML(mb_convert_encoding($source, 'HTML-ENTITIES', 'UTF-8'));
613 - } else {
614 - $html = $dom->loadHTML('<?xml encoding="UTF-8">' . $source);
615 - }
616 - 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);
617 553
618 - if ($html) {
619 - $xpath = new DomXPath($dom);
620 - $blocks = $xpath->query("//*[contains(@class, 'et_pb_contact_field')]");
621 - 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 + }
622 564
623 - $data_type = $element->attributes->getNamedItem("data-type")->nodeValue;
565 + $blocks = $xpath->query("//*[contains(@class, 'et_pb_contact_field')]");
566 + foreach ($blocks as $element) {
624 567
625 - if ($data_type == 'radio') {
568 + if ($xml->get_node_value($element, 'data-type') == 'radio') {
626 569
627 - $label = $xpath->query(".//label", $element)->item(0);
628 - $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);
629 572
630 - $name = "";
631 - if ($check_handler) {
632 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
633 - }
573 + $name = '';
574 + if ($check_handler) {
575 + $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
576 + }
634 577
635 - $elements[] = $this->auto_field($element, array(
578 + if ($label) {
579 + $elements[] = $this->auto_field(
580 + $element,
581 + [
636 582 'type' => 'e2pdf-html',
637 583 'block' => true,
638 - 'properties' => array(
584 + 'class' => $xml->get_node_value($element, 'class'),
585 + 'properties' => [
639 586 'top' => '20',
640 587 'left' => '20',
641 588 'right' => '20',
642 589 'width' => '100%',
@@ -641,52 +588,73 @@
641 588 'right' => '20',
642 589 'width' => '100%',
643 590 'height' => 'auto',
644 591 'value' => $label->nodeValue,
645 - )
646 - ));
592 + ],
593 + ]
594 + );
595 + }
647 596
648 - $fields = $xpath->query("//*[contains(@class, 'et_pb_contact_field_radio')]", $element);
649 - foreach ($fields as $field) {
650 - $radio_label = $xpath->query(".//label", $field)->item(0);
651 - $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);
652 601
653 - $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 + [
654 609 'type' => 'e2pdf-radio',
655 - 'properties' => array(
610 + 'class' => $xml->get_node_value($field, 'class'),
611 + 'properties' => [
656 612 'top' => '5',
657 613 'width' => 'auto',
658 614 'height' => 'auto',
659 - 'value' => "%%" . $radio->attributes->getNamedItem("data-original_id")->nodeValue . "%%",
660 - 'option' => $radio->attributes->getNamedItem("value")->nodeValue,
661 - 'group' => $radio->attributes->getNamedItem("data-original_id")->nodeValue,
662 - )
663 - ));
664 - $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 + [
665 627 'type' => 'e2pdf-html',
666 628 'float' => true,
667 - 'properties' => array(
629 + 'class' => $xml->get_node_value($radio, 'class'),
630 + 'properties' => [
668 631 'left' => '5',
669 632 'width' => '100%',
670 633 'height' => 'auto',
671 - 'value' => $radio_label->nodeValue
672 - )
673 - ));
674 - }
675 - } 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);
676 643
677 - $label = $xpath->query(".//label", $element)->item(0);
678 - $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 + }
679 648
680 - $name = "";
681 - if ($check_handler) {
682 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
683 - }
684 -
685 - $elements[] = $this->auto_field($element, array(
649 + if ($label) {
650 + $elements[] = $this->auto_field(
651 + $element,
652 + [
686 653 'type' => 'e2pdf-html',
687 654 'block' => true,
688 - 'properties' => array(
655 + 'class' => $xml->get_node_value($element, 'class'),
656 + 'properties' => [
689 657 'top' => '20',
690 658 'left' => '20',
691 659 'right' => '20',
692 660 'width' => '100%',
@@ -691,102 +659,156 @@
691 659 'right' => '20',
692 660 'width' => '100%',
693 661 'height' => 'auto',
694 662 'value' => $label->nodeValue,
695 - )
696 - ));
663 + ],
664 + ]
665 + );
666 + }
697 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);
698 672
699 - $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 + );
700 687
701 - foreach ($fields as $field) {
702 - $checkbox_label = $xpath->query(".//label", $field)->item(0);
703 - $checkbox = $xpath->query(".//input[@type='checkbox']", $field)->item(0);
704 -
705 -
706 - $elements[] = $this->auto_field($field, array(
707 - 'type' => 'e2pdf-checkbox',
708 - 'properties' => array(
709 - 'top' => '5',
710 - 'width' => 'auto',
711 - 'height' => 'auto',
712 - 'value' => $name,
713 - 'option' => $checkbox->attributes->getNamedItem("value")->nodeValue
714 - )
715 - ));
716 - $elements[] = $this->auto_field($checkbox, array(
688 + if ($checkbox_label) {
689 + $elements[] = $this->auto_field(
690 + $checkbox,
691 + [
717 692 'type' => 'e2pdf-html',
718 693 'float' => true,
719 - 'properties' => array(
694 + 'class' => $xml->get_node_value($checkbox, 'class'),
695 + 'properties' => [
720 696 'left' => '5',
721 697 'width' => '100%',
722 698 'height' => 'auto',
723 - 'value' => $checkbox_label->nodeValue
724 - )
725 - ));
726 - }
727 - } 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);
728 710
729 - $label = $xpath->query(".//label", $element)->item(0);
730 - $input_text = $xpath->query(".//input[@type='text']", $element)->item(0);
731 - $select = $xpath->query(".//select", $element)->item(0);
732 - $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 + }
733 729
734 - if ($label && ($input_text || $select || $textarea)) {
735 - $elements[] = $this->auto_field($element, array(
736 - 'type' => 'e2pdf-html',
737 - 'block' => true,
738 - 'properties' => array(
739 - 'top' => '20',
740 - 'left' => '20',
741 - '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',
742 739 'width' => '100%',
743 - 'height' => 'auto',
744 - 'value' => $label->nodeValue,
745 - )
746 - ));
747 - }
748 -
749 - if ($input_text) {
750 - $elements[] = $this->auto_field($input_text, array(
751 - 'type' => 'e2pdf-input',
752 - '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' => [
753 754 'top' => '5',
754 755 'width' => '100%',
755 - 'height' => 'auto',
756 - 'value' => "%%{$input_text->attributes->getNamedItem("data-original_id")->nodeValue}%%",
757 - )
758 - ));
759 - } elseif ($select) {
760 - $options_tmp = array();
761 - $options = $xpath->query(".//option", $select);
762 - foreach ($options as $option) {
763 - $options_tmp[] = $option->attributes->getNamedItem("value")->nodeValue;
764 - }
765 -
766 - $elements[] = $this->auto_field($select, array(
767 - 'type' => 'e2pdf-select',
768 - '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' => [
769 768 'top' => '5',
770 769 'width' => '100%',
771 770 'height' => 'auto',
772 - 'options' => implode("\n", $options_tmp),
773 - 'value' => "%%{$select->attributes->getNamedItem("data-original_id")->nodeValue}%%",
774 - )
775 - ));
776 - } elseif ($textarea) {
777 - $elements[] = $this->auto_field($textarea, array(
778 - 'type' => 'e2pdf-textarea',
779 - 'properties' => array(
780 - 'top' => '5',
781 - 'width' => '100%',
782 - 'height' => '150',
783 - 'value' => "%%{$textarea->attributes->getNamedItem("data-original_id")->nodeValue}%%",
784 - )
785 - ));
786 - }
787 - }
771 + 'value' => '%%' . $xml->get_node_value($input_text, 'data-original_id') . '%%',
772 + ],
773 + ]
774 + );
788 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 + );
789 811 }
790 812 }
791 813 }
792 814 }
@@ -792,81 +814,53 @@
792 814 }
793 815 }
794 816 }
795 817 }
796 -
797 - $response['page'] = array(
798 - 'bottom' => '20',
799 - 'top' => '20',
800 - 'right' => '20',
801 - 'left' => '20'
802 - );
803 - $response['elements'] = $elements;
804 -
805 - return $response;
818 + return [
819 + 'page' => [
820 + 'bottom' => '20',
821 + 'top' => '20',
822 + 'right' => '20',
823 + 'left' => '20',
824 + ],
825 + 'elements' => $elements,
826 + ];
806 827 }
807 828
808 - /**
809 - * Convert Field name to Value
810 - * @since 0.01.34
811 - *
812 - * @param string $name - Field name
813 - *
814 - * @return bool|string - Converted value or false
815 - */
829 + // auto map
816 830 public function auto_map($name = false) {
817 831 $item = $this->get('item');
818 832 if ($item) {
819 - $post = $this->get_post($item);
833 + $post = $this->get_form($item);
820 834 if ($post && isset($post->post_content)) {
821 835 $content = $post->post_content;
822 -
823 - if (false !== strpos($content, '[')) {
824 - $shortcode_tags = array(
836 + if ($this->divi4_form($content)) {
837 + $shortcode_tags = [
825 838 'et_pb_contact_form',
826 - );
827 -
839 + ];
828 840 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
829 841 $tagnames = array_intersect($shortcode_tags, $matches[1]);
830 -
831 842 if (!empty($tagnames)) {
832 - $pattern = get_shortcode_regex($tagnames);
833 -
834 - preg_match_all("/$pattern/", $content, $shortcodes);
835 -
843 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
836 844 foreach ($shortcodes[0] as $key => $shortcode_value) {
837 -
838 - $shortcode = array();
839 - $shortcode[1] = $shortcodes[1][$key];
840 - $shortcode[2] = $shortcodes[2][$key];
841 - $shortcode[3] = $shortcodes[3][$key];
842 - $shortcode[4] = $shortcodes[4][$key];
843 - $shortcode[5] = $shortcodes[5][$key];
844 - $shortcode[6] = $shortcodes[6][$key];
845 -
845 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
846 846 $atts = shortcode_parse_atts($shortcode[3]);
847 847 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
848 -
849 848 $field_content = $shortcode_value;
850 - $field_shortcode_tags = array(
849 + $field_shortcode_tags = [
851 850 'et_pb_contact_field',
852 - );
853 -
851 + ];
854 852 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $field_content, $field_matches);
855 853 $field_tagnames = array_intersect($field_shortcode_tags, $field_matches[1]);
856 -
857 854 if (!empty($field_tagnames)) {
858 - $field_pattern = get_shortcode_regex($field_tagnames);
859 -
860 - preg_match_all("/$field_pattern/", $field_content, $field_shortcodes);
861 -
855 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($field_tagnames) . '/', $field_content, $field_shortcodes);
862 856 foreach ($field_shortcodes[0] as $field_key => $field_shortcode_value) {
863 - $field_shortcode = array();
857 + $field_shortcode = [];
864 858 $field_shortcode[3] = $field_shortcodes[3][$field_key];
865 - $field_atts = shortcode_parse_atts($field_shortcode[3]);
866 - if (isset($field_atts['field_title']) && isset($field_atts['field_id'])) {
867 - if ($field_atts['field_title'] == $name || $field_atts['field_id'] == $name) {
868 - 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']) . '%%';
869 863 }
870 864 }
871 865 }
872 866 }
@@ -872,8 +866,26 @@
872 866 }
873 867 }
874 868 }
875 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 + }
876 888 }
877 889 }
878 890 }
879 891
@@ -879,18 +891,10 @@
879 891
880 892 return false;
881 893 }
882 894
883 - /**
884 - * Generate field for Auto PDF
885 - *
886 - * @param object $field - Formidable field object
887 - * @param string $type - Field type
888 - * @param array $options - Field additional options
889 - *
890 - * @return array - Prepared auto field
891 - */
892 - public function auto_field($field = false, $element = array()) {
895 + // auto field
896 + public function auto_field($field = false, $element = []) {
893 897
894 898 if (!$field) {
895 899 return false;
896 900 }
@@ -902,16 +906,17 @@
902 906 if (!isset($element['float'])) {
903 907 $element['float'] = false;
904 908 }
905 909
906 - $classes = array();
907 - if (isset($field->attributes->getNamedItem("class")->nodeValue)) {
908 - $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']);
909 914 }
910 915
911 - $float_classes = array(
916 + $float_classes = [
912 917 'et_pb_contact_field_half',
913 - );
918 + ];
914 919 $array_intersect = array_intersect($classes, $float_classes);
915 920
916 921 if (!empty($array_intersect) && $element['block']) {
917 922 $element['float'] = true;
@@ -934,52 +939,17 @@
934 939
935 940 return $element;
936 941 }
937 942
938 - /**
939 - * Verify if form and dataset exists
940 - *
941 - * @return bool - Exists/Not exists
942 - */
943 + // verify
943 944 public function verify() {
944 - global $wpdb;
945 - $item_id = $this->get('item');
946 - $dataset_id = $this->get('dataset');
947 -
948 - if ($item_id && $dataset_id) {
949 - $condition = array(
950 - 'ID' => array(
951 - 'condition' => '=',
952 - 'value' => $dataset_id,
953 - 'type' => '%d'
954 - ),
955 - 'extension' => array(
956 - 'condition' => '=',
957 - 'value' => 'divi',
958 - 'type' => '%s'
959 - ),
960 - 'item' => array(
961 - 'condition' => '=',
962 - 'value' => $item_id,
963 - 'type' => '%s'
964 - ),
965 - );
966 -
967 - $where = $this->helper->load('db')->prepare_where($condition);
968 - $dataset = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'e2pdf_datasets' . $where['sql'] . "", $where['filter']));
969 -
970 - if ($dataset) {
971 - return true;
972 - }
945 + if ($this->get('cached_entry')) {
946 + return true;
973 947 }
974 948 return false;
975 949 }
976 950
977 - /**
978 - * Visual Mapper for Mapping field
979 - *
980 - * @return bool|string - Prepared form or false
981 - */
951 + // visual mapper
982 952 public function visual_mapper() {
983 953
984 954 $source = '';
985 955 $html = '';
@@ -984,128 +954,139 @@
984 954 $source = '';
985 955 $html = '';
986 956
987 957 if ($this->get('item')) {
988 - $post = $this->get_post($this->get('item'));
958 + $post = $this->get_form($this->get('item'));
989 959 if ($post && isset($post->post_content)) {
990 -
991 960 $content = $post->post_content;
992 961
993 - if (false !== strpos($content, '[')) {
994 - $shortcode_tags = array(
962 + if ($this->divi4_form($content)) {
963 + $shortcode_tags = [
995 964 'et_pb_contact_form',
996 - );
997 -
965 + ];
998 966 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
999 967 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1000 -
1001 968 if (!empty($tagnames)) {
1002 - $pattern = get_shortcode_regex($tagnames);
1003 -
1004 - preg_match_all("/$pattern/", $content, $shortcodes);
1005 -
969 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
1006 970 foreach ($shortcodes[0] as $key => $shortcode_value) {
1007 -
1008 - $shortcode = array();
1009 - $shortcode[1] = $shortcodes[1][$key];
1010 - $shortcode[2] = $shortcodes[2][$key];
1011 - $shortcode[3] = $shortcodes[3][$key];
1012 - $shortcode[4] = $shortcodes[4][$key];
1013 - $shortcode[5] = $shortcodes[5][$key];
1014 - $shortcode[6] = $shortcodes[6][$key];
1015 -
971 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1016 972 $atts = shortcode_parse_atts($shortcode[3]);
1017 973 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
1018 -
1019 - require_once(ET_BUILDER_DIR . 'class-et-builder-element.php');
1020 - require_once(ET_BUILDER_DIR . 'functions.php');
1021 - require_once(ET_BUILDER_DIR . 'ab-testing.php');
1022 - require_once(ET_BUILDER_DIR . 'class-et-global-settings.php');
1023 - require_once(ET_BUILDER_DIR . 'module/ContactForm.php');
1024 - require_once(ET_BUILDER_DIR . 'module/ContactFormItem.php');
1025 -
1026 - new ET_Builder_Module_Contact_Form();
1027 - new ET_Builder_Module_Contact_Form_Item();
1028 -
974 + $this->divi4_load();
1029 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 + }
1030 989
1031 - if ($source) {
1032 - libxml_use_internal_errors(true);
1033 - $dom = new DOMDocument();
1034 - if (function_exists('mb_convert_encoding')) {
1035 - $html = $dom->loadHTML(mb_convert_encoding($source, 'HTML-ENTITIES', 'UTF-8'));
1036 - } else {
1037 - $html = $dom->loadHTML('<?xml encoding="UTF-8">' . $source);
1038 - }
1039 - libxml_clear_errors();
1040 - }
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);
1041 1001
1042 - if (!$source) {
1043 - return __('Form source is empty', 'e2pdf');
1044 - } elseif (!$html) {
1045 - return __('Form could not be parsed due incorrect HTML', 'e2pdf');
1046 - } 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 + }
1047 1014
1048 - $xpath = new DomXPath($dom);
1049 - // Replace names
1050 - $fields = $xpath->query("//*[contains(@name, 'et_pb_contact_')]");
1051 - foreach ($fields as $element) {
1052 - if ($element->attributes->getNamedItem("name")) {
1053 - $element->attributes->getNamedItem("name")->nodeValue = "%%" . $element->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
1054 - }
1055 - }
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 + }
1056 1020
1057 - $checkboxes = $xpath->query("//*[contains(@class, 'et_pb_contact_field') and @data-type='checkbox']");
1058 - 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 + }
1059 1035
1060 - $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 + }
1061 1041
1062 - $name = "";
1063 - if ($check_handler) {
1064 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
1065 - }
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 + }
1066 1046
1067 - $checks = $xpath->query(".//input[@type='checkbox']", $element);
1068 - foreach ($checks as $check) {
1069 - $attr = $dom->createAttribute('name');
1070 - $attr->value = $name;
1071 - $check->appendChild($attr);
1072 - }
1073 - }
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 + }
1074 1051
1075 - $remove_by_class = array(
1076 - 'et_pb_contact_submit',
1077 - 'et_pb_contactform_validate_field'
1078 - );
1079 - foreach ($remove_by_class as $key => $class) {
1080 - $elements = $xpath->query("//*[contains(@class, '{$class}')]");
1081 - foreach ($elements as $element) {
1082 - $element->parentNode->removeChild($element);
1083 - }
1084 - }
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 + }
1085 1066
1086 - $remove_parent_by_class = array(
1087 - 'et_pb_contact_captcha_question'
1088 - );
1089 - foreach ($remove_parent_by_class as $key => $class) {
1090 - $elements = $xpath->query("//*[contains(@class, '{$class}')]/parent::*");
1091 - foreach ($elements as $element) {
1092 - $element->parentNode->removeChild($element);
1093 - }
1094 - }
1067 + $xml_elements = $xpath->query('//*[@data-step]');
1068 + foreach ($xml_elements as $xml_element) {
1069 + $xml_element->removeAttribute('style');
1070 + }
1095 1071
1096 - if ($xpath->query("//form")->item(0)) {
1097 - $autocomplete = $dom->createAttribute('autocomplete');
1098 - $autocomplete->value = 'off';
1099 - $xpath->query("//form")->item(0)->appendChild($autocomplete);
1100 - }
1101 - }
1102 -
1103 - return $dom->saveHTML();
1104 - }
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);
1105 1080 }
1106 1081 }
1107 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 + }
1108 1089 }
1109 1090 }
1110 1091
1111 1092 return false;
@@ -1110,47 +1091,64 @@
1110 1091
1111 1092 return false;
1112 1093 }
1113 1094
1095 + // filter mail
1114 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 +
1115 1106 if (isset($args['message'])) {
1116 1107 if (false !== strpos($args['message'], '[')) {
1117 - $shortcode_tags = array(
1108 + $shortcode_tags = [
1118 1109 'e2pdf-download',
1119 1110 'e2pdf-save',
1120 1111 'e2pdf-attachment',
1121 - 'e2pdf-adobesign'
1122 - );
1123 -
1112 + 'e2pdf-adobesign',
1113 + 'e2pdf-zapier',
1114 + ];
1124 1115 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $args['message'], $matches);
1125 1116 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1126 -
1127 1117 if (!empty($tagnames)) {
1128 - $pattern = get_shortcode_regex($tagnames);
1129 -
1130 - preg_match_all("/$pattern/", $args['message'], $shortcodes);
1131 -
1118 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $args['message'], $shortcodes);
1132 1119 foreach ($shortcodes[0] as $key => $shortcode_value) {
1133 -
1134 - $shortcode = array();
1135 - $shortcode[1] = $shortcodes[1][$key];
1136 - $shortcode[2] = $shortcodes[2][$key];
1137 - $shortcode[3] = $shortcodes[3][$key];
1138 - $shortcode[4] = $shortcodes[4][$key];
1139 - $shortcode[5] = $shortcodes[5][$key];
1140 - $shortcode[6] = $shortcodes[6][$key];
1141 -
1120 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1142 1121 $atts = shortcode_parse_atts($shortcode[3]);
1143 -
1144 - if ($shortcode[2] === 'e2pdf-attachment' || $shortcode[2] === 'e2pdf-save' || $shortcode[2] === 'e2pdf-adobesign') {
1145 - $shortcode[3] .= " apply=\"true\"";
1122 + if (!isset($atts['apply'])) {
1123 + $shortcode[3] .= ' apply="true"';
1146 1124 }
1147 -
1148 - 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)) {
1149 1130 $file = do_shortcode_tag($shortcode);
1150 1131 if ($file) {
1151 - $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 + }
1152 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 + }
1153 1151 }
1154 1152 $args['message'] = str_replace($shortcode_value, '', $args['message']);
1155 1153 } else {
1156 1154 if (is_array($args['headers']) && !in_array('Content-Type: text/html; charset=UTF-8', $args['headers'])) {
@@ -1156,231 +1154,750 @@
1156 1154 if (is_array($args['headers']) && !in_array('Content-Type: text/html; charset=UTF-8', $args['headers'])) {
1157 1155 $args['headers'][] = 'Content-Type: text/html; charset=UTF-8';
1158 1156 }
1159 1157 $args['message'] = str_replace($shortcode_value, do_shortcode_tag($shortcode), $args['message']);
1160 - $args['message'] = str_replace("\r\n", "<br/>", $args['message']);
1158 + $args['message'] = str_replace("\r\n", '<br/>', $args['message']);
1161 1159 }
1162 1160 }
1163 1161 }
1164 1162 }
1165 1163 }
1166 -
1167 - $wp_mail = array(
1164 + $wp_mail = [
1168 1165 'to' => $args['to'],
1169 1166 'subject' => $args['subject'],
1170 1167 'message' => $args['message'],
1171 1168 'headers' => $args['headers'],
1172 1169 'attachments' => $args['attachments'],
1173 - );
1170 + ];
1171 + return $wp_mail;
1172 + }
1174 1173
1175 - 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 + }
1176 1182 }
1177 1183
1178 - /**
1179 - * Load actions for this extension
1180 - */
1181 - public function load_actions() {
1182 -
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);
1183 1187 }
1184 1188
1185 - /**
1186 - * Load filters for this extension
1187 - */
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
1188 1196 public function load_filters() {
1189 - add_filter('et_pb_module_shortcode_attributes', array($this, 'filter_et_pb_module_shortcode_attributes'), 30, 5);
1190 - 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);
1191 1207 }
1192 1208
1193 - public function filter_et_pb_module_shortcode_attributes($props, $attrs, $render_slug, $address, $content) {
1194 - global $wpdb;
1209 + public function filter_divi_module_library_register_module_attrs($module_attrs, $filter_args) {
1195 1210
1196 - 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 + }
1197 1214
1198 - $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 + }
1199 1218
1200 - $et_contact_error = false;
1201 - $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] : '';
1202 - $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;
1203 - $contact_email = '';
1204 - $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;
1205 1221
1206 - $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 + }
1207 1228
1208 - 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])) {
1209 - if ('' !== $current_form_fields) {
1210 - $fields_data_json = str_replace('\\', '', $current_form_fields);
1211 - $fields_data_array = json_decode($fields_data_json, true);
1229 + $module = \ET\Builder\FrontEnd\BlockParser\BlockParserStore::get($module_id, $store_instance);
1212 1230
1213 - // check whether captcha field is not empty
1214 - 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]) )) {
1215 - $et_contact_error = true;
1216 - }
1231 + if (!$module) {
1232 + return $module_attrs;
1233 + }
1217 1234
1218 - // check all fields on current form and generate error message if needed
1219 - if (!empty($fields_data_array)) {
1220 - foreach ($fields_data_array as $index => $value) {
1221 - // check all the required fields, generate error message if required field is empty
1222 - $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 + }
1223 1244
1224 - if ('required' === $value['required_mark'] && empty($field_value) && !is_numeric($field_value)) {
1225 - $et_contact_error = true;
1226 - continue;
1227 - }
1245 + $unique_id = \ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormUtils::get_unique_id($module_attrs, (array) $module);
1228 1246
1229 - // additional check for email field
1230 - if ('email' === $value['field_type'] && 'required' === $value['required_mark'] && !empty($field_value)) {
1231 - $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 + }
1232 1251
1233 - if (!empty($contact_email) && !is_email($contact_email)) {
1234 - $et_contact_error = true;
1235 - }
1236 - }
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 + }
1237 1255
1238 - // prepare the array of processed field values in convenient format
1239 - if (false === $et_contact_error) {
1240 - $processed_fields_values[$value['original_id']]['value'] = $field_value;
1241 - $processed_fields_values[$value['original_id']]['label'] = $value['field_label'];
1242 - }
1243 - }
1244 - }
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']) : '';
1245 1286 } else {
1246 - $et_contact_error = true;
1287 + $messages['email'] = isset($module_attrs['email']['innerContent']['desktop']['value']) ? $module_attrs['email']['innerContent']['desktop']['value'] : '';
1247 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 + }
1248 1320 } else {
1249 - $et_contact_error = true;
1321 + unset($messages[$message_key]);
1250 1322 }
1323 + }
1251 1324
1252 - if (!$et_contact_error && $nonce_result) {
1325 + $_POST = $this->sanitize($_POST);
1253 1326
1254 - $dataset_id = false;
1327 + if (!$this->get('process')) {
1328 + return $module_attrs;
1329 + }
1255 1330
1256 - $success_message = '';
1257 - $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 + }
1258 1336
1259 - if (isset($props['success_message'])) {
1260 - $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'] = [];
1261 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 + }
1262 1411
1263 - 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 + }
1264 1445
1265 - $shortcode_tags = array(
1266 - 'e2pdf-download',
1267 - 'e2pdf-save',
1268 - 'e2pdf-view',
1269 - 'e2pdf-adobesign'
1270 - );
1446 + $refClass = new ReflectionClass('\ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormHandler');
1447 + $obj = $refClass->newInstanceWithoutConstructor();
1271 1448
1272 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1273 - $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);
1274 1453
1275 - if (!empty($tagnames)) {
1276 - $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 + }
1277 1460
1278 - preg_match_all("/$pattern/", $success_message, $shortcodes);
1461 + $obj->validate_fields();
1462 + $errorObj = $refError->getValue($obj);
1279 1463
1280 - foreach ($shortcodes[0] as $key => $shortcode_value) {
1464 + if ($errorObj->has_errors()) {
1465 + return $module_attrs;
1466 + }
1281 1467
1282 - $item = false;
1468 + $fields_raw = $refFields->getValue($obj);
1283 1469
1284 - $shortcode = array();
1285 - $shortcode[1] = $shortcodes[1][$key];
1286 - $shortcode[2] = $shortcodes[2][$key];
1287 - $shortcode[3] = $shortcodes[3][$key];
1288 - $shortcode[4] = $shortcodes[4][$key];
1289 - $shortcode[5] = $shortcodes[5][$key];
1290 - $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 + }
1291 1474
1292 - $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 + ];
1293 1484
1294 - if (!array_key_exists('dataset', $atts) && array_key_exists('id', $atts)) {
1295 - $template = new Model_E2pdf_Template();
1296 - $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 + }
1297 1501
1298 - if ($template->get('extension') === 'divi') {
1299 - $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();
1300 1507
1301 - if (!$dataset_id) {
1302 - $serialized = serialize($_POST);
1303 - $dataset = array(
1304 - 'extension' => 'divi',
1305 - 'item' => $item,
1306 - 'entry' => $serialized
1307 - );
1308 - $wpdb->insert($wpdb->prefix . 'e2pdf_datasets', $dataset);
1309 - $dataset_id = $wpdb->insert_id;
1310 - }
1311 - $atts['dataset'] = $dataset_id;
1312 - $shortcode[3] .= " dataset=\"{$dataset_id}\" ";
1313 - }
1314 - }
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]);
1315 1526
1316 - if ($shortcode[2] === 'e2pdf-attachment' || $shortcode[2] === 'e2pdf-save') {
1317 - $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 . '"';
1318 1534 }
1319 -
1320 - $props['success_message'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), "[" . $shortcode[2] . $shortcode[3] . "]", $props['success_message']);
1321 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 + }
1322 1557 }
1323 1558 }
1559 + }
1560 + }
1324 1561
1325 - if (isset($props['custom_message'])) {
1326 - $custom_message = str_replace(array('&#91;', '&#93;'), array('[', ']'), $props['custom_message']);
1327 - }
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 + }
1328 1585
1329 - if (false !== strpos($custom_message, '[')) {
1330 - $shortcode_tags = array(
1331 - 'e2pdf-download',
1332 - 'e2pdf-save',
1333 - 'e2pdf-attachment',
1334 - 'e2pdf-adobesign'
1335 - );
1586 + // filter shortcode attributes
1587 + public function filter_et_pb_module_shortcode_attributes($props, $attrs, $render_slug, $address, $content) {
1336 1588
1337 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $custom_message, $matches);
1338 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
1589 + if ($render_slug !== 'et_pb_contact_form') {
1590 + return $props;
1591 + }
1339 1592
1340 - if (!empty($tagnames)) {
1341 - $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 + }
1342 1597
1343 - preg_match_all("/$pattern/", $custom_message, $shortcodes);
1598 + $success_message = isset($props['success_message']) ? $this->decode_shortcodes($props['success_message'], true) : '';
1344 1599
1345 - 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 + }
1346 1616
1347 - foreach ($shortcodes[0] as $key => $shortcode_value) {
1348 - $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 + }
1349 1639
1350 - $shortcode = array();
1351 - $shortcode[1] = $shortcodes[1][$key];
1352 - $shortcode[2] = $shortcodes[2][$key];
1353 - $shortcode[3] = $shortcodes[3][$key];
1354 - $shortcode[4] = $shortcodes[4][$key];
1355 - $shortcode[5] = $shortcodes[5][$key];
1356 - $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 + }
1357 1663
1358 - $atts = shortcode_parse_atts($shortcode[3]);
1664 + $_POST = $this->sanitize($_POST);
1359 1665
1360 - if (!array_key_exists('dataset', $atts) && array_key_exists('id', $atts)) {
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 {
1782 + if (!isset($atts['dataset']) && isset($atts['id'])) {
1361 1783 $template = new Model_E2pdf_Template();
1362 1784 $template->load($atts['id']);
1363 1785 if ($template->get('extension') === 'divi') {
1364 1786 $item = $template->get('item');
1787 + if (!$dataset) {
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();
1793 + }
1794 + $atts['dataset'] = $dataset;
1795 + $shortcode[3] .= ' dataset="' . $dataset . '"';
1796 + }
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 + }
1365 1809
1366 - if (!$dataset_id) {
1367 - $serialized = serialize($_POST);
1368 - $dataset = array(
1369 - 'extension' => 'divi',
1370 - 'item' => $item,
1371 - 'entry' => $serialized
1372 - );
1373 - $wpdb->insert($wpdb->prefix . 'e2pdf_datasets', $dataset);
1374 - $dataset_id = $wpdb->insert_id;
1375 - }
1376 - $atts['dataset'] = $dataset_id;
1377 - $shortcode[3] .= " dataset=\"{$dataset_id}\"";
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();
1378 1837 }
1838 + $atts['dataset'] = $dataset;
1839 + $shortcode[3] .= ' dataset="' . $dataset . '"';
1379 1840 }
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 + }
1851 + }
1852 + }
1853 + }
1380 1854
1381 - $props['custom_message'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), "[" . $shortcode[2] . $shortcode[3] . "]", $props['custom_message']);
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 + }
1382 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 + }
1383 1900 }
1384 1901 }
1385 1902 }
1386 1903 }
@@ -1387,141 +1904,257 @@
1387 1904
1388 1905 return $props;
1389 1906 }
1390 1907
1908 + // filter shortcode output
1391 1909 public function filter_et_module_shortcode_output($output, $render_slug, $form) {
1392 1910
1393 - 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 + }
1394 1914
1395 - $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 + }
1396 1919
1397 - $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;
1398 1922
1399 - 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])) {
1400 -
1401 - $dataset_id = false;
1402 -
1403 - $success_message = '';
1404 - $custom_message = '';
1405 -
1406 - if (isset($form->props['success_message'])) {
1407 - $success_message = str_replace(array('&#91;', '&#93;', '&quot;'), array('[', ']', '"'), $form->props['success_message']);
1408 - }
1409 -
1410 - if (false !== strpos($success_message, '[')) {
1411 - $shortcode_tags = array(
1412 - 'e2pdf-download',
1413 - 'e2pdf-save',
1414 - 'e2pdf-view',
1415 - 'e2pdf-adobesign'
1416 - );
1417 -
1418 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1419 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
1420 -
1421 - if (!empty($tagnames)) {
1422 - $pattern = get_shortcode_regex($tagnames);
1423 -
1424 - preg_match_all("/$pattern/", $success_message, $shortcodes);
1425 -
1426 - foreach ($shortcodes[0] as $key => $shortcode_value) {
1427 -
1428 - $shortcode = array();
1429 - $shortcode[1] = $shortcodes[1][$key];
1430 - $shortcode[2] = $shortcodes[2][$key];
1431 - $shortcode[3] = $shortcodes[3][$key];
1432 - $shortcode[4] = $shortcodes[4][$key];
1433 - $shortcode[5] = $shortcodes[5][$key];
1434 - $shortcode[6] = $shortcodes[6][$key];
1435 -
1436 - $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);
1437 1947 }
1438 1948 }
1439 1949 }
1440 1950 }
1441 -
1442 - remove_filter('wp_mail', array($this, 'filter_wp_mail'), 10);
1443 -
1444 - $files = $this->helper->get('divi_attachments');
1445 - if (is_array($files) && !empty($files)) {
1446 - foreach ($files as $key => $file) {
1447 - $this->helper->delete_dir(dirname($file) . '/');
1448 - }
1449 - $this->helper->deset('divi_attachments');
1450 - }
1451 1951 }
1452 -
1453 1952 return $output;
1454 1953 }
1455 1954
1456 - /**
1457 - * Delete dataset for template
1458 - *
1459 - * @param int $template_id - Template ID
1460 - * @param int $dataset_id - Dataset ID
1461 - *
1462 - * @return bool - Result of removing items
1463 - */
1464 - public function delete_item($template_id = false, $dataset_id = false) {
1955 + // delete item
1956 + public function delete_item($template_id = false, $dataset = false) {
1465 1957 global $wpdb;
1466 -
1467 1958 $template = new Model_E2pdf_Template();
1468 - if ($template_id && $dataset_id && $template->load($template_id)) {
1959 + if ($template_id && $dataset && $template->load($template_id)) {
1469 1960 if ($template->get('extension') === 'divi' && $template->get('item')) {
1470 -
1471 - $item_id = $template->get('item');
1472 -
1473 - $where = array(
1474 - 'ID' => $dataset_id,
1475 - 'item' => $item_id,
1476 - 'extension' => 'divi'
1477 - );
1961 + $item = $template->get('item');
1962 + $where = [
1963 + 'ID' => $dataset,
1964 + 'item' => $item,
1965 + 'extension' => 'divi',
1966 + ];
1478 1967 $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1479 1968 return true;
1480 1969 }
1481 1970 }
1482 -
1483 1971 return false;
1484 1972 }
1485 1973
1486 - /**
1487 - * Delete all datasets for Template
1488 - *
1489 - * @param int $template_id - Template ID
1490 - *
1491 - * @return bool - Result of removing items
1492 - */
1974 + // delete items
1493 1975 public function delete_items($template_id = false) {
1494 1976 global $wpdb;
1495 -
1496 1977 $template = new Model_E2pdf_Template();
1497 -
1498 1978 if ($template_id && $template->load($template_id)) {
1499 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 + }
1500 1990
1501 - $item_id = $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 + }
1502 2013
1503 - $where = array(
1504 - 'item' => $item_id,
1505 - 'extension' => 'divi'
1506 - );
1507 - $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1508 - 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);
1509 2028 }
2029 + return $value;
1510 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 + }
1511 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 + }
1512 2094 return false;
1513 2095 }
1514 2096
1515 - /**
1516 - * Get styles for generating Map Field function
1517 - *
1518 - * @return array - List of css files to load
1519 - */
1520 - public function styles() {
1521 - $styles = array(
1522 - 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 . '/'
1523 2125 );
1524 - 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;
1525 2159 }
1526 -
1527 2160 }