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 +1772 -1058 1.01.01 → 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,132 +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 - $helper_e2pdf_db = new Helper_E2pdf_Db();
100 -
101 - $condition = array(
102 - 'post_content' => array(
192 + $condition = [
193 + 'post_content' => [
103 194 'condition' => 'LIKE',
104 195 'value' => '%et_pb_contact_form%',
105 - 'type' => '%s'
106 - ),
107 - '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' => [
108 208 'condition' => '<>',
109 - 'value' => array(
209 + 'value' => [
110 210 'revision',
111 - 'et_pb_layout'
112 - ),
113 - 'type' => '%s'
114 - ),
115 - );
116 -
117 - $order_condition = array(
211 + 'et_pb_layout',
212 + ],
213 + 'type' => '%s',
214 + ],
215 + ];
216 + $order_condition = [
118 217 'orderby' => 'id',
119 218 'order' => 'desc',
120 - );
219 + ];
220 + $where = $this->helper->load('db')->prepare_where($condition);
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']));
121 224
122 - $where = $helper_e2pdf_db->prepare_where($condition);
123 - $orderby = $helper_e2pdf_db->prepare_orderby($order_condition);
124 -
125 - $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'posts' . $where['sql'] . $orderby . "", $where['filter']));
126 -
127 - $forms = array();
225 + $content = [];
128 226 foreach ($posts as $key => $post) {
129 - if ($forms_labels = $this->get_forms($post->post_content)) {
130 -
131 - foreach ($forms_labels as $form_key => $form_value) {
132 - $forms[] = array(
133 - 'key' => $form_key,
134 - 'value' => $form_value
135 - );
136 - }
227 + foreach ($this->get_forms($post->post_content) as $form_key => $form_value) {
228 + $content[] = $this->item($form_key);
137 229 }
138 230 }
139 - return $forms;
231 + return $content;
140 232 }
141 233
142 - /**
143 - * Parse available forms from pages
144 - *
145 - * @param string $content - Page content
146 - *
147 - * @return array() - Forms list
148 - */
234 + // get forms
149 235 public function get_forms($content) {
236 + $forms = [];
150 237
151 - $forms = array();
152 - if (false !== strpos($content, 'et_pb_contact_form')) {
153 - $shortcode_tags = array(
238 + if ($this->divi4_form($content)) {
239 + $shortcode_tags = [
154 240 'et_pb_contact_form',
155 - );
156 -
241 + ];
157 242 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
158 243 $tagnames = array_intersect($shortcode_tags, $matches[1]);
159 -
160 244 if (!empty($tagnames)) {
161 - $pattern = get_shortcode_regex($tagnames);
162 -
163 - preg_match_all("/$pattern/", $content, $shortcodes);
245 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
164 246 foreach ($shortcodes[0] as $key => $shortcode_value) {
165 -
166 - $shortcode = array();
167 - $shortcode[1] = $shortcodes[1][$key];
168 - $shortcode[2] = $shortcodes[2][$key];
169 - $shortcode[3] = $shortcodes[3][$key];
170 - $shortcode[4] = $shortcodes[4][$key];
171 - $shortcode[5] = $shortcodes[5][$key];
172 - $shortcode[6] = $shortcodes[6][$key];
173 -
247 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
174 248 preg_match_all('/admin_label="(.*?)"/', $shortcode[3], $labels);
175 249 if (isset($labels['1'])) {
176 250 foreach ($labels['1'] as $label) {
177 251 $forms[$label] = $label;
@@ -178,572 +252,563 @@
178 252 }
179 253 }
180 254 }
181 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 + }
182 264 }
183 -
184 265 return $forms;
185 266 }
186 267
187 - /**
188 - * Get entries for export
189 - *
190 - * @param string $item - Item
191 - * @param string $name - Entries names
192 - *
193 - * @return array() - Entries list
194 - */
195 - public function get_datasets($item = false, $name = false) {
196 -
268 + // datasets
269 + public function datasets($item_id = false, $name = false) {
197 270 global $wpdb;
198 -
199 - $datasets = array();
200 -
201 - if ($item) {
202 - $helper_e2pdf_db = new Helper_E2pdf_Db();
203 - $condition = array(
204 - 'extension' => array(
271 + $datasets = [];
272 + if ($item_id) {
273 + $condition = [
274 + 'extension' => [
205 275 'condition' => '=',
206 276 'value' => 'divi',
207 - 'type' => '%s'
208 - ),
209 - 'item' => array(
277 + 'type' => '%s',
278 + ],
279 + 'item' => [
210 280 'condition' => '=',
211 - 'value' => $item,
212 - 'type' => '%s'
213 - ),
214 - );
215 -
216 - $order_condition = array(
281 + 'value' => $item_id,
282 + 'type' => '%s',
283 + ],
284 + ];
285 + $order_condition = [
217 286 'orderby' => 'ID',
218 287 'order' => 'desc',
219 - );
288 + ];
289 + $where = $this->helper->load('db')->prepare_where($condition);
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 - $where = $helper_e2pdf_db->prepare_where($condition);
222 - $orderby = $helper_e2pdf_db->prepare_orderby($order_condition);
223 -
224 - $datasets_tmp = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'e2pdf_datasets' . $where['sql'] . $orderby . "", $where['filter']));
225 -
226 - if ($datasets_tmp) {
227 - foreach ($datasets_tmp as $key => $dataset) {
228 - $this->set('item', $item);
229 - $this->set('dataset', $dataset->ID);
230 - $dataset_title = $this->render($name);
231 - if (!$dataset_title) {
232 - $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;
233 301 }
234 - $datasets[] = array(
235 - 'key' => $dataset->ID,
236 - 'value' => $dataset_title
237 - );
302 + $datasets[] = [
303 + 'key' => $entry->ID,
304 + 'value' => $entry_title,
305 + ];
238 306 }
239 307 }
240 308 }
241 -
242 309 return $datasets;
243 310 }
244 311
245 - /**
246 - * Get dataset
247 - *
248 - * @param int $dataset - Dataset ID
249 - *
250 - * @return object - Dataset
251 - */
252 - 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 + }
253 323
254 - $dataset = (int) $dataset;
255 -
256 - if (!$dataset) {
324 + // get template actions
325 + public function get_template_actions($template = false) {
326 + $template = (int) $template;
327 + if (!$template) {
257 328 return;
258 329 }
330 + $actions = new stdClass();
331 + $actions->delete = true;
332 + return $actions;
333 + }
259 334
260 - $data = new stdClass();
261 - $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 + }
262 349
263 - 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;
264 372 }
265 373
266 - /**
267 - * Get item
268 - *
269 - * @param string $item - Item
270 - *
271 - * @return object - Item
272 - */
273 - public function get_item($item = false) {
274 -
275 - $form = new stdClass();
276 -
277 - if ($item) {
278 - $form->name = $item;
279 - $post = $this->get_post($item);
280 - $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 + }
281 394 } else {
282 - $form->name = '';
283 - $form->url = 'javascript:void(0);';
395 + $item->id = '';
396 + $item->name = '';
397 + $item->url = '';
284 398 }
285 - return $form;
399 + return $item;
286 400 }
287 401
288 - /**
289 - * Get post
290 - *
291 - * @param string $item_id - Form label
292 - *
293 - * @return object - Post
294 - */
295 - public function get_post($item_id = false) {
402 + // get form
403 + public function get_form($item_id = false) {
296 404 global $wpdb;
297 -
298 405 $item_post = false;
299 - $helper_e2pdf_db = new Helper_E2pdf_Db();
300 -
301 - $condition = array(
302 - 'post_content' => array(
406 + $condition = [
407 + 'post_content' => [
303 408 'condition' => 'LIKE',
304 409 'value' => '%admin_label="' . $item_id . '"%',
305 - 'type' => '%s'
306 - ),
307 - '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' => [
308 422 'condition' => '<>',
309 - 'value' => array(
423 + 'value' => [
310 424 'revision',
311 - 'et_pb_layout'
312 - ),
313 - 'type' => '%s'
314 - ),
315 - );
425 + 'et_pb_layout',
426 + ],
427 + 'type' => '%s',
428 + ],
429 + ];
316 430
317 - $order_condition = array(
431 + $order_condition = [
318 432 'orderby' => 'id',
319 433 'order' => 'desc',
320 - );
434 + ];
321 435
322 - $where = $helper_e2pdf_db->prepare_where($condition);
323 - $orderby = $helper_e2pdf_db->prepare_orderby($order_condition);
324 -
325 - $posts = $wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'posts' . $where['sql'] . $orderby . "", $where['filter']));
326 - foreach ($posts as $key => $post) {
327 - if ($forms_labels = $this->get_forms($post->post_content)) {
328 - if (in_array($item_id, $forms_labels)) {
329 - $item_post = $post;
330 - break;
331 - }
436 + $where = $this->helper->load('db')->prepare_where($condition);
437 + $orderby = $this->helper->load('db')->prepare_orderby($order_condition);
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;
332 444 }
333 445 }
334 446 return $item_post;
335 447 }
336 448
337 - /**
338 - * Render value according to content
339 - *
340 - * @param string $value - Content
341 - * @param string $type - Type of rendering value
342 - * @param array $field - Field details
343 - *
344 - * @return string - Fully rendered value
345 - */
346 - public function render($value, $type = false, $field = array()) {
347 -
348 - $value = $this->render_shortcodes($value, $type, $field);
349 - $value = $this->strip_shortcodes($value);
350 -
351 - if ($type === 'value' && isset($field['type']) && $field['type'] === 'e2pdf-checkbox' && isset($field['properties']['option'])) {
352 - $option = $this->render($field['properties']['option']);
353 - $options = explode(', ', $value);
354 - $option_options = explode(', ', $option);
355 - if (is_array($options) && is_array($option_options) && !array_diff($option_options, $options)) {
356 - return $option;
357 - } else {
358 - return "";
359 - }
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);
360 456 }
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 - $helper_e2pdf_db = new Helper_E2pdf_Db();
399 - $where = $helper_e2pdf_db->prepare_where($condition);
400 -
401 - $dataset = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'e2pdf_datasets' . $where['sql'] . "", $where['filter']));
402 -
403 - $processed_fields_values = array();
404 - if ($dataset) {
405 - $post = unserialize($dataset->entry);
406 - if ($post && is_array($post)) {
407 -
408 - $et_pb_contact_form_num = 0;
409 -
410 - $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] : '';
411 - $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;
412 - $processed_fields_values = array();
413 -
414 - if ('' !== $current_form_fields) {
415 - $fields_data_json = str_replace('\\', '', $current_form_fields);
416 - $fields_data_array = json_decode($fields_data_json, true);
417 -
418 - if (!empty($fields_data_array)) {
419 - foreach ($fields_data_array as $index => $field_value) {
420 - $processed_fields_values[$field_value['original_id']]['value'] = isset($post[$field_value['field_id']]) ? $post[$field_value['field_id']] : '';
421 - $processed_fields_values[$field_value['original_id']]['label'] = $field_value['field_label'];
422 - }
423 - }
424 - }
425 - }
426 -
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()) {
427 464 if (false !== strpos($value, '[')) {
428 -
429 - $shortcode_tags = array(
430 - 'e2pdf-format-number',
431 - 'e2pdf-format-date',
432 - 'e2pdf-format-output',
433 - );
434 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $value, $matches);
435 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
436 -
437 - if (!empty($tagnames)) {
438 -
439 - $pattern = get_shortcode_regex($tagnames);
440 - preg_match_all("/$pattern/", $value, $shortcodes);
441 - foreach ($shortcodes[0] as $key => $shortcode_value) {
442 - $shortcode = array();
443 - $shortcode[1] = $shortcodes[1][$key];
444 - $shortcode[2] = $shortcodes[2][$key];
445 - $shortcode[3] = $shortcodes[3][$key];
446 - $shortcode[4] = $shortcodes[4][$key];
447 - $shortcode[5] = $shortcodes[5][$key];
448 - $shortcode[6] = $shortcodes[6][$key];
449 -
450 - if (isset($shortcode['5'])) {
451 - foreach ($processed_fields_values as $field_key => $field_value) {
452 - $shortcode['5'] = str_ireplace("%%{$field_key}%%", wp_strip_all_tags($field_value['value']), $shortcode['5']);
453 - }
454 - $sub_value = $this->strip_shortcodes($shortcode['5']);
455 - $value = str_replace($shortcode_value, "[" . $shortcode['2'] . $shortcode['3'] . "]" . $sub_value . "[/" . $shortcode['2'] . "]", $value);
456 - }
457 - }
458 - }
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);
459 468 }
460 -
461 - $value = do_shortcode($value);
462 -
463 - if ($dataset) {
464 - foreach ($processed_fields_values as $field_key => $field_value) {
465 - $value = str_ireplace("%%{$field_key}%%", wp_strip_all_tags($field_value['value']), $value);
466 - }
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 - $helper_e2pdf_image = new Helper_E2pdf_Image();
476 - if (!$helper_e2pdf_image->get_image($value)) {
477 - $value = $this->strip_shortcodes($value);
478 - if (
479 - $value &&
480 - trim($value) != "" &&
481 - extension_loaded('gd') &&
482 - function_exists('imagettftext')
483 - ) {
484 - if (isset($field['properties']['text_color']) && $field['properties']['text_color']) {
485 - $penColour = $this->helper->hexColorAllocate($field['properties']['text_color']);
486 - } else {
487 - $penColour = array(0x14, 0x53, 0x94);
488 - }
484 + // strip shortcodes
485 + public function strip_shortcodes($value) {
486 + $value = preg_replace('~(?:\[/?)[^/\]]+/?\]~s', '', $value);
487 + $value = preg_replace('~%%[^%%]*%%~', '', $value);
488 + return $value;
489 + }
489 490
490 - $default_options = array(
491 - 'imageSize' => array(isset($field['width']) ? $field['width'] : '400', isset($field['height']) ? $field['height'] : '150'),
492 - 'bgColour' => 'transparent',
493 - 'penColour' => $penColour
494 - );
495 -
496 - $options = array();
497 - $options = array_merge($default_options, $options);
498 -
499 - $model_e2pdf_font = new Model_E2pdf_Font();
500 -
501 - $font = false;
502 - if (isset($field['properties']['text_font']) && $field['properties']['text_font']) {
503 - $font = $model_e2pdf_font->get_font_path($field['properties']['text_font']);
504 - }
505 - if (!$font) {
506 - $font = $model_e2pdf_font->get_font_path('Noto Sans');
507 - }
508 -
509 - $size = 150;
510 - if (isset($field['properties']['text_font_size']) && $field['properties']['text_font_size']) {
511 - $size = $field['properties']['text_font_size'];
512 - }
513 -
514 - $model_e2pdf_signature = new Model_E2pdf_Signature();
515 - $value = $model_e2pdf_signature->ttf_signature($value, $size, $font, $options);
516 - } else {
517 - $value = "";
518 - }
519 - }
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);
520 499 }
500 + } else {
501 + $value = str_replace('[', '&#91;', $value);
521 502 }
522 503 }
523 -
524 504 return $value;
525 505 }
526 506
527 - /**
528 - * Strip unused shortcodes
529 - *
530 - * @param string $value - Content
531 - *
532 - * @return string - Value with removed unused shortcodes
533 - */
534 - public function strip_shortcodes($value) {
535 - $value = preg_replace('~(?:\[/?)[^/\]]+/?\]~s', "", $value);
536 - $value = preg_replace('~(?:%%/?)[^/%%]+/?%%~', "", $value);
537 - return $value;
538 - }
539 -
507 + // auto
540 508 public function auto() {
541 509
542 - $response = array();
543 - $elements = array();
510 + $elements = [];
544 511
545 512 if ($this->get('item')) {
546 - $post = $this->get_post($this->get('item'));
513 + $post = $this->get_form($this->get('item'));
547 514 if ($post && isset($post->post_content)) {
548 515
516 + $source = '';
549 517 $content = $post->post_content;
550 518
551 - if (false !== strpos($content, '[')) {
552 - $shortcode_tags = array(
519 + if ($this->divi4_form($content)) {
520 + $shortcode_tags = [
553 521 'et_pb_contact_form',
554 - );
555 -
522 + ];
556 523 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
557 524 $tagnames = array_intersect($shortcode_tags, $matches[1]);
558 -
559 525 if (!empty($tagnames)) {
560 - $pattern = get_shortcode_regex($tagnames);
561 -
562 - preg_match_all("/$pattern/", $content, $shortcodes);
563 -
526 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
564 527 foreach ($shortcodes[0] as $key => $shortcode_value) {
565 -
566 - $shortcode = array();
567 - $shortcode[1] = $shortcodes[1][$key];
568 - $shortcode[2] = $shortcodes[2][$key];
569 - $shortcode[3] = $shortcodes[3][$key];
570 - $shortcode[4] = $shortcodes[4][$key];
571 - $shortcode[5] = $shortcodes[5][$key];
572 - $shortcode[6] = $shortcodes[6][$key];
573 -
528 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
574 529 $atts = shortcode_parse_atts($shortcode[3]);
575 530 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
576 -
577 - require_once(ET_BUILDER_DIR . 'class-et-builder-element.php');
578 - require_once(ET_BUILDER_DIR . 'functions.php');
579 - require_once(ET_BUILDER_DIR . 'ab-testing.php');
580 - require_once(ET_BUILDER_DIR . 'class-et-global-settings.php');
581 - require_once(ET_BUILDER_DIR . 'module/ContactForm.php');
582 - require_once(ET_BUILDER_DIR . 'module/ContactFormItem.php');
583 -
584 - new ET_Builder_Module_Contact_Form();
585 - new ET_Builder_Module_Contact_Form_Item();
586 -
587 -
531 + $this->divi4_load();
588 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 + }
589 546
590 - libxml_use_internal_errors(true);
591 - $dom = new DOMDocument;
592 - $html = $dom->loadHTML($source);
593 - 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);
594 553
595 - if ($html) {
596 - $xpath = new DomXPath($dom);
597 - $blocks = $xpath->query("//*[contains(@class, 'et_pb_contact_field')]");
598 - 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 + }
599 564
600 - $data_type = $element->attributes->getNamedItem("data-type")->nodeValue;
565 + $blocks = $xpath->query("//*[contains(@class, 'et_pb_contact_field')]");
566 + foreach ($blocks as $element) {
601 567
602 - if ($data_type == 'radio') {
568 + if ($xml->get_node_value($element, 'data-type') == 'radio') {
603 569
604 - $label = $xpath->query(".//label", $element)->item(0);
605 - $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);
606 572
607 - $name = "";
608 - if ($check_handler) {
609 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
610 - }
573 + $name = '';
574 + if ($check_handler) {
575 + $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
576 + }
611 577
612 - $elements[] = $this->auto_field($element, 'e2pdf-html', array(
613 - 'top' => '20',
614 - 'left' => '20',
615 - 'right' => '20',
578 + if ($label) {
579 + $elements[] = $this->auto_field(
580 + $element,
581 + [
582 + 'type' => 'e2pdf-html',
616 583 'block' => true,
617 - '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',
618 591 'value' => $label->nodeValue,
619 - )
620 - ));
592 + ],
593 + ]
594 + );
595 + }
621 596
622 - $top = 0;
623 - $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);
624 601
625 - foreach ($fields as $field) {
626 - $radio_label = $xpath->query(".//label", $field)->item(0);
627 - $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 + }
628 622
629 - $elements[] = $this->auto_field($field, 'e2pdf-radio', array(
630 - 'top' => $top,
631 - 'properties' => array(
632 - 'width' => '15',
633 - 'height' => '15',
634 - 'value' => "%%" . $radio->attributes->getNamedItem("data-original_id")->nodeValue . "%%",
635 - 'option' => $radio->attributes->getNamedItem("value")->nodeValue,
636 - 'group' => $radio->attributes->getNamedItem("data-original_id")->nodeValue,
637 - )
638 - ));
639 - $elements[] = $this->auto_field($radio, 'e2pdf-html', array(
640 - 'top' => $top,
641 - 'left' => '20',
642 - 'properties' => array(
643 - 'value' => $radio_label->nodeValue
644 - )
645 - ));
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);
646 643
647 - $top = $top + 20;
648 - }
649 - } elseif ($data_type == 'checkbox') {
644 + $name = '';
645 + if ($check_handler) {
646 + $name = '%%' . $xml->get_node_value($check_handler, 'data-original_id') . '%%';
647 + }
650 648
651 - $label = $xpath->query(".//label", $element)->item(0);
652 - $check_handler = $xpath->query(".//input[contains(@class, 'et_pb_checkbox_handle')]", $element)->item(0);
653 -
654 - $name = "";
655 - if ($check_handler) {
656 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
657 - }
658 -
659 -
660 - $elements[] = $this->auto_field($element, 'e2pdf-html', array(
661 - 'top' => '20',
662 - 'left' => '20',
663 - 'right' => '20',
649 + if ($label) {
650 + $elements[] = $this->auto_field(
651 + $element,
652 + [
653 + 'type' => 'e2pdf-html',
664 654 'block' => true,
665 - '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',
666 662 'value' => $label->nodeValue,
667 - )
668 - ));
663 + ],
664 + ]
665 + );
666 + }
669 667
668 + $fields = $xpath->query(".//*[contains(@class, 'et_pb_contact_field_checkbox')]", $element);
669 + foreach ($fields as $field) {
670 + $checkbox_label = $xpath->query('.//label', $field)->item(0);
671 + $checkbox = $xpath->query(".//input[@type='checkbox']", $field)->item(0);
670 672
671 - $top = 0;
672 - $fields = $xpath->query("//*[contains(@class, 'et_pb_contact_field_checkbox')]", $element);
673 + $elements[] = $this->auto_field(
674 + $field,
675 + [
676 + 'type' => 'e2pdf-checkbox',
677 + 'class' => $xml->get_node_value($field, 'class'),
678 + 'properties' => [
679 + 'top' => '5',
680 + 'width' => 'auto',
681 + 'height' => 'auto',
682 + 'value' => $name,
683 + 'option' => sanitize_text_field($xml->get_node_value($checkbox, 'value')),
684 + ],
685 + ]
686 + );
673 687
674 - foreach ($fields as $field) {
675 - $checkbox_label = $xpath->query(".//label", $field)->item(0);
676 - $checkbox = $xpath->query(".//input[@type='checkbox']", $field)->item(0);
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);
677 710
678 -
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
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 + }
717 782
718 - if ($input_text) {
719 - $elements[] = $this->auto_field($input_text, 'e2pdf-input', array(
720 - 'properties' => array(
721 - 'value' => "%%{$input_text->attributes->getNamedItem("data-original_id")->nodeValue}%%",
722 - )
723 - ));
724 - } elseif ($select) {
725 - $options_tmp = array();
726 - $options = $xpath->query(".//option", $select);
727 - foreach ($options as $option) {
728 - $options_tmp[] = $option->attributes->getNamedItem("value")->nodeValue;
729 - }
730 -
731 - $elements[] = $this->auto_field($select, 'e2pdf-select', array(
732 - 'properties' => array(
733 - 'options' => implode("\n", $options_tmp),
734 - 'value' => "%%{$select->attributes->getNamedItem("data-original_id")->nodeValue}%%",
735 - )
736 - ));
737 - } elseif ($textarea) {
738 - $elements[] = $this->auto_field($textarea, 'e2pdf-textarea', array(
739 - 'properties' => array(
740 - 'value' => "%%{$textarea->attributes->getNamedItem("data-original_id")->nodeValue}%%",
741 - )
742 - ));
743 - }
744 - }
745 - }
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 + );
746 811 }
747 812 }
748 813 }
749 814 }
@@ -749,80 +814,53 @@
749 814 }
750 815 }
751 816 }
752 817 }
753 -
754 - $response['page'] = array(
755 - 'bottom' => '20',
756 - 'top' => '20',
757 - );
758 - $response['elements'] = $elements;
759 -
760 - return $response;
818 + return [
819 + 'page' => [
820 + 'bottom' => '20',
821 + 'top' => '20',
822 + 'right' => '20',
823 + 'left' => '20',
824 + ],
825 + 'elements' => $elements,
826 + ];
761 827 }
762 828
763 - /**
764 - * Convert Field name to Value
765 - * @since 0.01.34
766 - *
767 - * @param string $name - Field name
768 - *
769 - * @return bool|string - Converted value or false
770 - */
829 + // auto map
771 830 public function auto_map($name = false) {
772 831 $item = $this->get('item');
773 832 if ($item) {
774 - $post = $this->get_post($item);
833 + $post = $this->get_form($item);
775 834 if ($post && isset($post->post_content)) {
776 835 $content = $post->post_content;
777 -
778 - if (false !== strpos($content, '[')) {
779 - $shortcode_tags = array(
836 + if ($this->divi4_form($content)) {
837 + $shortcode_tags = [
780 838 'et_pb_contact_form',
781 - );
782 -
839 + ];
783 840 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
784 841 $tagnames = array_intersect($shortcode_tags, $matches[1]);
785 -
786 842 if (!empty($tagnames)) {
787 - $pattern = get_shortcode_regex($tagnames);
788 -
789 - preg_match_all("/$pattern/", $content, $shortcodes);
790 -
843 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
791 844 foreach ($shortcodes[0] as $key => $shortcode_value) {
792 -
793 - $shortcode = array();
794 - $shortcode[1] = $shortcodes[1][$key];
795 - $shortcode[2] = $shortcodes[2][$key];
796 - $shortcode[3] = $shortcodes[3][$key];
797 - $shortcode[4] = $shortcodes[4][$key];
798 - $shortcode[5] = $shortcodes[5][$key];
799 - $shortcode[6] = $shortcodes[6][$key];
800 -
801 -
845 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
802 846 $atts = shortcode_parse_atts($shortcode[3]);
803 847 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
804 -
805 848 $field_content = $shortcode_value;
806 - $field_shortcode_tags = array(
849 + $field_shortcode_tags = [
807 850 'et_pb_contact_field',
808 - );
809 -
851 + ];
810 852 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $field_content, $field_matches);
811 853 $field_tagnames = array_intersect($field_shortcode_tags, $field_matches[1]);
812 -
813 854 if (!empty($field_tagnames)) {
814 - $field_pattern = get_shortcode_regex($field_tagnames);
815 -
816 - preg_match_all("/$field_pattern/", $field_content, $field_shortcodes);
817 -
855 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($field_tagnames) . '/', $field_content, $field_shortcodes);
818 856 foreach ($field_shortcodes[0] as $field_key => $field_shortcode_value) {
819 - $field_shortcode = array();
857 + $field_shortcode = [];
820 858 $field_shortcode[3] = $field_shortcodes[3][$field_key];
821 - $field_atts = shortcode_parse_atts($field_shortcode[3]);
822 - if (isset($field_atts['field_title']) && isset($field_atts['field_id'])) {
823 - if ($field_atts['field_title'] == $name || $field_atts['field_id'] == $name) {
824 - 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']) . '%%';
825 863 }
826 864 }
827 865 }
828 866 }
@@ -828,8 +866,26 @@
828 866 }
829 867 }
830 868 }
831 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 + }
832 888 }
833 889 }
834 890 }
835 891
@@ -835,44 +891,35 @@
835 891
836 892 return false;
837 893 }
838 894
839 - /**
840 - * Generate field for Auto PDF
841 - *
842 - * @param object $field - Formidable field object
843 - * @param string $type - Field type
844 - * @param array $options - Field additional options
845 - *
846 - * @return array - Prepared auto field
847 - */
848 - public function auto_field($field = false, $type = false, $options = array()) {
895 + // auto field
896 + public function auto_field($field = false, $element = []) {
849 897
850 - if (!$field || !$type) {
898 + if (!$field) {
851 899 return false;
852 900 }
853 901
854 - $element = array(
855 - 'type' => $type,
856 - 'properties' => isset($options['properties']) ? $options['properties'] : array(),
857 - );
902 + if (!isset($element['block'])) {
903 + $element['block'] = false;
904 + }
858 905
859 - $element['top'] = isset($options['top']) ? $options['top'] : '0';
860 - $element['left'] = isset($options['left']) ? $options['left'] : '0';
861 - $element['right'] = isset($options['right']) ? $options['right'] : '0';
862 - $element['block'] = isset($options['block']) ? $options['block'] : false;
906 + if (!isset($element['float'])) {
907 + $element['float'] = false;
908 + }
863 909
864 - $classes = array();
865 - if (isset($field->attributes->getNamedItem("class")->nodeValue)) {
866 - $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']);
867 914 }
868 915
869 - $float_classes = array(
916 + $float_classes = [
870 917 'et_pb_contact_field_half',
871 - );
918 + ];
872 919 $array_intersect = array_intersect($classes, $float_classes);
873 920
874 - if (!empty($array_intersect)) {
921 + if (!empty($array_intersect) && $element['block']) {
875 922 $element['float'] = true;
876 923 };
877 924
878 925 $primary_class = false;
@@ -892,170 +939,154 @@
892 939
893 940 return $element;
894 941 }
895 942
896 - /**
897 - * Verify if form and dataset exists
898 - *
899 - * @return bool - Exists/Not exists
900 - */
943 + // verify
901 944 public function verify() {
902 - global $wpdb;
903 - $item_id = $this->get('item');
904 - $dataset_id = $this->get('dataset');
905 -
906 - if ($item_id && $dataset_id) {
907 - $condition = array(
908 - 'ID' => array(
909 - 'condition' => '=',
910 - 'value' => $dataset_id,
911 - 'type' => '%d'
912 - ),
913 - 'extension' => array(
914 - 'condition' => '=',
915 - 'value' => 'divi',
916 - 'type' => '%s'
917 - ),
918 - 'item' => array(
919 - 'condition' => '=',
920 - 'value' => $item_id,
921 - 'type' => '%s'
922 - ),
923 - );
924 -
925 - $helper_e2pdf_db = new Helper_E2pdf_Db();
926 - $where = $helper_e2pdf_db->prepare_where($condition);
927 - $dataset = $wpdb->get_row($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . 'e2pdf_datasets' . $where['sql'] . "", $where['filter']));
928 -
929 - if ($dataset) {
930 - return true;
931 - }
945 + if ($this->get('cached_entry')) {
946 + return true;
932 947 }
933 948 return false;
934 949 }
935 950
936 - /**
937 - * Visual Mapper for Mapping field
938 - *
939 - * @return bool|string - Prepared form or false
940 - */
951 + // visual mapper
941 952 public function visual_mapper() {
953 +
954 + $source = '';
955 + $html = '';
956 +
942 957 if ($this->get('item')) {
943 - $post = $this->get_post($this->get('item'));
958 + $post = $this->get_form($this->get('item'));
944 959 if ($post && isset($post->post_content)) {
945 -
946 960 $content = $post->post_content;
947 961
948 - if (false !== strpos($content, '[')) {
949 - $shortcode_tags = array(
962 + if ($this->divi4_form($content)) {
963 + $shortcode_tags = [
950 964 'et_pb_contact_form',
951 - );
952 -
965 + ];
953 966 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
954 967 $tagnames = array_intersect($shortcode_tags, $matches[1]);
955 -
956 -
957 -
958 968 if (!empty($tagnames)) {
959 - $pattern = get_shortcode_regex($tagnames);
960 -
961 - preg_match_all("/$pattern/", $content, $shortcodes);
962 -
969 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
963 970 foreach ($shortcodes[0] as $key => $shortcode_value) {
964 -
965 - $shortcode = array();
966 - $shortcode[1] = $shortcodes[1][$key];
967 - $shortcode[2] = $shortcodes[2][$key];
968 - $shortcode[3] = $shortcodes[3][$key];
969 - $shortcode[4] = $shortcodes[4][$key];
970 - $shortcode[5] = $shortcodes[5][$key];
971 - $shortcode[6] = $shortcodes[6][$key];
972 -
973 -
971 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
974 972 $atts = shortcode_parse_atts($shortcode[3]);
975 973 if (isset($atts['admin_label']) && $atts['admin_label'] == $this->get('item')) {
976 -
977 - require_once(ET_BUILDER_DIR . 'class-et-builder-element.php');
978 - require_once(ET_BUILDER_DIR . 'functions.php');
979 - require_once(ET_BUILDER_DIR . 'ab-testing.php');
980 - require_once(ET_BUILDER_DIR . 'class-et-global-settings.php');
981 - require_once(ET_BUILDER_DIR . 'module/ContactForm.php');
982 - require_once(ET_BUILDER_DIR . 'module/ContactFormItem.php');
983 -
984 - new ET_Builder_Module_Contact_Form();
985 - new ET_Builder_Module_Contact_Form_Item();
986 -
974 + $this->divi4_load();
987 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 + }
988 989
989 - libxml_use_internal_errors(true);
990 - $dom = new DOMDocument;
991 - $html = $dom->loadHTML($source);
992 - 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);
993 1001
994 - if (!$html) {
995 - return __('Form could not be parsed due incorrect HTML', 'e2pdf');
996 - } 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 + }
997 1014
998 - $xpath = new DomXPath($dom);
999 - // Replace names
1000 - $fields = $xpath->query("//*[contains(@name, 'et_pb_contact_')]");
1001 - foreach ($fields as $element) {
1002 - $element->attributes->getNamedItem("name")->nodeValue = "%%" . $element->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
1003 - }
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 + }
1004 1020
1005 - $checkboxes = $xpath->query("//*[contains(@class, 'et_pb_contact_field') and @data-type='checkbox']");
1006 - 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 + }
1007 1035
1008 - $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 + }
1009 1041
1010 - $name = "";
1011 - if ($check_handler) {
1012 - $name = "%%" . $check_handler->attributes->getNamedItem("data-original_id")->nodeValue . "%%";
1013 - }
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 + }
1014 1046
1015 - $checks = $xpath->query(".//input[@type='checkbox']", $element);
1016 - foreach ($checks as $check) {
1017 - $attr = $dom->createAttribute('name');
1018 - $attr->value = $name;
1019 - $check->appendChild($attr);
1020 - }
1021 - }
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 + }
1022 1051
1023 - $remove_by_class = array(
1024 - 'et_pb_contact_submit',
1025 - 'et_pb_contactform_validate_field'
1026 - );
1027 - foreach ($remove_by_class as $key => $class) {
1028 - $elements = $xpath->query("//*[contains(@class, '{$class}')]");
1029 - foreach ($elements as $element) {
1030 - $element->parentNode->removeChild($element);
1031 - }
1032 - }
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 + }
1033 1066
1067 + $xml_elements = $xpath->query('//*[@data-step]');
1068 + foreach ($xml_elements as $xml_element) {
1069 + $xml_element->removeAttribute('style');
1070 + }
1034 1071
1035 - $remove_parent_by_class = array(
1036 - 'et_pb_contact_captcha_question'
1037 - );
1038 - foreach ($remove_parent_by_class as $key => $class) {
1039 - $elements = $xpath->query("//*[contains(@class, '{$class}')]/parent::*");
1040 - foreach ($elements as $element) {
1041 - $element->parentNode->removeChild($element);
1042 - }
1043 - }
1044 -
1045 -
1046 - if ($xpath->query("//form")->item(0)) {
1047 - $autocomplete = $dom->createAttribute('autocomplete');
1048 - $autocomplete->value = 'off';
1049 - $xpath->query("//form")->item(0)->appendChild($autocomplete);
1050 - }
1051 - }
1052 -
1053 - return $dom->saveHTML();
1054 - }
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);
1055 1080 }
1056 1081 }
1057 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 + }
1058 1089 }
1059 1090 }
1060 1091
1061 1092 return false;
@@ -1060,387 +1091,1070 @@
1060 1091
1061 1092 return false;
1062 1093 }
1063 1094
1064 - /**
1065 - * Overwrite shortcodes
1066 - */
1067 - public function action_overwrite_shortcodes() {
1068 - remove_shortcode('et_pb_contact_form');
1069 - add_shortcode('et_pb_contact_form', array($this, 'shortcode_et_pb_contact_form'));
1070 - }
1095 + // filter mail
1096 + public function filter_wp_mail($args) {
1071 1097
1072 - public function filter_wp_mail($args) {
1098 + if (!$this->get('process')) {
1099 + return $args;
1100 + }
1073 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 +
1074 1106 if (isset($args['message'])) {
1075 1107 if (false !== strpos($args['message'], '[')) {
1076 - $shortcode_tags = array(
1108 + $shortcode_tags = [
1077 1109 'e2pdf-download',
1110 + 'e2pdf-save',
1078 1111 'e2pdf-attachment',
1079 - 'e2pdf-save'
1080 - );
1081 -
1112 + 'e2pdf-adobesign',
1113 + 'e2pdf-zapier',
1114 + ];
1082 1115 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $args['message'], $matches);
1083 1116 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1084 -
1085 1117 if (!empty($tagnames)) {
1086 - $pattern = get_shortcode_regex($tagnames);
1087 -
1088 - preg_match_all("/$pattern/", $args['message'], $shortcodes);
1089 -
1118 + preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $args['message'], $shortcodes);
1090 1119 foreach ($shortcodes[0] as $key => $shortcode_value) {
1091 - $extension = false;
1092 - $item = false;
1093 -
1094 - $shortcode = array();
1095 - $shortcode[1] = $shortcodes[1][$key];
1096 - $shortcode[2] = $shortcodes[2][$key];
1097 - $shortcode[3] = $shortcodes[3][$key];
1098 - $shortcode[4] = $shortcodes[4][$key];
1099 - $shortcode[5] = $shortcodes[5][$key];
1100 - $shortcode[6] = $shortcodes[6][$key];
1101 -
1120 + $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
1102 1121 $atts = shortcode_parse_atts($shortcode[3]);
1103 -
1104 - if (array_key_exists('id', $atts)) {
1105 - $template = new Model_E2pdf_Template();
1106 - $template->load($atts['id']);
1107 - if ($template->get('extension') === 'divi') {
1108 - $extension = $template->get('extension');
1109 - $item = $template->get('item');
1110 - if (array_key_exists('dataset', $atts)) {
1111 - $shortcode[3] .= " apply='true'";
1112 - if ($shortcode[2] === 'e2pdf-download') {
1113 - $args['headers'][] = 'Content-Type: text/html; charset=UTF-8';
1114 - $args['message'] = str_replace($shortcode_value, do_shortcode_tag($shortcode), $args['message']);
1115 - $args['message'] = str_replace("\r\n", "<br/>", $args['message']);
1116 - } elseif ($shortcode[2] === 'e2pdf-attachment') {
1117 - $file = do_shortcode_tag($shortcode);
1118 - if ($file) {
1119 - $this->helper->add('divi_attachments', $file);
1120 - $args['attachments'][] = $file;
1121 - }
1122 - $args['message'] = str_replace($shortcode_value, '', $args['message']);
1123 - } elseif ($shortcode[2] === 'e2pdf-save') {
1124 - do_shortcode_tag($shortcode);
1125 - $args['message'] = str_replace($shortcode_value, '', $args['message']);
1122 + if (!isset($atts['apply'])) {
1123 + $shortcode[3] .= ' apply="true"';
1124 + }
1125 + if (!isset($atts['filter'])) {
1126 + $shortcode[3] .= ' filter="true"';
1127 + }
1128 + $file = false;
1129 + if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) {
1130 + $file = do_shortcode_tag($shortcode);
1131 + if ($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);
1126 1140 }
1127 1141 } else {
1128 - $args['message'] = str_replace($shortcode_value, '', $args['message']);
1142 + $this->helper->add('divi_attachments', $file);
1129 1143 }
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 + }
1130 1151 }
1152 + $args['message'] = str_replace($shortcode_value, '', $args['message']);
1153 + } else {
1154 + if (is_array($args['headers']) && !in_array('Content-Type: text/html; charset=UTF-8', $args['headers'])) {
1155 + $args['headers'][] = 'Content-Type: text/html; charset=UTF-8';
1156 + }
1157 + $args['message'] = str_replace($shortcode_value, do_shortcode_tag($shortcode), $args['message']);
1158 + $args['message'] = str_replace("\r\n", '<br/>', $args['message']);
1131 1159 }
1132 1160 }
1133 1161 }
1134 1162 }
1135 1163 }
1136 -
1137 - $wp_mail = array(
1164 + $wp_mail = [
1138 1165 'to' => $args['to'],
1139 1166 'subject' => $args['subject'],
1140 1167 'message' => $args['message'],
1141 1168 'headers' => $args['headers'],
1142 1169 'attachments' => $args['attachments'],
1143 - );
1170 + ];
1171 + return $wp_mail;
1172 + }
1144 1173
1145 - 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 + }
1146 1182 }
1147 1183
1148 - /**
1149 - * Load actions for this extension
1150 - */
1151 - public function load_actions() {
1152 - 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);
1153 1187 }
1154 1188
1155 - public function shortcode_et_pb_contact_form($shortcode_atts, $content = null, $function_name, $parent_address = '', $global_parent = '', $global_parent_type = '') {
1156 - 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 + }
1157 1194
1158 - 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);
1159 1204
1160 - $et_pb_contact = new ET_Builder_Module_Contact_Form();
1205 + // Divi 5
1206 + add_filter('divi_module_library_register_module_attrs', [$this, 'filter_divi_module_library_register_module_attrs'], 11, 2);
1207 + }
1161 1208
1162 - if (isset($_POST['_wpnonce-et-pb-contact-form-submitted'])) {
1209 + public function filter_divi_module_library_register_module_attrs($module_attrs, $filter_args) {
1163 1210
1164 - $et_pb_contact_form_num = 0;
1211 + if ('divi/contact-form' !== $filter_args['name']) {
1212 + return $module_attrs;
1213 + }
1165 1214
1166 - $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;
1215 + if (!isset($_SERVER['REQUEST_METHOD']) || 'POST' !== $_SERVER['REQUEST_METHOD']) {
1216 + return $module_attrs;
1217 + }
1167 1218
1168 - 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])) {
1169 - if ('' !== $current_form_fields) {
1170 - $fields_data_json = str_replace('\\', '', $current_form_fields);
1171 - $fields_data_array = json_decode($fields_data_json, true);
1219 + $module_id = !empty($filter_args['id']) ? $filter_args['id'] : '';
1220 + $store_instance = !empty($filter_args['storeInstance']) ? $filter_args['storeInstance'] : 0;
1172 1221
1173 - // check whether captcha field is not empty
1174 - 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]) )) {
1175 - $et_error_message .= sprintf('<p class="et_pb_contact_error_text">%1$s</p>', esc_html__('Make sure you entered the captcha.', 'et_builder'));
1176 - $et_contact_error = true;
1177 - }
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 + }
1178 1228
1179 - // check all fields on current form and generate error message if needed
1180 - if (!empty($fields_data_array)) {
1181 - foreach ($fields_data_array as $index => $value) {
1182 - // check all the required fields, generate error message if required field is empty
1183 - if ('required' === $value['required_mark'] && empty($_POST[$value['field_id']])) {
1184 - $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'));
1185 - $et_contact_error = true;
1186 - continue;
1187 - }
1229 + $module = \ET\Builder\FrontEnd\BlockParser\BlockParserStore::get($module_id, $store_instance);
1188 1230
1189 - // additional check for email field
1190 - if ('email' === $value['field_type'] && 'required' === $value['required_mark'] && !empty($_POST[$value['field_id']])) {
1191 - $contact_email = sanitize_email($_POST[$value['field_id']]);
1192 - if (!is_email($contact_email)) {
1193 - $et_error_message .= sprintf('<p class="et_pb_contact_error_text">%1$s</p>', esc_html__('Invalid Email.', 'et_builder'));
1194 - $et_contact_error = true;
1195 - }
1196 - }
1231 + if (!$module) {
1232 + return $module_attrs;
1233 + }
1197 1234
1198 - // prepare the array of processed field values in convenient format
1199 - if (false === $et_contact_error) {
1200 - $processed_fields_values[$value['original_id']]['value'] = isset($_POST[$value['field_id']]) ? $_POST[$value['field_id']] : '';
1201 - $processed_fields_values[$value['original_id']]['label'] = $value['field_label'];
1202 - }
1203 - }
1204 - }
1205 - } else {
1206 - $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'));
1207 - $et_contact_error = true;
1208 - }
1235 + if (
1236 + !class_exists('\ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormUtils') ||
1237 + !method_exists('\ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormUtils', 'get_unique_id') ||
1238 + !class_exists('\ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormHandler') ||
1239 + !class_exists('\ET\Builder\Packages\ModuleLibrary\ContactField\ContactFieldModule') ||
1240 + !method_exists('\ET\Builder\Packages\ModuleLibrary\ContactField\ContactFieldModule', 'get_field_unique_id')
1241 + ) {
1242 + return $module_attrs;
1243 + }
1244 +
1245 + $unique_id = \ET\Builder\Packages\ModuleLibrary\ContactForm\ContactFormUtils::get_unique_id($module_attrs, (array) $module);
1246 +
1247 + $submitted = isset($_POST['_wpnonce-et-pb-contact-form-submitted-' . $unique_id]);
1248 + if (!$submitted) {
1249 + return $module_attrs;
1250 + }
1251 +
1252 + if (!wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['_wpnonce-et-pb-contact-form-submitted-' . $unique_id])), 'et-pb-contact-form-submit-' . $unique_id)) {
1253 + return $module_attrs;
1254 + }
1255 +
1256 + $use_basic_captcha = $module_attrs['module']['advanced']['spamProtection']['desktop']['value']['useBasicCaptcha'] ?? 'on';
1257 + $use_spam_service = $module_attrs['module']['advanced']['spamProtection']['desktop']['value']['enabled'] ?? 'off';
1258 +
1259 + if ('on' === $use_basic_captcha && 'off' === $use_spam_service) {
1260 + $captcha_answer = sanitize_text_field(wp_unslash($_POST['et_pb_contact_captcha_' . $unique_id] ?? ''));
1261 + $first_digit = sanitize_text_field(wp_unslash($_POST['et_pb_contact_captcha_first_digit_' . $unique_id] ?? ''));
1262 + $second_digit = sanitize_text_field(wp_unslash($_POST['et_pb_contact_captcha_second_digit_' . $unique_id] ?? ''));
1263 +
1264 + if (!$captcha_answer || ((int) $first_digit + (int) $second_digit) !== (int) $captcha_answer) {
1265 + return $module_attrs;
1266 + }
1267 + } elseif ('on' === $use_spam_service) {
1268 + $provider = $module_attrs['module']['advanced']['spamProtection']['desktop']['value']['provider'] ?? 'recaptcha';
1269 + $account = $module_attrs['module']['advanced']['spamProtection']['desktop']['value']['account'] ?? '';
1270 + $min_score = (float) ($module_attrs['module']['advanced']['spamProtection']['desktop']['value']['minScore'] ?? 0.0);
1271 +
1272 + if (empty($_POST['token']) || !SpamProtectionService::validate_token($provider, $account, $min_score)) {
1273 + return $module_attrs;
1274 + }
1275 + }
1276 +
1277 + $messages = [
1278 + 'successMessage' => isset($module_attrs['module']['advanced']['successMessage']['desktop']['value']) ? $module_attrs['module']['advanced']['successMessage']['desktop']['value'] : '',
1279 + ];
1280 + if (defined('KS_PAC_DCFH_PLUGIN_FILE')) {
1281 + $send_admin_email = isset($module_attrs['adminEmail']['advanced']['adminEmailEnabled']['desktop']['value']) ? $module_attrs['adminEmail']['advanced']['adminEmailEnabled']['desktop']['value'] : 'on';
1282 + if ($send_admin_email === 'on') {
1283 + $admin_email_rich_text = isset($module_attrs['adminEmail']['advanced']['emailRichTextEnabled']['desktop']['value']) ? $module_attrs['adminEmail']['advanced']['emailRichTextEnabled']['desktop']['value'] : 'off';
1284 + if ($admin_email_rich_text === 'on') {
1285 + $messages['adminEmailRichTextMessage'] = isset($module_attrs['adminEmail']['innerContent']['emailRichTextMessage']['desktop']['value']) ? $this->decode_shortcodes($module_attrs['adminEmail']['innerContent']['emailRichTextMessage']['desktop']['value']) : '';
1209 1286 } else {
1210 - 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])) {
1211 - $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'));
1212 - }
1213 - $et_contact_error = true;
1287 + $messages['email'] = isset($module_attrs['email']['innerContent']['desktop']['value']) ? $module_attrs['email']['innerContent']['desktop']['value'] : '';
1214 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 + }
1215 1302
1216 - if (!$et_contact_error && $nonce_result) {
1217 - if (isset($shortcode_atts['success_message'])) {
1218 - $shortcode_atts['success_message'] = str_replace(array('%91', '%93', '%22'), array('[', ']', '"'), $shortcode_atts['success_message']);
1219 - 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 + }
1220 1324
1221 - $shortcode_tags = array(
1222 - 'e2pdf-download',
1223 - 'e2pdf-save',
1224 - 'e2pdf-view'
1225 - );
1325 + $_POST = $this->sanitize($_POST);
1226 1326
1227 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $shortcode_atts['success_message'], $matches);
1228 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
1327 + if (!$this->get('process')) {
1328 + return $module_attrs;
1329 + }
1229 1330
1230 - if (!empty($tagnames)) {
1231 - $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 + }
1232 1336
1233 - 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 + );
1234 1365
1235 - 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'] ?? '';
1236 1373
1237 - $extension = false;
1238 - $item = false;
1374 + if (!$field_label) {
1375 + $field_label = __('New Field', 'et_builder_5');
1376 + }
1239 1377
1240 - $shortcode = array();
1241 - $shortcode[1] = $shortcodes[1][$key];
1242 - $shortcode[2] = $shortcodes[2][$key];
1243 - $shortcode[3] = $shortcodes[3][$key];
1244 - $shortcode[4] = $shortcodes[4][$key];
1245 - $shortcode[5] = $shortcodes[5][$key];
1246 - $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');
1247 1385
1248 - $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 + ];
1249 1391
1250 - if (array_key_exists('id', $atts)) {
1251 - $template = new Model_E2pdf_Template();
1252 - $template->load($atts['id']);
1253 - if ($template->get('extension') === 'divi') {
1254 - $extension = $template->get('extension');
1255 - $item = $template->get('item');
1256 - }
1257 - }
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.
1258 1397
1259 - if ($item && isset($shortcode_atts['admin_label']) && $shortcode_atts['admin_label'] == $item && $extension) {
1260 - if (!array_key_exists('dataset', $atts)) {
1261 - $serialized = serialize($_POST);
1262 - $dataset = array(
1263 - 'extension' => 'divi',
1264 - 'item' => $item,
1265 - 'entry' => $serialized
1266 - );
1267 - $wpdb->insert($wpdb->prefix . 'e2pdf_datasets', $dataset);
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 + }
1268 1411
1269 - $dataset_id = $wpdb->insert_id;
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 + }
1270 1445
1271 - $atts['dataset'] = $dataset_id;
1272 - $shortcode[3] .= " dataset='{$dataset_id}' apply='true'";
1273 - $shortcode_atts['success_message'] = str_replace($shortcode_value, do_shortcode_tag($shortcode), $shortcode_atts['success_message']);
1274 - }
1275 - } elseif ($shortcode[2] === 'e2pdf-view') {
1276 - $shortcode_atts['success_message'] = str_replace($shortcode_value, do_shortcode_tag($shortcode), $shortcode_atts['success_message']);
1277 - }
1278 - }
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 . '"';
1279 1534 }
1280 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 + }
1281 1557 }
1558 + }
1559 + }
1560 + }
1282 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 + }
1283 1585
1284 - 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) {
1285 1588
1286 - $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 + }
1287 1592
1288 - if (false !== strpos($shortcode_atts['custom_message'], '[')) {
1289 - $shortcode_tags = array(
1290 - 'e2pdf-download',
1291 - 'e2pdf-attachment',
1292 - 'e2pdf-save'
1293 - );
1593 + $et_contact_proccess = array_search('et_contact_proccess', (array) $_POST);
1594 + if ($et_contact_proccess === false) {
1595 + return $props;
1596 + }
1294 1597
1295 - preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $shortcode_atts['custom_message'], $matches);
1296 - $tagnames = array_intersect($shortcode_tags, $matches[1]);
1598 + $success_message = isset($props['success_message']) ? $this->decode_shortcodes($props['success_message'], true) : '';
1297 1599
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 + }
1298 1616
1299 - if (!empty($tagnames)) {
1300 - $pattern = get_shortcode_regex($tagnames);
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 + }
1301 1639
1302 - preg_match_all("/$pattern/", $shortcode_atts['custom_message'], $shortcodes);
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 + }
1303 1663
1304 - add_filter('wp_mail', array($this, 'filter_wp_mail'), 10, 2);
1664 + $_POST = $this->sanitize($_POST);
1305 1665
1306 - foreach ($shortcodes[0] as $key => $shortcode_value) {
1666 + // check if E2Pdf shortcodes exist in messages
1667 + if (!$this->get('process')) {
1668 + return $props;
1669 + }
1307 1670
1308 - $extension = false;
1309 - $item = false;
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 + }
1310 1689
1311 - $shortcode = array();
1312 - $shortcode[1] = $shortcodes[1][$key];
1313 - $shortcode[2] = $shortcodes[2][$key];
1314 - $shortcode[3] = $shortcodes[3][$key];
1315 - $shortcode[4] = $shortcodes[4][$key];
1316 - $shortcode[5] = $shortcodes[5][$key];
1317 - $shortcode[6] = $shortcodes[6][$key];
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;
1318 1697
1319 - $atts = shortcode_parse_atts($shortcode[3]);
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);
1320 1702
1321 - if (array_key_exists('id', $atts)) {
1322 - $template = new Model_E2pdf_Template();
1323 - $template->load($atts['id']);
1324 - if ($template->get('extension') === 'divi') {
1325 - $extension = $template->get('extension');
1326 - $item = $template->get('item');
1327 - }
1328 - }
1703 + // check whether captcha field is not empty
1704 + if ('on' === $captcha && 'off' === $use_spam_service && (!isset($data['et_pb_contact_captcha_' . $et_pb_contact_form_num]) || empty($data['et_pb_contact_captcha_' . $et_pb_contact_form_num]))) {
1705 + $et_contact_error = true;
1706 + } elseif ('on' === $use_spam_service) {
1707 + if (class_exists('ET_Builder_Element')) {
1708 + $contact_form = ET_Builder_Element::get_module('et_pb_contact_form');
1709 + if ($contact_form && is_object($contact_form) && method_exists($contact_form, 'is_spam_submission')) {
1710 + $contact_form->props = $props;
1711 + if ($contact_form->is_spam_submission()) {
1712 + if (!empty($_POST['token'])) {
1713 + unset($_POST['token']);
1714 + }
1715 + $et_contact_error = true;
1716 + } else {
1717 + $props['use_spam_service'] = 'off';
1718 + $props['captcha'] = 'off';
1719 + }
1720 + }
1721 + }
1722 + }
1329 1723
1330 - if ($item && isset($shortcode_atts['admin_label']) && $shortcode_atts['admin_label'] == $item && $extension) {
1331 - if (!array_key_exists('dataset', $atts)) {
1332 - if (!$dataset_id) {
1333 - $serialized = serialize($_POST);
1334 - $dataset = array(
1335 - 'extension' => 'divi',
1336 - 'item' => $item,
1337 - 'entry' => $serialized
1338 - );
1339 - $wpdb->insert($wpdb->prefix . 'e2pdf_datasets', $dataset);
1340 - $dataset_id = $wpdb->insert_id;
1341 - }
1724 + // check all fields on current form and generate error message if needed
1725 + if (!empty($fields_data_array)) {
1726 + foreach ($fields_data_array as $value) {
1727 + if (isset($value['field_id']) && 'et_pb_contact_et_number_' . $et_pb_contact_form_num === $value['field_id']) {
1728 + continue;
1729 + }
1730 + /* Check all the required fields, generate error message if required field is empty */
1731 + $field_value = isset($data[$value['field_id']]) ? trim($data[$value['field_id']]) : '';
1732 + if ('required' === $value['required_mark'] && empty($field_value) && !is_numeric($field_value)) {
1733 + $et_contact_error = true;
1734 + continue;
1735 + }
1736 + /* Additional check for email field */
1737 + if ('email' === $value['field_type'] && 'required' === $value['required_mark'] && !empty($field_value)) {
1738 + $contact_email = isset($data[$value['field_id']]) ? sanitize_email($data[$value['field_id']]) : '';
1739 + if (!empty($contact_email) && !is_email($contact_email)) {
1740 + $et_contact_error = true;
1741 + }
1742 + }
1743 + }
1744 + }
1745 + } else {
1746 + $et_contact_error = true;
1747 + }
1748 + } else {
1749 + $et_contact_error = true;
1750 + }
1342 1751
1343 - $atts['dataset'] = $dataset_id;
1344 - $shortcode[3] .= " dataset='{$dataset_id}'";
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);
1345 1762
1346 - $new_shortcode = "[" . $shortcode[2] . $shortcode[3] . "]";
1347 - $shortcode_atts['custom_message'] = str_replace($shortcode_value, $new_shortcode, $shortcode_atts['custom_message']);
1348 - }
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();
1349 1793 }
1794 + $atts['dataset'] = $dataset;
1795 + $shortcode[3] .= ' dataset="' . $dataset . '"';
1350 1796 }
1351 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']);
1352 1805 }
1353 1806 }
1354 1807 }
1355 1808 }
1356 1809
1357 - $output = $et_pb_contact->_shortcode_callback($shortcode_atts, $content, $function_name, $parent_address, $global_parent, $global_parent_type);
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 + }
1852 + }
1853 + }
1358 1854
1359 - remove_filter('wp_mail', array($this, 'filter_wp_mail'), 10, 2);
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 + }
1903 + }
1360 1904
1361 - $files = $this->helper->get('divi_attachments');
1362 - if (is_array($files) && !empty($files)) {
1363 - foreach ($files as $key => $file) {
1364 - $this->helper->delete_dir(dirname($file) . '/');
1905 + return $props;
1906 + }
1907 +
1908 + // filter shortcode output
1909 + public function filter_et_module_shortcode_output($output, $render_slug, $form) {
1910 +
1911 + if ($render_slug !== 'et_pb_contact_form') {
1912 + return $output;
1913 + }
1914 +
1915 + $et_contact_proccess = array_search('et_contact_proccess', (array) $_POST);
1916 + if ($et_contact_proccess === false) {
1917 + return $output;
1918 + }
1919 +
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 + }
1365 1949 }
1366 - $this->helper->deset('divi_attachments');
1367 1950 }
1368 -
1369 - return html_entity_decode($output, ENT_QUOTES);
1370 1951 }
1952 + return $output;
1371 1953 }
1372 1954
1373 - /**
1374 - * Delete dataset for template
1375 - *
1376 - * @param int $template_id - Template ID
1377 - * @param int $dataset_id - Dataset ID
1378 - *
1379 - * @return bool - Result of removing items
1380 - */
1381 - public function delete_item($template_id = false, $dataset_id = false) {
1955 + // delete item
1956 + public function delete_item($template_id = false, $dataset = false) {
1382 1957 global $wpdb;
1383 -
1384 1958 $template = new Model_E2pdf_Template();
1385 - if ($template_id && $dataset_id && $template->load($template_id)) {
1386 - $extension = new Model_E2pdf_Extension();
1387 - if ($template->get('extension') === 'divi' && $extension->load($template->get('extension'))) {
1388 -
1389 - $item_id = $template->get('item');
1390 -
1391 - $where = array(
1392 - 'ID' => $dataset_id,
1393 - 'item' => $item_id,
1394 - 'extension' => 'divi'
1395 - );
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 + ];
1396 1967 $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1397 1968 return true;
1398 1969 }
1399 1970 }
1400 -
1401 1971 return false;
1402 1972 }
1403 1973
1404 - /**
1405 - * Delete all datasets for Template
1406 - *
1407 - * @param int $template_id - Template ID
1408 - *
1409 - * @return bool - Result of removing items
1410 - */
1974 + // delete items
1411 1975 public function delete_items($template_id = false) {
1412 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 + }
1413 1990
1414 - $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 + }
1415 2013
1416 - if ($template_id && $template->load($template_id)) {
1417 - $extension = new Model_E2pdf_Extension();
1418 - 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);
1419 2018
1420 - $item_id = $template->get('item');
2019 + // Replace the server root with the Site URL
2020 + return str_replace($root, site_url('/'), $path);
2021 + }
1421 2022
1422 - $where = array(
1423 - 'item' => $item_id,
1424 - 'extension' => 'divi'
1425 - );
1426 - $wpdb->delete($wpdb->prefix . 'e2pdf_datasets', $where);
1427 - 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);
1428 2028 }
2029 + return $value;
1429 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 + }
1430 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 + }
1431 2094 return false;
1432 2095 }
1433 2096
1434 - /**
1435 - * Get styles for generating Map Field function
1436 - *
1437 - * @return array - List of css files to load
1438 - */
1439 - public function get_styles() {
1440 - $styles = array(
1441 - 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 . '/'
1442 2125 );
1443 - 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;
1444 2159 }
1445 -
1446 2160 }