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