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 +1684 -1046 1.03.07 → 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,53 +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
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);
648 601
649 - $fields = $xpath->query("//*[contains(@class, 'et_pb_contact_field_radio')]", $element);
650 - foreach ($fields as $field) {
651 - $radio_label = $xpath->query(".//label", $field)->item(0);
652 - $radio = $xpath->query(".//input[@type='radio']", $field)->item(0);
653 -
654 - $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 + [
655 609 'type' => 'e2pdf-radio',
656 - 'properties' => array(
610 + 'class' => $xml->get_node_value($field, 'class'),
611 + 'properties' => [
657 612 'top' => '5',
658 613 'width' => 'auto',
659 614 'height' => 'auto',
660 - 'value' => "%%" . $radio->attributes->getNamedItem("data-original_id")->nodeValue . "%%",
661 - 'option' => $radio->attributes->getNamedItem("value")->nodeValue,
662 - 'group' => $radio->attributes->getNamedItem("data-original_id")->nodeValue,
663 - )
664 - ));
665 - $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 + [
666 627 'type' => 'e2pdf-html',
667 628 'float' => true,
668 - 'properties' => array(
629 + 'class' => $xml->get_node_value($radio, 'class'),
630 + 'properties' => [
669 631 'left' => '5',
670 632 'width' => '100%',
671 633 'height' => 'auto',
672 - 'value' => $radio_label->nodeValue
673 - )
674 - ));
675 - }
676 - } 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);
677 643
678 - $label = $xpath->query(".//label", $element)->item(0);
679 - $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 + }
680 648
681 - $name = "";
682 - if ($check_handler) {
683 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
684 - }
685 -
686 - $elements[] = $this->auto_field($element, array(
649 + if ($label) {
650 + $elements[] = $this->auto_field(
651 + $element,
652 + [
687 653 'type' => 'e2pdf-html',
688 654 'block' => true,
689 - 'properties' => array(
655 + 'class' => $xml->get_node_value($element, 'class'),
656 + 'properties' => [
690 657 'top' => '20',
691 658 'left' => '20',
692 659 'right' => '20',
693 660 'width' => '100%',
@@ -692,102 +659,156 @@
692 659 'right' => '20',
693 660 'width' => '100%',
694 661 'height' => 'auto',
695 662 'value' => $label->nodeValue,
696 - )
697 - ));
663 + ],
664 + ]
665 + );
666 + }
698 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);
699 672
700 - $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 + );
701 687
702 - foreach ($fields as $field) {
703 - $checkbox_label = $xpath->query(".//label", $field)->item(0);
704 - $checkbox = $xpath->query(".//input[@type='checkbox']", $field)->item(0);
705 -
706 -
707 - $elements[] = $this->auto_field($field, array(
708 - 'type' => 'e2pdf-checkbox',
709 - 'properties' => array(
710 - 'top' => '5',
711 - 'width' => 'auto',
712 - 'height' => 'auto',
713 - 'value' => $name,
714 - 'option' => $checkbox->attributes->getNamedItem("value")->nodeValue
715 - )
716 - ));
717 - $elements[] = $this->auto_field($checkbox, array(
688 + if ($checkbox_label) {
689 + $elements[] = $this->auto_field(
690 + $checkbox,
691 + [
718 692 'type' => 'e2pdf-html',
719 693 'float' => true,
720 - 'properties' => array(
694 + 'class' => $xml->get_node_value($checkbox, 'class'),
695 + 'properties' => [
721 696 'left' => '5',
722 697 'width' => '100%',
723 698 'height' => 'auto',
724 - 'value' => $checkbox_label->nodeValue
725 - )
726 - ));
727 - }
728 - } 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);
729 710
730 - $label = $xpath->query(".//label", $element)->item(0);
731 - $input_text = $xpath->query(".//input[@type='text']", $element)->item(0);
732 - $select = $xpath->query(".//select", $element)->item(0);
733 - $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 + }
734 729
735 - if ($label && ($input_text || $select || $textarea)) {
736 - $elements[] = $this->auto_field($element, array(
737 - 'type' => 'e2pdf-html',
738 - 'block' => true,
739 - 'properties' => array(
740 - 'top' => '20',
741 - 'left' => '20',
742 - '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',
743 739 'width' => '100%',
744 - 'height' => 'auto',
745 - 'value' => $label->nodeValue,
746 - )
747 - ));
748 - }
749 -
750 - if ($input_text) {
751 - $elements[] = $this->auto_field($input_text, array(
752 - 'type' => 'e2pdf-input',
753 - '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' => [
754 754 'top' => '5',
755 755 'width' => '100%',
756 - 'height' => 'auto',
757 - 'value' => "%%{$input_text->attributes->getNamedItem("data-original_id")->nodeValue}%%",
758 - )
759 - ));
760 - } elseif ($select) {
761 - $options_tmp = array();
762 - $options = $xpath->query(".//option", $select);
763 - foreach ($options as $option) {
764 - $options_tmp[] = $option->attributes->getNamedItem("value")->nodeValue;
765 - }
766 -
767 - $elements[] = $this->auto_field($select, array(
768 - 'type' => 'e2pdf-select',
769 - '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' => [
770 768 'top' => '5',
771 769 'width' => '100%',
772 770 'height' => 'auto',
773 - 'options' => implode("\n", $options_tmp),
774 - 'value' => "%%{$select->attributes->getNamedItem("data-original_id")->nodeValue}%%",
775 - )
776 - ));
777 - } elseif ($textarea) {
778 - $elements[] = $this->auto_field($textarea, array(
779 - 'type' => 'e2pdf-textarea',
780 - 'properties' => array(
781 - 'top' => '5',
782 - 'width' => '100%',
783 - 'height' => '150',
784 - 'value' => "%%{$textarea->attributes->getNamedItem("data-original_id")->nodeValue}%%",
785 - )
786 - ));
787 - }
788 - }
771 + 'value' => '%%' . $xml->get_node_value($input_text, 'data-original_id') . '%%',
772 + ],
773 + ]
774 + );
789 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 + );
790 811 }
791 812 }
792 813 }
793 814 }
@@ -793,82 +814,53 @@
793 814 }
794 815 }
795 816 }
796 817 }
797 -
798 - $response['page'] = array(
799 - 'bottom' => '20',
800 - 'top' => '20',
801 - 'right' => '20',
802 - 'left' => '20'
803 - );
804 - $response['elements'] = $elements;
805 -
806 - return $response;
818 + return [
819 + 'page' => [
820 + 'bottom' => '20',
821 + 'top' => '20',
822 + 'right' => '20',
823 + 'left' => '20',
824 + ],
825 + 'elements' => $elements,
826 + ];
807 827 }
808 828
809 - /**
810 - * Convert Field name to Value
811 - * @since 0.01.34
812 - *
813 - * @param string $name - Field name
814 - *
815 - * @return bool|string - Converted value or false
816 - */
829 + // auto map
817 830 public function auto_map($name = false) {
818 831 $item = $this->get('item');
819 832 if ($item) {
820 - $post = $this->get_post($item);
833 + $post = $this->get_form($item);
821 834 if ($post && isset($post->post_content)) {
822 835 $content = $post->post_content;
823 -
824 - if (false !== strpos($content, '[')) {
825 - $shortcode_tags = array(
836 + if ($this->divi4_form($content)) {
837 + $shortcode_tags = [
826 838 'et_pb_contact_form',
827 - );
828 -
839 + ];
829 840 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
830 841 $tagnames = array_intersect($shortcode_tags, $matches[1]);
831 -
832 842 if (!empty($tagnames)) {
833 - $pattern = get_shortcode_regex($tagnames);
834 -
835 - preg_match_all("/$pattern/", $content, $shortcodes);
836 -
843 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
837 844 foreach ($shortcodes[0] as $key => $shortcode_value) {
838 -
839 - $shortcode = array();
840 - $shortcode[1] = $shortcodes[1][$key];
841 - $shortcode[2] = $shortcodes[2][$key];
842 - $shortcode[3] = $shortcodes[3][$key];
843 - $shortcode[4] = $shortcodes[4][$key];
844 - $shortcode[5] = $shortcodes[5][$key];
845 - $shortcode[6] = $shortcodes[6][$key];
846 -
847 -
845 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
848 846 $atts = shortcode_parse_atts($shortcode[3]);
849 847 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
850 -
851 848 $field_content = $shortcode_value;
852 - $field_shortcode_tags = array(
849 + $field_shortcode_tags = [
853 850 'et_pb_contact_field',
854 - );
855 -
851 + ];
856 852 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $field_content, $field_matches);
857 853 $field_tagnames = array_intersect($field_shortcode_tags, $field_matches[1]);
858 -
859 854 if (!empty($field_tagnames)) {
860 - $field_pattern = get_shortcode_regex($field_tagnames);
861 -
862 - preg_match_all("/$field_pattern/", $field_content, $field_shortcodes);
863 -
855 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($field_tagnames) . '/', $field_content, $field_shortcodes);
864 856 foreach ($field_shortcodes[0] as $field_key => $field_shortcode_value) {
865 - $field_shortcode = array();
857 + $field_shortcode = [];
866 858 $field_shortcode[3] = $field_shortcodes[3][$field_key];
867 - $field_atts = shortcode_parse_atts($field_shortcode[3]);
868 - if (isset($field_atts['field_title']) && isset($field_atts['field_id'])) {
869 - if ($field_atts['field_title'] == $name || $field_atts['field_id'] == $name) {
870 - 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']) . '%%';
871 863 }
872 864 }
873 865 }
874 866 }
@@ -874,8 +866,26 @@
874 866 }
875 867 }
876 868 }
877 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 + }
878 888 }
879 889 }
880 890 }
881 891
@@ -881,18 +891,10 @@
881 891
882 892 return false;
883 893 }
884 894
885 - /**
886 - * Generate field for Auto PDF
887 - *
888 - * @param object $field - Formidable field object
889 - * @param string $type - Field type
890 - * @param array $options - Field additional options
891 - *
892 - * @return array - Prepared auto field
893 - */
894 - public function auto_field($field = false, $element = array()) {
895 + // auto field
896 + public function auto_field($field = false, $element = []) {
895 897
896 898 if (!$field) {
897 899 return false;
898 900 }
@@ -904,16 +906,17 @@
904 906 if (!isset($element['float'])) {
905 907 $element['float'] = false;
906 908 }
907 909
908 - $classes = array();
909 - if (isset($field->attributes->getNamedItem("class")->nodeValue)) {
910 - $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']);
911 914 }
912 915
913 - $float_classes = array(
916 + $float_classes = [
914 917 'et_pb_contact_field_half',
915 - );
918 + ];
916 919 $array_intersect = array_intersect($classes, $float_classes);
917 920
918 921 if (!empty($array_intersect) && $element['block']) {
919 922 $element['float'] = true;
@@ -936,171 +939,154 @@
936 939
937 940 return $element;
938 941 }
939 942
940 - /**
941 - * Verify if form and dataset exists
942 - *
943 - * @return bool - Exists/Not exists
944 - */
943 + // verify
945 944 public function verify() {
946 - global $wpdb;
947 - $item_id = $this->get('item');
948 - $dataset_id = $this->get('dataset');
949 -
950 - if ($item_id && $dataset_id) {
951 - $condition = array(
952 - 'ID' => array(
953 - 'condition' => '=',
954 - 'value' => $dataset_id,
955 - 'type' => '%d'
956 - ),
957 - 'extension' => array(
958 - 'condition' => '=',
959 - 'value' => 'divi',
960 - 'type' => '%s'
961 - ),
962 - 'item' => array(
963 - 'condition' => '=',
964 - 'value' => $item_id,
965 - 'type' => '%s'
966 - ),
967 - );
968 -
969 - $where = $this->helper->load('db')->prepare_where($condition);
970 - $dataset = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'e2pdf_datasets' . $where['sql'] . "", $where['filter']));
971 -
972 - if ($dataset) {
973 - return true;
974 - }
945 + if ($this->get('cached_entry')) {
946 + return true;
975 947 }
976 948 return false;
977 949 }
978 950
979 - /**
980 - * Visual Mapper for Mapping field
981 - *
982 - * @return bool|string - Prepared form or false
983 - */
951 + // visual mapper
984 952 public function visual_mapper() {
985 953
954 + $source = '';
955 + $html = '';
956 +
986 957 if ($this->get('item')) {
987 - $post = $this->get_post($this->get('item'));
958 + $post = $this->get_form($this->get('item'));
988 959 if ($post && isset($post->post_content)) {
989 -
990 960 $content = $post->post_content;
991 961
992 - if (false !== strpos($content, '[')) {
993 - $shortcode_tags = array(
962 + if ($this->divi4_form($content)) {
963 + $shortcode_tags = [
994 964 'et_pb_contact_form',
995 - );
996 -
965 + ];
997 966 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
998 967 $tagnames = array_intersect($shortcode_tags, $matches[1]);
999 -
1000 968 if (!empty($tagnames)) {
1001 - $pattern = get_shortcode_regex($tagnames);
1002 -
1003 - preg_match_all("/$pattern/", $content, $shortcodes);
1004 -
969 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
1005 970 foreach ($shortcodes[0] as $key => $shortcode_value) {
1006 -
1007 - $shortcode = array();
1008 - $shortcode[1] = $shortcodes[1][$key];
1009 - $shortcode[2] = $shortcodes[2][$key];
1010 - $shortcode[3] = $shortcodes[3][$key];
1011 - $shortcode[4] = $shortcodes[4][$key];
1012 - $shortcode[5] = $shortcodes[5][$key];
1013 - $shortcode[6] = $shortcodes[6][$key];
1014 -
971 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1015 972 $atts = shortcode_parse_atts($shortcode[3]);
1016 973 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
1017 -
1018 - require_once(ET_BUILDER_DIR . 'class-et-builder-element.php');
1019 - require_once(ET_BUILDER_DIR . 'functions.php');
1020 - require_once(ET_BUILDER_DIR . 'ab-testing.php');
1021 - require_once(ET_BUILDER_DIR . 'class-et-global-settings.php');
1022 - require_once(ET_BUILDER_DIR . 'module/ContactForm.php');
1023 - require_once(ET_BUILDER_DIR . 'module/ContactFormItem.php');
1024 -
1025 - new ET_Builder_Module_Contact_Form();
1026 - new ET_Builder_Module_Contact_Form_Item();
1027 -
974 + $this->divi4_load();
1028 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 + }
1029 989
1030 - libxml_use_internal_errors(true);
1031 - $dom = new DOMDocument();
1032 - if (function_exists('mb_convert_encoding')) {
1033 - $html = $dom->loadHTML(mb_convert_encoding($source, 'HTML-ENTITIES', 'UTF-8'));
1034 - } else {
1035 - $html = $dom->loadHTML('<?xml encoding="UTF-8">' . $source);
1036 - }
1037 - libxml_clear_errors();
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);
1038 1001
1039 - if (!$html) {
1040 - return __('Form could not be parsed due incorrect HTML', 'e2pdf');
1041 - } 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 + }
1042 1014
1043 - $xpath = new DomXPath($dom);
1044 - // Replace names
1045 - $fields = $xpath->query("//*[contains(@name, 'et_pb_contact_')]");
1046 - foreach ($fields as $element) {
1047 - if ($element->attributes->getNamedItem("name")) {
1048 - $element->attributes->getNamedItem("name")->nodeValue = "%%" . $element->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
1049 - }
1050 - }
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 + }
1051 1020
1052 - $checkboxes = $xpath->query("//*[contains(@class, 'et_pb_contact_field') and @data-type='checkbox']");
1053 - 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 + }
1054 1035
1055 - $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 + }
1056 1041
1057 - $name = "";
1058 - if ($check_handler) {
1059 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
1060 - }
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 + }
1061 1046
1062 - $checks = $xpath->query(".//input[@type='checkbox']", $element);
1063 - foreach ($checks as $check) {
1064 - $attr = $dom->createAttribute('name');
1065 - $attr->value = $name;
1066 - $check->appendChild($attr);
1067 - }
1068 - }
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 + }
1069 1051
1070 - $remove_by_class = array(
1071 - 'et_pb_contact_submit',
1072 - 'et_pb_contactform_validate_field'
1073 - );
1074 - foreach ($remove_by_class as $key => $class) {
1075 - $elements = $xpath->query("//*[contains(@class, '{$class}')]");
1076 - foreach ($elements as $element) {
1077 - $element->parentNode->removeChild($element);
1078 - }
1079 - }
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 + }
1080 1066
1081 - $remove_parent_by_class = array(
1082 - 'et_pb_contact_captcha_question'
1083 - );
1084 - foreach ($remove_parent_by_class as $key => $class) {
1085 - $elements = $xpath->query("//*[contains(@class, '{$class}')]/parent::*");
1086 - foreach ($elements as $element) {
1087 - $element->parentNode->removeChild($element);
1088 - }
1089 - }
1067 + $xml_elements = $xpath->query('//*[@data-step]');
1068 + foreach ($xml_elements as $xml_element) {
1069 + $xml_element->removeAttribute('style');
1070 + }
1090 1071
1091 - if ($xpath->query("//form")->item(0)) {
1092 - $autocomplete = $dom->createAttribute('autocomplete');
1093 - $autocomplete->value = 'off';
1094 - $xpath->query("//form")->item(0)->appendChild($autocomplete);
1095 - }
1096 - }
1097 -
1098 - return $dom->saveHTML();
1099 - }
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);
1100 1080 }
1101 1081 }
1102 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 + }
1103 1089 }
1104 1090 }
1105 1091
1106 1092 return false;
@@ -1105,47 +1091,64 @@
1105 1091
1106 1092 return false;
1107 1093 }
1108 1094
1095 + // filter mail
1109 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 +
1110 1106 if (isset($args['message'])) {
1111 1107 if (false !== strpos($args['message'], '[')) {
1112 - $shortcode_tags = array(
1108 + $shortcode_tags = [
1113 1109 'e2pdf-download',
1114 1110 'e2pdf-save',
1115 1111 'e2pdf-attachment',
1116 - 'e2pdf-adobesign'
1117 - );
1118 -
1112 + 'e2pdf-adobesign',
1113 + 'e2pdf-zapier',
1114 + ];
1119 1115 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $args['message'], $matches);
1120 1116 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1121 -
1122 1117 if (!empty($tagnames)) {
1123 - $pattern = get_shortcode_regex($tagnames);
1124 -
1125 - preg_match_all("/$pattern/", $args['message'], $shortcodes);
1126 -
1118 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $args['message'], $shortcodes);
1127 1119 foreach ($shortcodes[0] as $key => $shortcode_value) {
1128 -
1129 - $shortcode = array();
1130 - $shortcode[1] = $shortcodes[1][$key];
1131 - $shortcode[2] = $shortcodes[2][$key];
1132 - $shortcode[3] = $shortcodes[3][$key];
1133 - $shortcode[4] = $shortcodes[4][$key];
1134 - $shortcode[5] = $shortcodes[5][$key];
1135 - $shortcode[6] = $shortcodes[6][$key];
1136 -
1120 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1137 1121 $atts = shortcode_parse_atts($shortcode[3]);
1138 -
1139 - if ($shortcode[2] === 'e2pdf-attachment' || $shortcode[2] === 'e2pdf-save' || $shortcode[2] === 'e2pdf-adobesign') {
1140 - $shortcode[3] .= " apply=\"true\"";
1122 + if (!isset($atts['apply'])) {
1123 + $shortcode[3] .= ' apply="true"';
1141 1124 }
1142 -
1143 - 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)) {
1144 1130 $file = do_shortcode_tag($shortcode);
1145 1131 if ($file) {
1146 - $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 + }
1147 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 + }
1148 1151 }
1149 1152 $args['message'] = str_replace($shortcode_value, '', $args['message']);
1150 1153 } else {
1151 1154 if (is_array($args['headers']) && !in_array('Content-Type: text/html; charset=UTF-8', $args['headers'])) {
@@ -1151,231 +1154,750 @@
1151 1154 if (is_array($args['headers']) && !in_array('Content-Type: text/html; charset=UTF-8', $args['headers'])) {
1152 1155 $args['headers'][] = 'Content-Type: text/html; charset=UTF-8';
1153 1156 }
1154 1157 $args['message'] = str_replace($shortcode_value, do_shortcode_tag($shortcode), $args['message']);
1155 - $args['message'] = str_replace("\r\n", "<br/>", $args['message']);
1158 + $args['message'] = str_replace("\r\n", '<br/>', $args['message']);
1156 1159 }
1157 1160 }
1158 1161 }
1159 1162 }
1160 1163 }
1161 -
1162 - $wp_mail = array(
1164 + $wp_mail = [
1163 1165 'to' => $args['to'],
1164 1166 'subject' => $args['subject'],
1165 1167 'message' => $args['message'],
1166 1168 'headers' => $args['headers'],
1167 1169 'attachments' => $args['attachments'],
1168 - );
1170 + ];
1171 + return $wp_mail;
1172 + }
1169 1173
1170 - 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 + }
1171 1182 }
1172 1183
1173 - /**
1174 - * Load actions for this extension
1175 - */
1176 - public function load_actions() {
1177 -
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);
1178 1187 }
1179 1188
1180 - /**
1181 - * Load filters for this extension
1182 - */
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
1183 1196 public function load_filters() {
1184 - add_filter('et_pb_module_shortcode_attributes', array($this, 'filter_et_pb_module_shortcode_attributes'), 30, 5);
1185 - 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);
1186 1207 }
1187 1208
1188 - public function filter_et_pb_module_shortcode_attributes($props, $attrs, $render_slug, $address, $content) {
1189 - global $wpdb;
1209 + public function filter_divi_module_library_register_module_attrs($module_attrs, $filter_args) {
1190 1210
1191 - 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 + }
1192 1214
1193 - $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 + }
1194 1218
1195 - $et_contact_error = false;
1196 - $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] : '';
1197 - $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;
1198 - $contact_email = '';
1199 - $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;
1200 1221
1201 - $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 + }
1202 1228
1203 - 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])) {
1204 - if ('' !== $current_form_fields) {
1205 - $fields_data_json = str_replace('\\', '', $current_form_fields);
1206 - $fields_data_array = json_decode($fields_data_json, true);
1229 + $module = \ET\Builder\FrontEnd\BlockParser\BlockParserStore::get($module_id, $store_instance);
1207 1230
1208 - // check whether captcha field is not empty
1209 - 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]) )) {
1210 - $et_contact_error = true;
1211 - }
1231 + if (!$module) {
1232 + return $module_attrs;
1233 + }
1212 1234
1213 - // check all fields on current form and generate error message if needed
1214 - if (!empty($fields_data_array)) {
1215 - foreach ($fields_data_array as $index => $value) {
1216 - // check all the required fields, generate error message if required field is empty
1217 - $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 + }
1218 1244
1219 - if ('required' === $value['required_mark'] && empty($field_value) && !is_numeric($field_value)) {
1220 - $et_contact_error = true;
1221 - continue;
1222 - }
1245 + $unique_id = \ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormUtils::get_unique_id($module_attrs, (array) $module);
1223 1246
1224 - // additional check for email field
1225 - if ('email' === $value['field_type'] && 'required' === $value['required_mark'] && !empty($field_value)) {
1226 - $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 + }
1227 1251
1228 - if (!empty($contact_email) && !is_email($contact_email)) {
1229 - $et_contact_error = true;
1230 - }
1231 - }
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 + }
1232 1255
1233 - // prepare the array of processed field values in convenient format
1234 - if (false === $et_contact_error) {
1235 - $processed_fields_values[$value['original_id']]['value'] = $field_value;
1236 - $processed_fields_values[$value['original_id']]['label'] = $value['field_label'];
1237 - }
1238 - }
1239 - }
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']) : '';
1240 1286 } else {
1241 - $et_contact_error = true;
1287 + $messages['email'] = isset($module_attrs['email']['innerContent']['desktop']['value']) ? $module_attrs['email']['innerContent']['desktop']['value'] : '';
1242 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 + }
1243 1320 } else {
1244 - $et_contact_error = true;
1321 + unset($messages[$message_key]);
1245 1322 }
1323 + }
1246 1324
1247 - if (!$et_contact_error && $nonce_result) {
1325 + $_POST = $this->sanitize($_POST);
1248 1326
1249 - $dataset_id = false;
1327 + if (!$this->get('process')) {
1328 + return $module_attrs;
1329 + }
1250 1330
1251 - $success_message = '';
1252 - $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 + }
1253 1336
1254 - if (isset($props['success_message'])) {
1255 - $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'] = [];
1256 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 + }
1257 1411
1258 - 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 + }
1259 1445
1260 - $shortcode_tags = array(
1261 - 'e2pdf-download',
1262 - 'e2pdf-save',
1263 - 'e2pdf-view',
1264 - 'e2pdf-adobesign'
1265 - );
1446 + $refClass = new ReflectionClass('\ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormHandler');
1447 + $obj = $refClass->newInstanceWithoutConstructor();
1266 1448
1267 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1268 - $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);
1269 1453
1270 - if (!empty($tagnames)) {
1271 - $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 + }
1272 1460
1273 - preg_match_all("/$pattern/", $success_message, $shortcodes);
1461 + $obj->validate_fields();
1462 + $errorObj = $refError->getValue($obj);
1274 1463
1275 - foreach ($shortcodes[0] as $key => $shortcode_value) {
1464 + if ($errorObj->has_errors()) {
1465 + return $module_attrs;
1466 + }
1276 1467
1277 - $item = false;
1468 + $fields_raw = $refFields->getValue($obj);
1278 1469
1279 - $shortcode = array();
1280 - $shortcode[1] = $shortcodes[1][$key];
1281 - $shortcode[2] = $shortcodes[2][$key];
1282 - $shortcode[3] = $shortcodes[3][$key];
1283 - $shortcode[4] = $shortcodes[4][$key];
1284 - $shortcode[5] = $shortcodes[5][$key];
1285 - $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 + }
1286 1474
1287 - $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 + ];
1288 1484
1289 - if (!array_key_exists('dataset', $atts) && array_key_exists('id', $atts)) {
1290 - $template = new Model_E2pdf_Template();
1291 - $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 + }
1292 1501
1293 - if ($template->get('extension') === 'divi') {
1294 - $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();
1295 1507
1296 - if (!$dataset_id) {
1297 - $serialized = serialize($_POST);
1298 - $dataset = array(
1299 - 'extension' => 'divi',
1300 - 'item' => $item,
1301 - 'entry' => $serialized
1302 - );
1303 - $wpdb->insert($wpdb->prefix . 'e2pdf_datasets', $dataset);
1304 - $dataset_id = $wpdb->insert_id;
1305 - }
1306 - $atts['dataset'] = $dataset_id;
1307 - $shortcode[3] .= " dataset=\"{$dataset_id}\" ";
1308 - }
1309 - }
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]);
1310 1526
1311 - if ($shortcode[2] === 'e2pdf-attachment' || $shortcode[2] === 'e2pdf-save') {
1312 - $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 . '"';
1313 1534 }
1314 -
1315 - $props['success_message'] = str_replace(str_replace(array('[', ']'), array('&#91;', '&#93;'), $shortcode_value), "[" . $shortcode[2] . $shortcode[3] . "]", $props['success_message']);
1316 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 + }
1317 1557 }
1318 1558 }
1559 + }
1560 + }
1319 1561
1320 - if (isset($props['custom_message'])) {
1321 - $custom_message = str_replace(array('&#91;', '&#93;'), array('[', ']'), $props['custom_message']);
1322 - }
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 + }
1323 1585
1324 - if (false !== strpos($custom_message, '[')) {
1325 - $shortcode_tags = array(
1326 - 'e2pdf-download',
1327 - 'e2pdf-save',
1328 - 'e2pdf-attachment',
1329 - 'e2pdf-adobesign'
1330 - );
1586 + // filter shortcode attributes
1587 + public function filter_et_pb_module_shortcode_attributes($props, $attrs, $render_slug, $address, $content) {
1331 1588
1332 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $custom_message, $matches);
1333 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
1589 + if ($render_slug !== 'et_pb_contact_form') {
1590 + return $props;
1591 + }
1334 1592
1335 - if (!empty($tagnames)) {
1336 - $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 + }
1337 1597
1338 - preg_match_all("/$pattern/", $custom_message, $shortcodes);
1598 + $success_message = isset($props['success_message']) ? $this->decode_shortcodes($props['success_message'], true) : '';
1339 1599
1340 - 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 + }
1341 1616
1342 - foreach ($shortcodes[0] as $key => $shortcode_value) {
1343 - $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 + }
1344 1639
1345 - $shortcode = array();
1346 - $shortcode[1] = $shortcodes[1][$key];
1347 - $shortcode[2] = $shortcodes[2][$key];
1348 - $shortcode[3] = $shortcodes[3][$key];
1349 - $shortcode[4] = $shortcodes[4][$key];
1350 - $shortcode[5] = $shortcodes[5][$key];
1351 - $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 + }
1352 1663
1353 - $atts = shortcode_parse_atts($shortcode[3]);
1664 + $_POST = $this->sanitize($_POST);
1354 1665
1355 - 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'])) {
1356 1783 $template = new Model_E2pdf_Template();
1357 1784 $template->load($atts['id']);
1358 1785 if ($template->get('extension') === 'divi') {
1359 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 + }
1360 1809
1361 - if (!$dataset_id) {
1362 - $serialized = serialize($_POST);
1363 - $dataset = array(
1364 - 'extension' => 'divi',
1365 - 'item' => $item,
1366 - 'entry' => $serialized
1367 - );
1368 - $wpdb->insert($wpdb->prefix . 'e2pdf_datasets', $dataset);
1369 - $dataset_id = $wpdb->insert_id;
1370 - }
1371 - $atts['dataset'] = $dataset_id;
1372 - $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();
1373 1837 }
1838 + $atts['dataset'] = $dataset;
1839 + $shortcode[3] .= ' dataset="' . $dataset . '"';
1374 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 + }
1375 1854
1376 - $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 + }
1377 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 + }
1378 1900 }
1379 1901 }
1380 1902 }
1381 1903 }
@@ -1382,141 +1904,257 @@
1382 1904
1383 1905 return $props;
1384 1906 }
1385 1907
1908 + // filter shortcode output
1386 1909 public function filter_et_module_shortcode_output($output, $render_slug, $form) {
1387 1910
1388 - 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 + }
1389 1914
1390 - $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 + }
1391 1919
1392 - $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;
1393 1922
1394 - 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])) {
1395 -
1396 - $dataset_id = false;
1397 -
1398 - $success_message = '';
1399 - $custom_message = '';
1400 -
1401 - if (isset($form->props['success_message'])) {
1402 - $success_message = str_replace(array('&#91;', '&#93;', '&quot;'), array('[', ']', '"'), $form->props['success_message']);
1403 - }
1404 -
1405 - if (false !== strpos($success_message, '[')) {
1406 - $shortcode_tags = array(
1407 - 'e2pdf-download',
1408 - 'e2pdf-save',
1409 - 'e2pdf-view',
1410 - 'e2pdf-adobesign'
1411 - );
1412 -
1413 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $success_message, $matches);
1414 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
1415 -
1416 - if (!empty($tagnames)) {
1417 - $pattern = get_shortcode_regex($tagnames);
1418 -
1419 - preg_match_all("/$pattern/", $success_message, $shortcodes);
1420 -
1421 - foreach ($shortcodes[0] as $key => $shortcode_value) {
1422 -
1423 - $shortcode = array();
1424 - $shortcode[1] = $shortcodes[1][$key];
1425 - $shortcode[2] = $shortcodes[2][$key];
1426 - $shortcode[3] = $shortcodes[3][$key];
1427 - $shortcode[4] = $shortcodes[4][$key];
1428 - $shortcode[5] = $shortcodes[5][$key];
1429 - $shortcode[6] = $shortcodes[6][$key];
1430 -
1431 - $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);
1432 1947 }
1433 1948 }
1434 1949 }
1435 1950 }
1436 -
1437 - remove_filter('wp_mail', array($this, 'filter_wp_mail'), 10);
1438 -
1439 - $files = $this->helper->get('divi_attachments');
1440 - if (is_array($files) && !empty($files)) {
1441 - foreach ($files as $key => $file) {
1442 - $this->helper->delete_dir(dirname($file) . '/');
1443 - }
1444 - $this->helper->deset('divi_attachments');
1445 - }
1446 1951 }
1447 -
1448 1952 return $output;
1449 1953 }
1450 1954
1451 - /**
1452 - * Delete dataset for template
1453 - *
1454 - * @param int $template_id - Template ID
1455 - * @param int $dataset_id - Dataset ID
1456 - *
1457 - * @return bool - Result of removing items
1458 - */
1459 - public function delete_item($template_id = false, $dataset_id = false) {
1955 + // delete item
1956 + public function delete_item($template_id = false, $dataset = false) {
1460 1957 global $wpdb;
1461 -
1462 1958 $template = new Model_E2pdf_Template();
1463 - if ($template_id && $dataset_id && $template->load($template_id)) {
1959 + if ($template_id && $dataset && $template->load($template_id)) {
1464 1960 if ($template->get('extension') === 'divi' && $template->get('item')) {
1465 -
1466 - $item_id = $template->get('item');
1467 -
1468 - $where = array(
1469 - 'ID' => $dataset_id,
1470 - 'item' => $item_id,
1471 - 'extension' => 'divi'
1472 - );
1961 + $item = $template->get('item');
1962 + $where = [
1963 + 'ID' => $dataset,
1964 + 'item' => $item,
1965 + 'extension' => 'divi',
1966 + ];
1473 1967 $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1474 1968 return true;
1475 1969 }
1476 1970 }
1477 -
1478 1971 return false;
1479 1972 }
1480 1973
1481 - /**
1482 - * Delete all datasets for Template
1483 - *
1484 - * @param int $template_id - Template ID
1485 - *
1486 - * @return bool - Result of removing items
1487 - */
1974 + // delete items
1488 1975 public function delete_items($template_id = false) {
1489 1976 global $wpdb;
1490 -
1491 1977 $template = new Model_E2pdf_Template();
1492 -
1493 1978 if ($template_id && $template->load($template_id)) {
1494 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 + }
1495 1990
1496 - $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 + }
1497 2013
1498 - $where = array(
1499 - 'item' => $item_id,
1500 - 'extension' => 'divi'
1501 - );
1502 - $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1503 - 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);
1504 2028 }
2029 + return $value;
1505 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 + }
1506 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 + }
1507 2094 return false;
1508 2095 }
1509 2096
1510 - /**
1511 - * Get styles for generating Map Field function
1512 - *
1513 - * @return array - List of css files to load
1514 - */
1515 - public function styles() {
1516 - $styles = array(
1517 - 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 . '/'
1518 2125 );
1519 - 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;
1520 2159 }
1521 -
1522 2160 }