PluginProbe
E2Pdf – Export Pdf Tool for WordPress / 1.32.55
E2Pdf – Export Pdf Tool for WordPress v1.32.55
1.32.55 1.32.56 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 All 76 releases
e2pdf / classes / extension / e2pdf-formidable.php

e2pdf-formidable.php in E2Pdf – Export Pdf Tool for WordPress 1.32.55, at classes/extension/e2pdf-formidable.php

4,303 lines 209.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * E2Pdf Formidable Extension
5 * @copyright Copyright 2017 https://e2pdf.com
6 * @license GPLv3
7 * @version 1
8 * @link https://e2pdf.com
9 * @since 0.00.01
10 */
11 if (!defined('ABSPATH')) {
12 die('Access denied.');
13 }
14
15 class Extension_E2pdf_Formidable extends Model_E2pdf_Model {
16
17 private $options;
18 private $info = array(
19 'key' => 'formidable',
20 'title' => 'Formidable Forms',
21 );
22
23 /**
24 * Get info about extension
25 * @param string $key - Key to get assigned extension info value
26 * @return array|string - Extension Key and Title or Assigned extension info value
27 */
28 public function info($key = false) {
29 if ($key && isset($this->info[$key])) {
30 return $this->info[$key];
31 } else {
32 return array(
33 $this->info['key'] => $this->info['title'],
34 );
35 }
36 }
37
38 /**
39 * Check if needed plugin active
40 * @return bool - Activated/Not Activated plugin
41 */
42 public function active() {
43 if (defined('E2PDF_FORMIDABLE_EXTENSION') || $this->helper->load('extension')->is_plugin_active('formidable/formidable.php')) {
44 return true;
45 }
46 return false;
47 }
48
49 /**
50 * Set option
51 * @param string $key - Key of option
52 * @param string $value - Value of option
53 * @return bool - Status of setting option
54 */
55 public function set($key, $value) {
56 if (!isset($this->options)) {
57 $this->options = new stdClass();
58 }
59 $this->options->$key = $value;
60 switch ($key) {
61 case 'item':
62 $this->set('cached_form', false);
63 if ($this->get('item') && $this->get('item') != '-2' && class_exists('FrmForm')) {
64 $form = FrmForm::getOne($this->get('item'));
65 if (isset($form->id)) {
66 $this->set('cached_form', $form);
67 }
68 }
69 break;
70 case 'item1':
71 $this->set('cached_form', false);
72 if ($this->get('item1') && class_exists('FrmForm')) {
73 $form = FrmForm::getOne($this->get('item1'));
74 if (isset($form->id)) {
75 $this->set('cached_form', $form);
76 }
77 }
78 break;
79 case 'item2':
80 $this->set('cached_form2', false);
81 if ($this->get('item2') && class_exists('FrmForm')) {
82 $form = FrmForm::getOne($this->get('item2'));
83 if (isset($form->id)) {
84 $this->set('cached_form2', $form);
85 }
86 }
87 break;
88 case 'dataset':
89 $this->set('cached_entry', false);
90 if ($this->get('cached_form') && $this->get('dataset') && class_exists('FrmEntry')) {
91 if (substr($this->get('dataset'), 0, 4) === 'tmp_') {
92 $this->set('cached_entry', get_transient('e2pdf_' . $this->get('dataset')));
93 } else {
94 $entry = FrmEntry::getOne($this->get('dataset'));
95 if ($entry && isset($entry->form_id) && $entry->form_id == $this->get('cached_form')->id) {
96 if (!empty($entry->parent_item_id)) {
97 $parent_entry = FrmEntry::getOne($entry->parent_item_id);
98 if ($parent_entry && isset($parent_entry->form_id)) {
99 $entry->parent_entry = $parent_entry;
100 }
101 }
102 $this->set('cached_entry', $entry);
103 }
104 }
105 }
106 break;
107 case 'dataset2':
108 if ($this->get('cached_form2') && $this->get('dataset2') && class_exists('FrmEntry')) {
109 $entry = FrmEntry::getOne($this->get('dataset2'));
110 if ($entry && isset($entry->form_id) && $entry->form_id == $this->get('cached_form2')->id) {
111 if (!empty($entry->parent_item_id)) {
112 $parent_entry = FrmEntry::getOne($entry->parent_item_id);
113 if ($parent_entry && isset($parent_entry->form_id)) {
114 $entry->parent_entry = $parent_entry;
115 }
116 }
117 $this->set('cached_entry2', $entry);
118 }
119 }
120 break;
121 default:
122 break;
123 }
124 return true;
125 }
126
127 /**
128 * Get option by key
129 * @param string $key - Key to get assigned option value
130 * @return mixed
131 */
132 public function get($key) {
133 if (isset($this->options->$key)) {
134 $value = $this->options->$key;
135 } else {
136 switch ($key) {
137 case 'args':
138 $value = array();
139 break;
140 default:
141 $value = false;
142 break;
143 }
144 }
145 return $value;
146 }
147
148 /**
149 * Get items to work with
150 * @return array() - List of available items
151 */
152 public function items() {
153 $items = array();
154 if (class_exists('FrmForm')) {
155 $where = array(
156 'is_template' => 0,
157 'status' => 'published',
158 );
159 $forms = FrmForm::getAll($where, 'name');
160 if ($forms) {
161 foreach ($forms as $key => $form) {
162 $items[] = $this->item($form->id);
163 }
164 }
165 }
166 return $items;
167 }
168
169 /**
170 * Get entries for export
171 * @param int $item - Form ID
172 * @param string $name - Entries names
173 * @return array() - Entries list
174 */
175 public function datasets($item_id = false, $name = false) {
176 $item_id = (int) $item_id;
177 $datasets = array();
178 if (class_exists('FrmEntry') && $item_id) {
179 $where = array(
180 'it.form_id' => $item_id,
181 );
182 $entries = FrmEntry::getAll($where, ' ORDER BY id DESC');
183 if ($entries) {
184 $this->set('item', $item_id);
185 if (class_exists('FrmFieldsHelper') && class_exists('FrmFormsController') && method_exists('FrmFormsController', 'replace_form_name_shortcodes')) {
186 $this->set('cached_shortcodes', FrmFieldsHelper::get_shortcodes($name, $item_id));
187 }
188 foreach ($entries as $key => $entry) {
189 $this->set('dataset', $entry->id);
190 $entry_title = $this->render($name);
191 if (!$entry_title) {
192 $entry_title = $entry->item_key;
193 }
194 $datasets[] = array(
195 'key' => $entry->id,
196 'value' => $entry_title,
197 );
198 }
199 $this->set('cached_shortcodes', false);
200 }
201 }
202 return $datasets;
203 }
204
205 /**
206 * Get Dataset Actions
207 * @param int $dataset_id - Dataset ID
208 * @return object
209 */
210 public function get_dataset_actions($dataset_id = false) {
211 $dataset_id = (int) $dataset_id;
212 if (!$dataset_id) {
213 return false;
214 }
215 $actions = new stdClass();
216 $actions->view = $this->helper->get_url(
217 array(
218 'page' => 'formidable-entries',
219 'frm_action' => 'show',
220 'id' => $dataset_id,
221 )
222 );
223 $actions->delete = false;
224 return $actions;
225 }
226
227 /**
228 * Get Template Actions
229 * @param int $template - Template ID
230 * @return object
231 */
232 public function get_template_actions($template = false) {
233 $template = (int) $template;
234 if (!$template) {
235 return;
236 }
237 $actions = new stdClass();
238 $actions->delete = false;
239 return $actions;
240 }
241
242 /**
243 * Get item
244 * @param int $item_id - Item ID
245 * @return object - Item
246 */
247 public function item($item_id = false) {
248 $item_id = (int) $item_id;
249 if (!$item_id && $this->get('item')) {
250 $item_id = $this->get('item');
251 }
252 $form = false;
253 if (class_exists('FrmForm')) {
254 $form = FrmForm::getOne($item_id);
255 }
256 $item = new stdClass();
257 if ($form) {
258 $item->id = (string) $item_id;
259 $item->url = $this->helper->get_url(
260 array(
261 'page' => 'formidable',
262 'frm_action' => 'edit',
263 'id' => $item_id,
264 )
265 );
266 $item->name = esc_html('' === $form->name ? __('(no title)', 'formidable') : $form->name . ($form->parent_form_id ? __(' (child)', 'formidable') : ''));
267 } else {
268 $item->id = '';
269 $item->url = '';
270 $item->name = '';
271 }
272 return $item;
273 }
274
275 /**
276 * Render value according to content
277 * @param string $value - Content
278 * @param string $type - Type of rendering value
279 * @param array $field - Field details
280 * @return string - Fully rendered value
281 */
282 public function render($value, $field = array(), $convert_shortcodes = true, $raw = false) {
283 $value = $this->render_shortcodes($value, $field);
284 if (!$raw) {
285 $value = $this->strip_shortcodes($value);
286 $value = $this->convert_shortcodes($value, $convert_shortcodes, isset($field['type']) && $field['type'] == 'e2pdf-html' ? true : false);
287 $value = $this->helper->load('field')->render_checkbox($value, $this, $field);
288 }
289 return $value;
290 }
291
292 /**
293 * Load actions for this extension
294 */
295 public function load_actions() {
296 add_action('frm_notification', array($this, 'action_frm_notification'), 30, 3);
297 add_action('check_ajax_referer', array($this, 'action_check_ajax_referer'), 10, 2);
298 add_action('frm_after_create_entry', array($this, 'action_frm_default_value'), 0, 2);
299 add_action('frm_after_update_entry', array($this, 'action_frm_default_value'), 0, 2);
300 add_action('frm_success_action', array($this, 'action_frm_success_action'));
301
302 /* Hooks */
303 add_action('frm_show_entry_sidebar', array($this, 'hook_formidable_entry_view'));
304 add_action('frm_edit_entry_sidebar', array($this, 'hook_formidable_entry_edit'));
305 }
306
307 /**
308 * Load filters for this extension
309 */
310 public function load_filters() {
311
312 if (!get_option('e2pdf_formidable_disable_filter', '0')) {
313 add_filter('frm_display_entry_content', array(new Model_E2pdf_Filter(), 'pre_filter'), 9);
314 add_filter('frm_display_entry_content', array(new Model_E2pdf_Filter(), 'filter'), 25);
315 add_filter('frm_display_entry_content', array($this, 'filter_frm_display_entry_content'), 30);
316 add_filter('frm_content', array(new Model_E2pdf_Filter(), 'pre_filter'));
317 add_filter('frm_content', array(new Model_E2pdf_Filter(), 'filter'), 25);
318 }
319
320 add_filter('frm_content', array($this, 'filter_frm_content'), 30, 3);
321 add_filter('frm_image_html_array', array($this, 'filter_frm_image_html_array'), 10, 2);
322 add_filter('frm_notification_attachment', array($this, 'filter_frm_notification_attachment'), 30, 3);
323 add_filter('e2pdf_model_options_get_options_options', array($this, 'filter_e2pdf_model_options_get_options_options'));
324 add_filter('frm_main_feedback', array($this, 'filter_frm_main_feedback'));
325
326 // replace shortcodes on backup
327 add_filter('e2pdf_controller_templates_backup_options', array($this, 'filter_e2pdf_controller_templates_backup_options'), 10, 3);
328 add_filter('e2pdf_controller_templates_backup_pages', array($this, 'filter_e2pdf_controller_templates_backup_pages'), 10, 4);
329 add_filter('e2pdf_controller_templates_backup_actions', array($this, 'filter_e2pdf_controller_templates_backup_actions'), 10, 4);
330 add_filter('e2pdf_controller_templates_backup_replace_shortcodes', array($this, 'filter_e2pdf_controller_templates_backup_replace_shortcodes'), 10, 4);
331
332 // replace shortcodes on import
333 add_filter('e2pdf_controller_templates_import_options', array($this, 'filter_e2pdf_controller_templates_import_options'), 10, 3);
334 add_filter('e2pdf_controller_templates_import_pages', array($this, 'filter_e2pdf_controller_templates_import_pages'), 10, 5);
335 add_filter('e2pdf_controller_templates_import_actions', array($this, 'filter_e2pdf_controller_templates_import_actions'), 10, 5);
336 add_filter('e2pdf_controller_templates_import_replace_shortcodes', array($this, 'filter_e2pdf_controller_templates_import_replace_shortcodes'), 10, 5);
337
338 // hooks
339 add_filter('frm_row_actions', array($this, 'hook_formidable_row_actions'), 10, 2);
340
341 // frm-graph
342 add_filter('frm_graph_shortcode_custom_html', array($this, 'filter_frm_graph_shortcode_custom_html'), 99, 2);
343
344 // extension hooks
345 add_filter('e2pdf_extension_hooks', function ($hooks) {
346 $hooks[$this->info['key']] = [
347 'hook_formidable_entry_view' => __('WP Admin Entry View', 'e2pdf'),
348 'hook_formidable_entry_edit' => __('WP Admin Entry Edit', 'e2pdf'),
349 'hook_formidable_row_actions' => __('WP Admin Entry Row Actions', 'e2pdf')
350 ];
351 return $hooks;
352 });
353 }
354
355 public function action_frm_success_action() {
356 $this->set('iframe_download', true);
357 }
358
359 public function filter_frm_main_feedback($message) {
360 $this->set('iframe_download', false);
361 return $message;
362 }
363
364 /**
365 * Render shortcodes which available in this extension
366 * @param string $value - Content
367 * @param string $type - Type of rendering value
368 * @param array $field - Field details
369 * @return string - Value with rendered shortcodes
370 */
371 public function render_shortcodes($value, $field = array()) {
372 $element_id = isset($field['element_id']) ? $field['element_id'] : false;
373 $checkbox_separated = false;
374 $foreach_wrapper_shortcodes = false;
375 $foreach_inner_shortcodes = false;
376 $signature = false;
377 if ($this->verify()) {
378 if (false !== strpos($value, '[')) {
379 $value = $this->helper->load('field')->pre_shortcodes($value, $this, $field);
380 if (class_exists('FrmProEntry')) {
381 $shortcode_tags = array();
382 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $value, $matches);
383 $tagnames = array_intersect($shortcode_tags, $matches[1]);
384 foreach ($matches[1] as $key => $shortcode) {
385 if (false !== strpos($shortcode, ':')) {
386 $shortcode_tags[] = $shortcode;
387 }
388 }
389 $tagnames = array_intersect($shortcode_tags, $matches[1]);
390 if (!empty($tagnames)) {
391 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $value, $shortcodes);
392 foreach ($shortcodes[0] as $key => $shortcode_value) {
393 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
394 $shortcode_details = explode(':', $shortcode[2]);
395 $field_id = $shortcode_details['0'];
396 $child_id = $shortcode_details['1'];
397 $child_entry = 0;
398 $child_field = false;
399 $child_form = false;
400 if (class_exists('FrmField')) {
401 $child_field = FrmField::getOne($field_id);
402 if ($child_field) {
403 $child_form = $child_field->form_id;
404 }
405 }
406 $child_entries = array();
407 if ($this->get('cached_entry')) {
408 $childs = FrmEntry::getAll(array('parent_item_id' => $this->get('cached_entry')->id), ' ORDER BY it.id ASC', '', true, false);
409 if ($childs && $child_form) {
410 foreach ($childs as $child) {
411 if ($child->form_id == $child_form) {
412 $child_entries[] = $child->id;
413 }
414 }
415 }
416 }
417 if ($this->get('item') == '-2') {
418 if ($this->get('cached_entry2')) {
419 $childs = FrmEntry::getAll(array('parent_item_id' => $this->get('cached_entry2')->id), ' ORDER BY it.id ASC', '', true, false);
420 if ($childs && $child_form) {
421 foreach ($childs as $child) {
422 if ($child->form_id == $child_form) {
423 $child_entries[] = $child->id;
424 }
425 }
426 }
427 }
428 }
429 $new_shortcode = '';
430 if (!empty($child_entries) && count($child_entries) >= $child_id) {
431 $start = 1;
432 foreach ($child_entries as $key => $sub_entry) {
433 if ($start == $child_id) {
434 $child_entry = $sub_entry;
435 break;
436 }
437 $start++;
438 }
439
440 $shortcode[2] = 'frm-field-value field_id=' . $field_id . ' entry=' . $child_entry;
441 $new_shortcode = '[' . $shortcode[2] . $shortcode[3] . ']';
442 }
443 $checkbox_separated = true;
444 $value = str_replace($shortcode_value, $new_shortcode, $value);
445 }
446 }
447 }
448
449 // Foreach Inner Shortcodes
450 preg_match_all('/\[foreach[^\]]*?\]((?:(?!\[\/foreach).)+)(e2pdf-if|e2pdf-for)((?:(?!\[\/foreach).)+)\[\/foreach[^\]]*?\]/s', $value, $matches);
451 if (!empty($matches[0])) {
452 foreach ($matches[0] as $match) {
453 $new_match = preg_replace('/(\[)(\/?(e2pdf-if|e2pdf-for)[^\]]*?)(\])/', '{{$2}}', $match);
454 $if_shortcodes = $this->helper->load('if')->get_shortcodes();
455 $if_shortcodes_new = array_map(
456 function ($str) {
457 return str_replace(array('[', ']'), array('{{', '}}'), $str);
458 },
459 $if_shortcodes
460 );
461 $value = str_replace($match, str_replace($if_shortcodes, $if_shortcodes_new, $new_match), $value);
462 }
463 $foreach_inner_shortcodes = true;
464 }
465
466 $value = $this->helper->load('field')->inner_shortcodes($value, $this, $field);
467
468 /* Default shortcodes support */
469 $shortcode_tags = array(
470 'e2pdf-frm-lookup-values',
471 'e2pdf-frm-data-values',
472 'default-message',
473 'default_message',
474 'default-message2',
475 'default_message2',
476 );
477 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $value, $matches);
478 $tagnames = array_intersect($shortcode_tags, $matches[1]);
479 if (!empty($tagnames)) {
480 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $value, $shortcodes);
481 foreach ($shortcodes[0] as $key => $shortcode_value) {
482 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
483 $atts = shortcode_parse_atts($shortcode[3]);
484 if ($shortcode[2] === 'e2pdf-frm-lookup-values' || $shortcode[2] === 'e2pdf-frm-data-values') {
485 if (!isset($atts['user_id']) && $this->get('user_id')) {
486 $shortcode[3] .= ' user_id="' . $this->get('user_id') . '"';
487 $value = str_replace($shortcode_value, '[' . $shortcode[2] . $shortcode[3] . ']', $value);
488 }
489 } elseif (($shortcode[2] === 'default-message' || $shortcode[2] === 'default_message') && $this->get('cached_entry') && class_exists('FrmEntriesHelper')) {
490 $default_message = FrmEntriesHelper::replace_default_message(
491 $shortcode_value,
492 array(
493 'id' => $this->get('cached_entry')->id,
494 'entry' => clone $this->get('cached_entry'),
495 'plain_text' => isset($atts['is_plain_text']) && $atts['is_plain_text'] == 'true' ? true : false,
496 'user_info' => isset($atts['user_info']) && $atts['user_info'] == 'true' ? true : false,
497 )
498 );
499 $value = str_replace($shortcode_value, $default_message, $value);
500 } elseif (($shortcode[2] === 'default-message2' || $shortcode[2] == 'default_message2') && $this->get('cached_entry2') && class_exists('FrmEntriesHelper')) {
501 $default_message = FrmEntriesHelper::replace_default_message(
502 str_replace(array('default-message2', 'default_message2'), array('default-message', 'default_message'), $shortcode_value),
503 array(
504 'id' => $this->get('cached_entry2')->id,
505 'entry' => clone $this->get('cached_entry2'),
506 'plain_text' => isset($atts['is_plain_text']) && $atts['is_plain_text'] == 'true' ? true : false,
507 'user_info' => isset($atts['user_info']) && $atts['user_info'] == 'true' ? true : false,
508 )
509 );
510 $value = str_replace($shortcode_value, $default_message, $value);
511 }
512 }
513 }
514
515 // Foreach Wrapper Shortcodes
516 preg_match_all('/\[foreach[^\]]*?\]((?:(?!\[\/foreach).)+)(e2pdf-format-number|e2pdf-format-date|e2pdf-format-output|e2pdf-math)((?:(?!\[\/foreach).)+)\[\/foreach[^\]]*?\]/s', $value, $matches);
517 if (!empty($matches[0])) {
518 foreach ($matches[0] as $match) {
519 $new_match = preg_replace('/(\[)(\/?(e2pdf-format-number|e2pdf-format-date|e2pdf-format-output|e2pdf-math)[^\]]*?)(\])/', '{{$2}}', $match);
520 $value = str_replace($match, $new_match, $value);
521 $foreach_wrapper_shortcodes = true;
522 }
523 }
524 $value = $this->helper->load('field')->wrapper_shortcodes($value, $this, $field);
525
526 if (false !== strpos($value, '[')) {
527 if (strpos($value, '[foreach') !== false) {
528 if ($this->get('cached_entry')) {
529 $value = preg_replace('/\[foreach[^\]]*?\](.*?)\[\/foreach(*SKIP)(*FAIL)|\[id\]/is', $this->get('cached_entry')->id, $value);
530 $value = preg_replace('/\[foreach[^\]]*?\](.*?)\[\/foreach(*SKIP)(*FAIL)|\[key\]/is', $this->get('cached_entry')->item_key, $value);
531 } else {
532 $value = preg_replace('/\[foreach[^\]]*?\](.*?)\[\/foreach(*SKIP)(*FAIL)|\[id\]/is', '', $value);
533 $value = preg_replace('/\[foreach[^\]]*?\](.*?)\[\/foreach(*SKIP)(*FAIL)|\[key\]/is', '', $value);
534 }
535
536 if ($this->get('cached_entry2')) {
537 $value = preg_replace('/\[foreach[^\]]*?\](.*?)\[\/foreach(*SKIP)(*FAIL)|\[id2\]/is', $this->get('cached_entry2')->id, $value);
538 $value = preg_replace('/\[foreach[^\]]*?\](.*?)\[\/foreach(*SKIP)(*FAIL)|\[key2\]/is', $this->get('cached_entry2')->item_key, $value);
539 } else {
540 $value = preg_replace('/\[foreach[^\]]*?\](.*?)\[\/foreach(*SKIP)(*FAIL)|\[id2\]/is', '', $value);
541 $value = preg_replace('/\[foreach[^\]]*?\](.*?)\[\/foreach(*SKIP)(*FAIL)|\[key2\]/is', '', $value);
542 }
543 } else {
544 $replace = array(
545 '[id]' => $this->get('cached_entry') ? $this->get('cached_entry')->id : '',
546 '[key]' => $this->get('cached_entry') ? $this->get('cached_entry')->item_key : '',
547 '[id2]' => $this->get('cached_entry2') ? $this->get('cached_entry2')->id : '',
548 '[key2]' => $this->get('cached_entry2') ? $this->get('cached_entry2')->item_key : '',
549 );
550 $value = str_replace(array_keys($replace), $replace, $value);
551 }
552 }
553 }
554
555 /*
556 * Checkboxes separatable fix filter add
557 * @since 0.01.43
558 */
559 if ($checkbox_separated) {
560 add_filter('frm_display_value_custom', array($this, 'filter_frm_display_value_custom'), 0, 3);
561 }
562
563 /* [display-frm-data] shortcode support */
564 if (false !== strpos($value, '[')) {
565 preg_match_all('/(?=\[display-frm-data\b)(\[(?:[^\[\]]+|(?1))+\])/', $value, $matches);
566 if (!empty($matches[1])) {
567 add_filter('frmpro_fields_replace_shortcodes', array($this, 'filter_frmpro_fields_replace_shortcodes'), 20, 4);
568 foreach ($matches[1] as $match) {
569 if ($this->get('item') == '-2') {
570 if ($this->get('cached_entry') && $this->get('cached_entry2')) {
571 $new_match = apply_filters('frm_content', $match, $this->get('cached_form'), $this->get('cached_entry'));
572 $new_match = apply_filters('frm_content', $new_match, $this->get('cached_form2'), $this->get('cached_entry2'));
573 } elseif ($this->get('cached_entry')) {
574 $new_match = apply_filters('frm_content', $match, $this->get('cached_form'), $this->get('cached_entry'));
575 if ($this->get('cached_form2')) {
576 $new_match = apply_filters('frm_content', $new_match, $this->get('cached_form2'), $this->get('cached_entry'));
577 }
578 } elseif ($this->get('cached_entry2')) {
579 $new_match = apply_filters('frm_content', $match, $this->get('cached_form2'), $this->get('cached_entry2'));
580 if ($this->get('cached_form')) {
581 $new_match = apply_filters('frm_content', $new_match, $this->get('cached_form'), $this->get('cached_entry2'));
582 }
583 }
584 } else {
585 $new_match = apply_filters('frm_content', $match, $this->get('cached_form'), $this->get('cached_entry'));
586 }
587 $value = str_replace($match, $new_match, $value);
588 }
589 remove_filter('frmpro_fields_replace_shortcodes', array($this, 'filter_frmpro_fields_replace_shortcodes'), 20);
590 }
591 }
592
593 add_filter('frm_filter_view', array($this, 'filter_frm_filter_view'));
594 $value = $this->helper->load('field')->do_shortcodes($value, $this, $field);
595 remove_filter('frm_filter_view', array($this, 'filter_frm_filter_view'));
596
597 /*
598 * Checkboxes separatable fix filter remove
599 * @since 0.01.43
600 */
601 if ($checkbox_separated) {
602 remove_filter('frm_display_value_custom', array($this, 'filter_frm_display_value_custom'), 0);
603 }
604
605 /* Bug fix for Formidable Forms Signature (2.0.1) */
606 if (class_exists('FrmFieldFactory')) {
607 $signature_field = FrmFieldFactory::get_field_type('signature');
608 if ($signature_field->get_display_value('signature') == '') {
609 $signature = true;
610 }
611 }
612 if ($signature) {
613 remove_filter('frm_get_signature_display_value', 'FrmSigAppController::display_signature');
614 remove_filter('frmpro_fields_replace_shortcodes', 'FrmSigAppController::custom_display_signature');
615 add_filter('frm_keep_signature_value_array', array($this, 'filter_frm_keep_signature_value_array'), 10, 2);
616 }
617 add_filter('frmpro_fields_replace_shortcodes', array($this, 'filter_frmpro_fields_replace_shortcodes'), 20, 4);
618
619 $text_signature = !empty($field['type']) && ($field['type'] == 'e2pdf-image' || $field['type'] == 'e2pdf-signature') ? true : false;
620 if ($text_signature) {
621 add_filter('frm_get_signature_display_value', array($this, 'filter_frm_get_signature_display_value'), 20, 3);
622 }
623 if ($this->get('item') == '-2') {
624 if ($this->get('cached_entry') && $this->get('cached_entry2')) {
625 $value = apply_filters('frm_content', $value, $this->get('cached_form'), $this->get('cached_entry'));
626 $value = apply_filters('frm_content', $value, $this->get('cached_form2'), $this->get('cached_entry2'));
627 } elseif ($this->get('cached_entry')) {
628 $value = apply_filters('frm_content', $value, $this->get('cached_form'), $this->get('cached_entry'));
629 if ($this->get('cached_form2')) {
630 $value = apply_filters('frm_content', $value, $this->get('cached_form2'), $this->get('cached_entry'));
631 }
632 } elseif ($this->get('cached_entry2')) {
633 $value = apply_filters('frm_content', $value, $this->get('cached_form2'), $this->get('cached_entry2'));
634 if ($this->get('cached_form')) {
635 $value = apply_filters('frm_content', $value, $this->get('cached_form'), $this->get('cached_entry2'));
636 }
637 }
638 } else {
639 if ($this->get('cached_shortcodes')) {
640 remove_filter('frm_content', 'FrmFormsController::filter_content', 10, 3);
641 add_filter('frm_content', array($this, 'filter_filter_content'), 10, 3);
642 }
643 $value = apply_filters('frm_content', $value, $this->get('cached_form'), $this->get('cached_entry'));
644 if ($this->get('cached_shortcodes')) {
645 remove_filter('frm_content', array($this, 'filter_filter_content'), 10, 3);
646 add_filter('frm_content', 'FrmFormsController::filter_content', 10, 3);
647 }
648 }
649
650 // Foreach Wrapper Shortcodes Reverse
651 if ($foreach_wrapper_shortcodes) {
652 $value = preg_replace('/(\{\{)(\/?(e2pdf-format-number|e2pdf-format-date|e2pdf-format-output|e2pdf-math)[^\}]*?)(\}\})/', '[$2]', $value);
653 $value = $this->helper->load('field')->wrapper_shortcodes($value, $this, $field, true);
654 }
655
656 // Foreach Inner Shortcodes Reverse
657 if ($foreach_inner_shortcodes) {
658 preg_match_all('/\{\{(e2pdf-if|e2pdf-for)\}\}(.*?)+\{\{\/(e2pdf-if|e2pdf-for)\}\}/s', $value, $matches);
659 if (!empty($matches[0])) {
660 foreach ($matches[0] as $match) {
661 $new_match = preg_replace('/(\{\{)(\/?(e2pdf-if|e2pdf-for)[^\}]*?)(\}\})/', '[$2]', $match);
662 $value = str_replace($match, str_replace($if_shortcodes_new, $if_shortcodes, $new_match), $value);
663 }
664 }
665 $value = $this->helper->load('field')->inner_shortcodes($value, $this, $field);
666 }
667
668 // Text Signature
669 if ($text_signature) {
670 remove_filter('frm_get_signature_display_value', array($this, 'filter_frm_get_signature_display_value'), 20);
671 if ($value && false !== strpos($value, ':e2pdf-text-filter:')) {
672 $value = str_replace(':e2pdf-text-filter:', '', $value);
673 $field['properties']['text'] = '1';
674 }
675 }
676 remove_filter('frmpro_fields_replace_shortcodes', array($this, 'filter_frmpro_fields_replace_shortcodes'), 20);
677 if ($signature) {
678 remove_filter('frm_keep_signature_value_array', array($this, 'filter_frm_keep_signature_value_array'));
679 add_filter('frm_get_signature_display_value', 'FrmSigAppController::display_signature', 10, 3);
680 add_filter('frmpro_fields_replace_shortcodes', 'FrmSigAppController::custom_display_signature', 10, 4);
681 }
682 $value = $this->replace_meta_shortcodes($value);
683 $value = $this->helper->load('field')->render(
684 apply_filters('e2pdf_extension_render_shortcodes_pre_value', $value, $element_id, $this->get('template_id'), $this->get('item'), $this->get('dataset'), $this->get('item2'), $this->get('dataset2')),
685 $this,
686 $field
687 );
688 }
689 return apply_filters(
690 'e2pdf_extension_render_shortcodes_value', $value, $element_id, $this->get('template_id'), $this->get('item'), $this->get('dataset'), $this->get('item2'), $this->get('dataset2')
691 );
692 }
693
694 /**
695 * Strip unused shortcodes
696 * @param string $value - Content
697 * @return string - Value with removed unused shortcodes
698 */
699 public function strip_shortcodes($value) {
700 $value = preg_replace('~(?:\[/?)[^/\]]+/?\]~s', '', $value);
701 return $value;
702 }
703
704 /**
705 * Convert "shortcodes" inside value string
706 * @param string $value - Value string
707 * @param bool $to - Convert From/To
708 * @return string - Converted value
709 */
710 public function convert_shortcodes($value, $to = false, $html = false) {
711 if ($value) {
712 if ($to) {
713 $search = array('&#91;', '&#93;', '&#091;', '&#093;');
714 $replace = array('[', ']', '[', ']');
715 $value = str_replace($search, $replace, $value);
716 if (!$html) {
717 $value = wp_specialchars_decode($value, ENT_QUOTES);
718 }
719 } else {
720 $search = array('[', ']', '&#091;', '&#093;');
721 $replace = array('&#91;', '&#93;', '&#91;', '&#93;');
722 $value = str_replace($search, $replace, $value);
723 }
724 }
725 return $value;
726 }
727
728 public function filter_frm_filter_view($view) {
729 if (isset($view->frm_before_content) && $view->frm_before_content) {
730 $view->frm_before_content = str_replace('[e2pdf-exclude]', '[e2pdf-exclude apply="true"]', $view->frm_before_content);
731 }
732 if (isset($view->post_content) && $view->post_content) {
733 $view->post_content = str_replace('[e2pdf-exclude]', '[e2pdf-exclude apply="true"]', $view->post_content);
734 }
735 if (isset($view->frm_after_content) && $view->frm_after_content) {
736 $view->frm_after_content = str_replace('[e2pdf-exclude]', '[e2pdf-exclude apply="true"]', $view->frm_after_content);
737 }
738 return $view;
739 }
740
741 public function filter_frm_lookup_is_current_user_filter_needed($is_filter_needed, $field_id, $field_options) {
742 if (FrmField::is_option_true_in_array($field_options, 'lookup_filter_current_user')) {
743 return true;
744 }
745 return $is_filter_needed;
746 }
747
748 public function filter_frm_keep_signature_value_array($keep_array, $atts) {
749 return true;
750 }
751
752 /**
753 * Search and update shortcodes for this extension inside content
754 * Auto set of dataset id
755 * @param string $content - Content
756 * @param int $form - ID of form
757 * @param int $dataset_id - ID of dataset
758 * @return string - Content with updates shortcodes
759 */
760 public function filter_frm_content($content, $form, $dataset_id) {
761
762 if (false === strpos($content, '[')) {
763 return $content;
764 }
765 $shortcode_tags = array(
766 'e2pdf-download',
767 'e2pdf-save',
768 'e2pdf-view',
769 'e2pdf-adobesign',
770 'e2pdf-zapier',
771 );
772 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
773 $tagnames = array_intersect($shortcode_tags, $matches[1]);
774 if (!empty($tagnames)) {
775 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
776 foreach ($shortcodes[0] as $key => $shortcode_value) {
777 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
778 $atts = shortcode_parse_atts($shortcode[3]);
779 if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedIf
780 } else {
781 if (!isset($atts['dataset']) && isset($atts['id'])) {
782 $template = new Model_E2pdf_Template();
783 $template->load($atts['id']);
784 if ($template->get('extension') === 'formidable') {
785 $entry_id = is_object($dataset_id) ? $dataset_id->id : $dataset_id;
786 if ($entry_id) {
787 if ($template->get('item') == '-2') {
788 if ($template->get('item1') == $form->id) {
789 $atts['dataset'] = $entry_id;
790 $shortcode[3] .= ' dataset="' . $entry_id . '"';
791 } elseif (!isset($atts['dataset2']) && $template->get('item2') == $form->id) {
792 $atts['dataset2'] = $entry_id;
793 $shortcode[3] .= ' dataset2="' . $entry_id . '"';
794 }
795 } else {
796 $atts['dataset'] = $entry_id;
797 $shortcode[3] .= ' dataset="' . $entry_id . '"';
798 }
799 }
800 }
801 }
802 if (!isset($atts['apply'])) {
803 $shortcode[3] .= ' apply="true"';
804 }
805 if (!isset($atts['filter'])) {
806 $shortcode[3] .= ' filter="true"';
807 }
808 if (!isset($atts['iframe_download']) && $this->get('iframe_download')) {
809 $shortcode[3] .= ' iframe_download="true"';
810 }
811 $content = str_replace($shortcode_value, do_shortcode_tag($shortcode), $content);
812 }
813 }
814 }
815
816 return $content;
817 }
818
819 public function filter_frm_display_entry_content($content) {
820
821 if (false === strpos($content, '[')) {
822 return $content;
823 }
824 $shortcode_tags = array(
825 'e2pdf-download',
826 'e2pdf-save',
827 'e2pdf-view',
828 'e2pdf-adobesign',
829 'e2pdf-zapier',
830 );
831 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
832 $tagnames = array_intersect($shortcode_tags, $matches[1]);
833 if (!empty($tagnames)) {
834 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
835 foreach ($shortcodes[0] as $key => $shortcode_value) {
836 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
837 $atts = shortcode_parse_atts($shortcode[3]);
838 if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedIf
839 } else {
840 if (!isset($atts['apply'])) {
841 $shortcode[3] .= ' apply="true"';
842 }
843 if (!isset($atts['filter'])) {
844 $shortcode[3] .= ' filter="true"';
845 }
846 if (!isset($atts['iframe_download'])) {
847 $shortcode[3] .= ' iframe_download="true"';
848 }
849 $content = str_replace($shortcode_value, do_shortcode_tag($shortcode), $content);
850 }
851 }
852 }
853
854 return $content;
855 }
856
857 /**
858 * Filter for checkbox repeatable Label/Value fix
859 * @param array $value - Value
860 * @param obj $field - Field
861 * @param array $atts - Shortcode Attributes
862 * @return mixed - Updated value
863 */
864 public function filter_frm_display_value_custom($value, $field, $atts = array()) {
865 if (class_exists('FrmProEntriesController')) {
866 $defaults = array(
867 'html' => 0,
868 'type' => $field->type,
869 'keepjs' => 0,
870 );
871 $atts = array_merge($defaults, $atts);
872 if ($atts['type'] === 'checkbox') {
873 $value = FrmProEntriesController::get_option_label_for_saved_value($value, $field, $atts);
874 }
875 }
876 return $value;
877 }
878
879 /**
880 * Filter for Signature
881 * @param array $value - Value
882 * @param obj $field - Field
883 * @param array $atts - Shortcode Attributes
884 * @return mixed - Updated value
885 */
886 public function filter_frm_get_signature_display_value($value, $field, $atts = array()) {
887 if ($value && !empty($value['format']) && $value['format'] == 'typed' && !empty($value['content'])) {
888 $value['content'] = ':e2pdf-text-filter:' . $value['content'];
889 }
890 return $value;
891 }
892
893 public function filter_frmpro_fields_replace_shortcodes($replace_with, $tag, $atts, $field) {
894
895 /* Backward compatibility with Formidable Forms PRO < 5.0 */
896 if (class_exists('FrmProDb') && property_exists('FrmProDb', 'plug_version') && version_compare(FrmProDb::$plug_version, '5.0', '<')) {
897 if ($this->get('item') == '-2' && $this->get('cached_entry2') && $field->form_id == $this->get('cached_entry2')->form_id) {
898 $atts['entry_id'] = $this->get('cached_entry2')->id;
899 $replace_with = FrmProEntryMetaHelper::get_post_or_meta_value($this->get('cached_entry2'), $field, $atts);
900 }
901 }
902
903 if ($field->type === 'checkbox' && is_array($replace_with)) {
904 if (isset($atts['key']) && $atts['key']) {
905 if (isset($replace_with[$atts['key']])) {
906 $replace_with = $replace_with[$atts['key']];
907 } else {
908 $replace_with = '';
909 }
910 }
911 }
912
913 if ($field->type === 'radio') {
914 if (isset($atts['key']) && $atts['key'] === 'other') {
915 if (isset($field->options) && is_array($field->options)) {
916 $field_key = array_search($replace_with, array_column($field->options, 'value'));
917 if ($field_key !== false) {
918 $replace_with = '';
919 }
920 }
921 }
922 }
923
924 if ($field->type === 'signature' && is_array($replace_with)) {
925 if (!empty($replace_with['format']) && $replace_with['format'] == 'drawn' && !empty($replace_with['output'])) {
926 return $replace_with['output'];
927 }
928 }
929
930 return $replace_with;
931 }
932
933 /**
934 * Generate attachments according shortcodes in Email template
935 * @param array $attachments - List of attachments
936 * @param int $form - ID of form
937 * @param array $args - Arguments
938 * @return array - Updated list of attachments
939 */
940 public function filter_frm_notification_attachment($attachments, $form, $args) {
941 if (!isset($args['email_key'])) {
942 return $attachments;
943 }
944 $form_actions = FrmFormAction::get_action_for_form($form->id);
945 $dataset_id = $args['entry']->id;
946 $email_key = $args['email_key'];
947
948 $shortcode_tags = array(
949 'e2pdf-attachment',
950 'e2pdf-save',
951 );
952
953 foreach ($form_actions as $key => $action) {
954 if ($action->ID === $email_key) {
955 $content = $action->post_content['email_message'];
956 if (false === strpos($content, '[')) {
957 return $attachments;
958 }
959
960 remove_filter('frm_content', array($this, 'filter_frm_content'), 30);
961 $content = apply_filters('frm_content', $content, $form, $args['entry']);
962 add_filter('frm_content', array($this, 'filter_frm_content'), 30, 3);
963
964 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
965 $tagnames = array_intersect($shortcode_tags, $matches[1]);
966 if (!empty($tagnames)) {
967 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
968 foreach ($shortcodes[0] as $key => $shortcode_value) {
969 $shortcode = $this->helper->load('shortcode')->get_shortcode($shortcodes, $key);
970 $atts = shortcode_parse_atts($shortcode[3]);
971 $file = false;
972 if ($this->helper->load('shortcode')->is_attachment($shortcode, $atts)) {
973 if (!isset($atts['dataset']) && isset($atts['id'])) {
974 $template = new Model_E2pdf_Template();
975 $template->load($atts['id']);
976 if ($template->get('extension') === 'formidable') {
977 $entry_id = is_object($dataset_id) ? $dataset_id->id : $dataset_id;
978 if ($entry_id) {
979 if ($template->get('item') == '-2') {
980 if ($template->get('item1') == $form->id) {
981 $atts['dataset'] = $entry_id;
982 $shortcode[3] .= ' dataset="' . $entry_id . '"';
983 } elseif (!isset($atts['dataset2']) && $template->get('item2') == $form->id) {
984 $atts['dataset2'] = $entry_id;
985 $shortcode[3] .= ' dataset2="' . $entry_id . '"';
986 }
987 } else {
988 $atts['dataset'] = $entry_id;
989 $shortcode[3] .= ' dataset="' . $entry_id . '"';
990 }
991 }
992 }
993 }
994 if (!isset($atts['apply'])) {
995 $shortcode[3] .= ' apply="true"';
996 }
997 if (!isset($atts['filter'])) {
998 $shortcode[3] .= ' filter="true"';
999 }
1000 $transient = false;
1001 if (isset($atts['use_args_entry']) && $atts['use_args_entry'] == 'true' && $atts['dataset'] == $dataset_id) {
1002 $dataset = 'tmp_' . $this->helper->load('encryption')->random_md5();
1003 $transient = 'e2pdf_' . $dataset;
1004 set_transient($transient, $args['entry'], 1800);
1005 $atts['dataset'] = $dataset;
1006 $shortcode[3] .= ' dataset="' . $dataset . '"';
1007 }
1008 $file = do_shortcode_tag($shortcode);
1009 if ($file) {
1010 $tmp = false;
1011 if (substr($file, 0, 4) === 'tmp:') {
1012 $file = substr($file, 4);
1013 $tmp = true;
1014 }
1015 if ($shortcode[2] === 'e2pdf-save' || isset($atts['pdf'])) {
1016 if ($tmp) {
1017 $this->helper->add('formidable_attachments', $file);
1018 }
1019 } else {
1020 $this->helper->add('formidable_attachments', $file);
1021 }
1022 $attachments[] = $file;
1023 }
1024 if ($transient) {
1025 delete_transient($transient);
1026 }
1027 }
1028 }
1029 }
1030 }
1031 }
1032 return $attachments;
1033 }
1034
1035 /**
1036 * Decrypt protected uploaded file in a File Upload field
1037 * @param string $html
1038 * @param array $atts
1039 * @return string $html
1040 */
1041 public function filter_frm_image_html_array($html, $atts) {
1042
1043 if (isset($atts['decrypt']) &&
1044 $atts['decrypt'] &&
1045 class_exists('FrmProFileField') &&
1046 class_exists('FrmProFilePayloadBuilder') &&
1047 class_exists('FrmAppHelper')
1048 ) {
1049
1050 $id = $atts['media_id'];
1051 $permission = isset($atts['permission']) && $atts['permission'] ? true : false;
1052
1053 remove_filter('wp_get_attachment_url', 'FrmProFileField::filter_attachment_url');
1054 remove_filter('wp_get_attachment_image_src', 'FrmProFileField::filter_attachment_image_src');
1055
1056 $is_image = wp_attachment_is_image($id);
1057 $url = $this->get_file_url($id, $is_image ? $atts['size'] : false);
1058
1059 if (!FrmProFileField::user_has_permission($id) && !$permission) {
1060 $frm_settings = FrmAppHelper::get_settings();
1061 $html = $frm_settings->admin_permission;
1062 } else {
1063 $html = $atts['show_image'] ? wp_get_attachment_image($id, $atts['size'], !$is_image) : '';
1064
1065 /* If show_filename=1 is included */
1066 if ($atts['show_filename']) {
1067 $label = $this->get_single_file_name($id);
1068 if ($atts['show_image']) {
1069 $html .= ' <span id="frm_media_' . absint($id) . '" class="frm_upload_label">' . $label . '</span>';
1070 } else {
1071 $html .= $label;
1072 }
1073 }
1074
1075 /* If neither show_image or show_filename are included, get file URL */
1076 if (!$html) {
1077 $html = $url;
1078 }
1079
1080 /* If add_link=1 is included */
1081 if ($atts['add_link'] || (!$is_image && $atts['add_link_for_non_image'])) {
1082 $href = $is_image ? $this->get_file_url($id) : $url;
1083 $target = !empty($atts['new_tab']) ? ' target="_blank"' : '';
1084 $html = '<a href="' . esc_url($href) . '" class="frm_file_link"' . $target . '>' . $html . '</a>';
1085 }
1086
1087 if (!empty($atts['class'])) {
1088 $html = str_replace(' class="', ' class="' . esc_attr($atts['class'] . ' '), $html);
1089 }
1090
1091 add_filter('wp_get_attachment_url', 'FrmProFileField::filter_attachment_url', 10, 2);
1092 add_filter('wp_get_attachment_image_src', 'FrmProFileField::filter_attachment_image_src', 10, 4);
1093 }
1094 }
1095
1096 return $html;
1097 }
1098
1099 /**
1100 * @param int $id
1101 * @param string|int[]|bool $size
1102 * @param array $args supported keys include "url" and "leave_size_out_of_payload"
1103 * @return string unprotected url to use for our specified file id and size.
1104 */
1105 public function get_file_url($id, $size = false, $args = array()) {
1106 $url = isset($args['url']) ? $args['url'] : false;
1107 $builder = new FrmProFilePayloadBuilder($id, $size, $url);
1108 return $builder->get_url();
1109 }
1110
1111 /**
1112 * Remove Page Breaks for Visual Mapper
1113 * @param array $fields - List of fields
1114 * @return array - Updated fields
1115 */
1116 public function filter_remove_pagebreaks($fields) {
1117 foreach ((array) $fields as $field_key => $field) {
1118 if ($field->type == 'break') {
1119 unset($fields[$field_key]);
1120 }
1121 }
1122 return $fields;
1123 }
1124
1125 public function filter_frm_match_xml_form($edit_query, $form) {
1126 if (isset($edit_query['created_at'])) {
1127 $edit_query['created_at'] = date('Y-m-d H:i:s', strtotime('now'));
1128 }
1129 return $edit_query;
1130 }
1131
1132 public function filter_frm_show_new_entry_page() {
1133 return 'new';
1134 }
1135
1136 public function filter_frm_pre_display_form($form) {
1137 if (!empty($form->options['single_entry'])) {
1138 $form->options['single_entry'] = 0;
1139 }
1140 return $form;
1141 }
1142
1143 /**
1144 * Add options for Formidable extension
1145 * @param array $options - List of options
1146 * @return array - Updated options list
1147 */
1148 public function filter_e2pdf_model_options_get_options_options($options = array()) {
1149 $options['formidable_group'] = array(
1150 'name' => 'Formidable Forms',
1151 'action' => 'extension',
1152 'group' => 'formidable_group',
1153 'options' => array(
1154 array(
1155 'name' => __('Auto PDF and Visual Mapper', 'e2pdf'),
1156 'key' => 'e2pdf_formidable_use_keys',
1157 'value' => get_option('e2pdf_formidable_use_keys', '0'),
1158 'default_value' => '0',
1159 'type' => 'checkbox',
1160 'checkbox_value' => '1',
1161 'placeholder' => __('Use Field Keys instead Field IDs', 'e2pdf'),
1162 ),
1163 array(
1164 'name' => __('Filter', 'e2pdf'),
1165 'key' => 'e2pdf_formidable_disable_filter',
1166 'value' => get_option('e2pdf_formidable_disable_filter', '0'),
1167 'default_value' => '0',
1168 'type' => 'checkbox',
1169 'checkbox_value' => '1',
1170 'placeholder' => __('Disable Filter', 'e2pdf'),
1171 ),
1172 ),
1173 );
1174 return $options;
1175 }
1176
1177 public function filter_e2pdf_controller_templates_import_options($options) {
1178
1179 if (isset($options['item'])) {
1180 $options['item']['options'][] = array(
1181 'name' => 'Formidable Forms',
1182 'key' => 'options[formidable_item_new_form]',
1183 'value' => 1,
1184 'default_value' => 0,
1185 'type' => 'radio',
1186 'li' => array(
1187 'class' => 'e2pdf-import-extension-option e2pdf-hide',
1188 ),
1189 'options' => array(
1190 '1' => 'Recreate Web Form',
1191 '0' => 'Overwrite Web Form',
1192 ),
1193 );
1194 }
1195
1196 return $options;
1197 }
1198
1199 public function filter_e2pdf_controller_templates_backup_options($options, $template, $extension) {
1200
1201 if ($extension->loaded('formidable')) {
1202 $options['formidable'] = array(
1203 'name' => 'Formidable Forms',
1204 'options' => array(
1205 array(
1206 'name' => __('Force shortcodes to use', 'e2pdf'),
1207 'key' => 'options[formidable_force_shortcodes]',
1208 'value' => 0,
1209 'default_value' => 0,
1210 'type' => 'select',
1211 'options' => array(
1212 '0' => __('None', 'e2pdf'),
1213 '1' => __('Fields IDs', 'e2pdf'),
1214 '2' => __('Field Keys', 'e2pdf'),
1215 ),
1216 ),
1217 ),
1218 );
1219 }
1220
1221 return $options;
1222 }
1223
1224 public function filter_e2pdf_controller_templates_backup_pages($pages, $options, $template, $extension) {
1225
1226 if ($extension->loaded('formidable') && (isset($options['formidable_force_shortcodes']) && $options['formidable_force_shortcodes'])) {
1227 $fields = array();
1228 if ($template->get('item') == '-2') {
1229 if ($template->get('item1')) {
1230 $where = array('fi.form_id' => (int) $template->get('item1'));
1231 $item_fields = FrmField::getAll($where, 'id ASC');
1232 if ($item_fields) {
1233 $fields = array_merge($fields, $item_fields);
1234 }
1235 }
1236 if ($template->get('item2')) {
1237 $where = array('fi.form_id' => (int) $template->get('item2'));
1238 $item_fields = FrmField::getAll($where, 'id ASC');
1239 if ($item_fields) {
1240 $fields = array_merge($fields, $item_fields);
1241 }
1242 }
1243 } else {
1244 $where = array('fi.form_id' => (int) $template->get('item'));
1245 $fields = FrmField::getAll($where, 'id ASC');
1246 }
1247
1248 $search = array();
1249 $replace = array();
1250
1251 if ($options['formidable_force_shortcodes'] == '1') {
1252 foreach ($fields as $field_key => $field) {
1253 if (isset($field->field_options['form_select']) && $field->field_options['form_select']) {
1254 $sub_where = array('fi.form_id' => $field->field_options['form_select']);
1255 $sub_fields = FrmField::getAll($sub_where, 'id ASC');
1256 foreach ($sub_fields as $sub_field_key => $sub_field) {
1257 $search[] = $sub_field->field_key;
1258 $replace[] = $sub_field->id;
1259 }
1260 $search[] = $field->field_key;
1261 $replace[] = $field->id;
1262 } else {
1263 $search[] = $field->field_key;
1264 $replace[] = $field->id;
1265 }
1266 }
1267 } elseif ($options['formidable_force_shortcodes'] == '2') {
1268 foreach ($fields as $field_key => $field) {
1269
1270 if (isset($field->field_options['form_select']) && $field->field_options['form_select']) {
1271 $sub_where = array('fi.form_id' => $field->field_options['form_select']);
1272 $sub_fields = FrmField::getAll($sub_where, 'id ASC');
1273 foreach ($sub_fields as $sub_field_key => $sub_field) {
1274 $search[] = $sub_field->id;
1275 $replace[] = $sub_field->field_key;
1276 }
1277 $search[] = $field->id;
1278 $replace[] = $field->field_key;
1279 } else {
1280 $search[] = $field->id;
1281 $replace[] = $field->field_key;
1282 }
1283 }
1284 }
1285
1286 $search = array_reverse($search);
1287 $replace = array_reverse($replace);
1288 $list = array_combine($search, $replace);
1289 $pages = $this->pages_replace_shortcodes($pages, $list);
1290 }
1291
1292 return $pages;
1293 }
1294
1295 public function filter_e2pdf_controller_templates_backup_actions($actions, $options, $template, $extension) {
1296
1297 if ($extension->loaded('formidable') && (isset($options['formidable_force_shortcodes']) && $options['formidable_force_shortcodes'])) {
1298 $fields = array();
1299 if ($template->get('item') == '-2') {
1300 if ($template->get('item1')) {
1301 $where = array('fi.form_id' => (int) $template->get('item1'));
1302 $item_fields = FrmField::getAll($where, 'id ASC');
1303 if ($item_fields) {
1304 $fields = array_merge($fields, $item_fields);
1305 }
1306 }
1307 if ($template->get('item2')) {
1308 $where = array('fi.form_id' => (int) $template->get('item2'));
1309 $item_fields = FrmField::getAll($where, 'id ASC');
1310 if ($item_fields) {
1311 $fields = array_merge($fields, $item_fields);
1312 }
1313 }
1314 } else {
1315 $where = array('fi.form_id' => (int) $template->get('item'));
1316 $fields = FrmField::getAll($where, 'id ASC');
1317 }
1318
1319 $search = array();
1320 $replace = array();
1321
1322 if ($options['formidable_force_shortcodes'] == '1') {
1323 foreach ($fields as $field_key => $field) {
1324 if (isset($field->field_options['form_select']) && $field->field_options['form_select']) {
1325 $sub_where = array('fi.form_id' => $field->field_options['form_select']);
1326 $sub_fields = FrmField::getAll($sub_where, 'id ASC');
1327 foreach ($sub_fields as $sub_field_key => $sub_field) {
1328 $search[] = $sub_field->field_key;
1329 $replace[] = $sub_field->id;
1330 }
1331 $search[] = $field->field_key;
1332 $replace[] = $field->id;
1333 } else {
1334 $search[] = $field->field_key;
1335 $replace[] = $field->id;
1336 }
1337 }
1338 } elseif ($options['formidable_force_shortcodes'] == '2') {
1339 foreach ($fields as $field_key => $field) {
1340
1341 if (isset($field->field_options['form_select']) && $field->field_options['form_select']) {
1342 $sub_where = array('fi.form_id' => $field->field_options['form_select']);
1343 $sub_fields = FrmField::getAll($sub_where, 'id ASC');
1344 foreach ($sub_fields as $sub_field_key => $sub_field) {
1345 $search[] = $sub_field->id;
1346 $replace[] = $sub_field->field_key;
1347 }
1348 $search[] = $field->id;
1349 $replace[] = $field->field_key;
1350 } else {
1351 $search[] = $field->id;
1352 $replace[] = $field->field_key;
1353 }
1354 }
1355 }
1356
1357 $search = array_reverse($search);
1358 $replace = array_reverse($replace);
1359 $list = array_combine($search, $replace);
1360 $actions = $this->actions_replace_shortcodes($actions, $list);
1361 }
1362
1363 return $actions;
1364 }
1365
1366 public function filter_e2pdf_controller_templates_backup_replace_shortcodes($value, $options, $template, $extension) {
1367
1368 if ($extension->loaded('formidable') && (isset($options['formidable_force_shortcodes']) && $options['formidable_force_shortcodes'])) {
1369 $fields = array();
1370 if ($template->get('item') == '-2') {
1371 if ($template->get('item1')) {
1372 $where = array('fi.form_id' => (int) $template->get('item1'));
1373 $item_fields = FrmField::getAll($where, 'id ASC');
1374 if ($item_fields) {
1375 $fields = array_merge($fields, $item_fields);
1376 }
1377 }
1378 if ($template->get('item2')) {
1379 $where = array('fi.form_id' => (int) $template->get('item2'));
1380 $item_fields = FrmField::getAll($where, 'id ASC');
1381 if ($item_fields) {
1382 $fields = array_merge($fields, $item_fields);
1383 }
1384 }
1385 } else {
1386 $where = array('fi.form_id' => (int) $template->get('item'));
1387 $fields = FrmField::getAll($where, 'id ASC');
1388 }
1389
1390 $search = array();
1391 $replace = array();
1392
1393 if ($options['formidable_force_shortcodes'] == '1') {
1394 foreach ($fields as $field_key => $field) {
1395 if (isset($field->field_options['form_select']) && $field->field_options['form_select']) {
1396 $sub_where = array('fi.form_id' => $field->field_options['form_select']);
1397 $sub_fields = FrmField::getAll($sub_where, 'id ASC');
1398 foreach ($sub_fields as $sub_field_key => $sub_field) {
1399 $search[] = $sub_field->field_key;
1400 $replace[] = $sub_field->id;
1401 }
1402 $search[] = $field->field_key;
1403 $replace[] = $field->id;
1404 } else {
1405 $search[] = $field->field_key;
1406 $replace[] = $field->id;
1407 }
1408 }
1409 } elseif ($options['formidable_force_shortcodes'] == '2') {
1410 foreach ($fields as $field_key => $field) {
1411
1412 if (isset($field->field_options['form_select']) && $field->field_options['form_select']) {
1413 $sub_where = array('fi.form_id' => $field->field_options['form_select']);
1414 $sub_fields = FrmField::getAll($sub_where, 'id ASC');
1415 foreach ($sub_fields as $sub_field_key => $sub_field) {
1416 $search[] = $sub_field->id;
1417 $replace[] = $sub_field->field_key;
1418 }
1419 $search[] = $field->id;
1420 $replace[] = $field->field_key;
1421 } else {
1422 $search[] = $field->id;
1423 $replace[] = $field->field_key;
1424 }
1425 }
1426 }
1427
1428 $search = array_reverse($search);
1429 $replace = array_reverse($replace);
1430 $list = array_combine($search, $replace);
1431 $value = $this->replace_shortcodes($value, $list);
1432 }
1433
1434 return $value;
1435 }
1436
1437 public function filter_e2pdf_controller_templates_import_pages($pages, $options, $xml, $template, $extension) {
1438
1439 if ($extension->loaded('formidable') &&
1440 $template->get('item') &&
1441 (($template->get('item') != '-2' && $template->get('item') != (string) $xml->template->item) || ($template->get('item') == '-2' && ($template->get('item1') != (string) $xml->template->item1 || $template->get('item2') != (string) $xml->template->item2))) &&
1442 $xml->item->formidable &&
1443 $options['item'] &&
1444 class_exists('FrmXMLHelper') &&
1445 class_exists('FrmField')
1446 ) {
1447
1448 $tmp = tempnam($this->helper->get('tmp_dir'), 'e2pdf');
1449 file_put_contents($tmp, base64_decode((string) $xml->item->formidable), LOCK_EX);
1450 $dom = new DOMDocument();
1451 $success = $dom->loadXML(file_get_contents($tmp));
1452 $old_ids = array();
1453 $old_keys = array();
1454 if ($success && function_exists('simplexml_import_dom')) {
1455 $item_xml = simplexml_import_dom($dom);
1456 foreach ($item_xml->form as $form_key => $form) {
1457 if (($template->get('item') != '-2' && (string) $form->id == (string) $xml->template->item) || ($template->get('item') == '-2' && ((string) $form->id == (string) $xml->template->item1 || (string) $form->id == (string) $xml->template->item2))) {
1458 foreach ($form->field as $field_key => $field) {
1459 $field_options = @json_decode((string) $field->field_options, true); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
1460 if (isset($field_options['form_select']) && $field_options['form_select']) {
1461 foreach ($item_xml->form as $sub_form_key => $sub_form) {
1462 if ((string) $sub_form->id == $field_options['form_select']) {
1463 foreach ($sub_form->field as $sub_field_key => $sub_field) {
1464 $old_ids[] = (string) $sub_field->id;
1465 $old_keys[] = (string) $sub_field->field_key;
1466 }
1467 }
1468 }
1469 $old_ids[] = (string) $field->id;
1470 $old_keys[] = (string) $field->field_key;
1471 } else {
1472 $old_ids[] = (string) $field->id;
1473 $old_keys[] = (string) $field->field_key;
1474 }
1475 }
1476 }
1477 }
1478 }
1479
1480 $fields = array();
1481 if ($template->get('item') == '-2') {
1482 if ($template->get('item1')) {
1483 $where = array('fi.form_id' => (int) $template->get('item1'));
1484 $item_fields = FrmField::getAll($where, 'id ASC');
1485 if ($item_fields) {
1486 $fields = array_merge($fields, $item_fields);
1487 }
1488 }
1489
1490 if ($template->get('item2')) {
1491 $where = array('fi.form_id' => (int) $template->get('item2'));
1492 $item_fields = FrmField::getAll($where, 'id ASC');
1493 if ($item_fields) {
1494 $fields = array_merge($fields, $item_fields);
1495 }
1496 }
1497 } else {
1498 $where = array('fi.form_id' => (int) $template->get('item'));
1499 $fields = FrmField::getAll($where, 'id ASC');
1500 }
1501
1502 $new_ids = array();
1503 $new_keys = array();
1504
1505 foreach ($fields as $field_key => $field) {
1506
1507 if (isset($field->field_options['form_select']) && $field->field_options['form_select']) {
1508 $sub_where = array('fi.form_id' => (int) $field->field_options['form_select']);
1509 $sub_fields = FrmField::getAll($sub_where, 'id ASC');
1510 foreach ($sub_fields as $sub_field_key => $sub_field) {
1511 $new_ids[] = $sub_field->id;
1512 $new_keys[] = $sub_field->field_key;
1513 }
1514 $new_ids[] = $field->id;
1515 $new_keys[] = $field->field_key;
1516 } else {
1517 $new_ids[] = $field->id;
1518 $new_keys[] = $field->field_key;
1519 }
1520 }
1521
1522 if (count($old_ids) === count($new_ids)) {
1523 $old_ids = array_reverse($old_ids);
1524 $new_ids = array_reverse($new_ids);
1525
1526 $old_keys = array_reverse($old_keys);
1527 $new_keys = array_reverse($new_keys);
1528
1529 $list_ids = array_combine($old_ids, $new_ids);
1530 $pages = $this->pages_replace_shortcodes($pages, $list_ids);
1531
1532 $list_keys = array_combine($old_keys, $new_keys);
1533 $pages = $this->pages_replace_shortcodes($pages, $list_keys);
1534 }
1535
1536 unset($dom);
1537 unlink($tmp);
1538 }
1539
1540 return $pages;
1541 }
1542
1543 public function filter_e2pdf_controller_templates_import_actions($actions, $options, $xml, $template, $extension) {
1544
1545 if ($extension->loaded('formidable') &&
1546 $template->get('item') &&
1547 (($template->get('item') != '-2' && $template->get('item') != (string) $xml->template->item) || ($template->get('item') == '-2' && ($template->get('item1') != (string) $xml->template->item1 || $template->get('item2') != (string) $xml->template->item2))) &&
1548 $xml->item->formidable &&
1549 $options['item'] &&
1550 class_exists('FrmXMLHelper') &&
1551 class_exists('FrmField')
1552 ) {
1553
1554 $tmp = tempnam($this->helper->get('tmp_dir'), 'e2pdf');
1555 file_put_contents($tmp, base64_decode((string) $xml->item->formidable), LOCK_EX);
1556
1557 $dom = new DOMDocument();
1558 $success = $dom->loadXML(file_get_contents($tmp));
1559
1560 $old_ids = array();
1561 $old_keys = array();
1562
1563 if ($success && function_exists('simplexml_import_dom')) {
1564 $item_xml = simplexml_import_dom($dom);
1565
1566 foreach ($item_xml->form as $form_key => $form) {
1567 if (($template->get('item') != '-2' && (string) $form->id == (string) $xml->template->item) || ($template->get('item') == '-2' && ((string) $form->id == (string) $xml->template->item1 || (string) $form->id == (string) $xml->template->item2))) {
1568 foreach ($form->field as $field_key => $field) {
1569 $field_options = @json_decode((string) $field->field_options, true); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
1570 if (isset($field_options['form_select']) && $field_options['form_select']) {
1571 foreach ($item_xml->form as $sub_form_key => $sub_form) {
1572 if ((string) $sub_form->id == $field_options['form_select']) {
1573 foreach ($sub_form->field as $sub_field_key => $sub_field) {
1574 $old_ids[] = (string) $sub_field->id;
1575 $old_keys[] = (string) $sub_field->field_key;
1576 }
1577 }
1578 }
1579 $old_ids[] = (string) $field->id;
1580 $old_keys[] = (string) $field->field_key;
1581 } else {
1582 $old_ids[] = (string) $field->id;
1583 $old_keys[] = (string) $field->field_key;
1584 }
1585 }
1586 }
1587 }
1588 }
1589
1590 $fields = array();
1591 if ($template->get('item') == '-2') {
1592 if ($template->get('item1')) {
1593 $where = array('fi.form_id' => (int) $template->get('item1'));
1594 $item_fields = FrmField::getAll($where, 'id ASC');
1595 if ($item_fields) {
1596 $fields = array_merge($fields, $item_fields);
1597 }
1598 }
1599
1600 if ($template->get('item2')) {
1601 $where = array('fi.form_id' => (int) $template->get('item2'));
1602 $item_fields = FrmField::getAll($where, 'id ASC');
1603
1604 if ($item_fields) {
1605 $fields = array_merge($fields, $item_fields);
1606 }
1607 }
1608 } else {
1609 $where = array('fi.form_id' => (int) $template->get('item'));
1610 $fields = FrmField::getAll($where, 'id ASC');
1611 }
1612
1613 $new_ids = array();
1614 $new_keys = array();
1615
1616 foreach ($fields as $field_key => $field) {
1617
1618 if (isset($field->field_options['form_select']) && $field->field_options['form_select']) {
1619 $sub_where = array('fi.form_id' => (int) $field->field_options['form_select']);
1620 $sub_fields = FrmField::getAll($sub_where, 'id ASC');
1621 foreach ($sub_fields as $sub_field_key => $sub_field) {
1622 $new_ids[] = $sub_field->id;
1623 $new_keys[] = $sub_field->field_key;
1624 }
1625 $new_ids[] = $field->id;
1626 $new_keys[] = $field->field_key;
1627 } else {
1628 $new_ids[] = $field->id;
1629 $new_keys[] = $field->field_key;
1630 }
1631 }
1632
1633 if (count($old_ids) === count($new_ids)) {
1634 $old_ids = array_reverse($old_ids);
1635 $new_ids = array_reverse($new_ids);
1636
1637 $old_keys = array_reverse($old_keys);
1638 $new_keys = array_reverse($new_keys);
1639
1640 $list_ids = array_combine($old_ids, $new_ids);
1641 $actions = $this->actions_replace_shortcodes($actions, $list_ids);
1642
1643 $list_keys = array_combine($old_keys, $new_keys);
1644 $actions = $this->pages_replace_shortcodes($actions, $list_keys);
1645 }
1646 unset($dom);
1647 unlink($tmp);
1648 }
1649
1650 return $actions;
1651 }
1652
1653 public function filter_frm_graph_shortcode_custom_html($html, $data) {
1654 if (apply_filters('e2pdf_pdf_render', false)) {
1655 return serialize($data['graph_data']);
1656 }
1657 return $html;
1658 }
1659
1660 public function filter_e2pdf_controller_templates_import_replace_shortcodes($value, $options, $xml, $template, $extension) {
1661
1662 if ($extension->loaded('formidable') &&
1663 $template->get('item') &&
1664 (($template->get('item') != '-2' && $template->get('item') != (string) $xml->template->item) || ($template->get('item') == '-2' && ($template->get('item1') != (string) $xml->template->item1 || $template->get('item2') != (string) $xml->template->item2))) &&
1665 $xml->item->formidable &&
1666 $options['item'] &&
1667 class_exists('FrmXMLHelper') &&
1668 class_exists('FrmField')
1669 ) {
1670
1671 $tmp = tempnam($this->helper->get('tmp_dir'), 'e2pdf');
1672 file_put_contents($tmp, base64_decode((string) $xml->item->formidable), LOCK_EX);
1673
1674 $dom = new DOMDocument();
1675 $success = $dom->loadXML(file_get_contents($tmp));
1676
1677 $old_ids = array();
1678 $old_keys = array();
1679
1680 if ($success && function_exists('simplexml_import_dom')) {
1681 $item_xml = simplexml_import_dom($dom);
1682 foreach ($item_xml->form as $form_key => $form) {
1683 if (($template->get('item') != '-2' && (string) $form->id == (string) $xml->template->item) || ($template->get('item') == '-2' && ((string) $form->id == (string) $xml->template->item1 || (string) $form->id == (string) $xml->template->item2))) {
1684 foreach ($form->field as $field_key => $field) {
1685 $field_options = @json_decode((string) $field->field_options, true); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
1686 if (isset($field_options['form_select']) && $field_options['form_select']) {
1687 foreach ($item_xml->form as $sub_form_key => $sub_form) {
1688 if ((string) $sub_form->id == $field_options['form_select']) {
1689 foreach ($sub_form->field as $sub_field_key => $sub_field) {
1690 $old_ids[] = (string) $sub_field->id;
1691 $old_keys[] = (string) $sub_field->field_key;
1692 }
1693 }
1694 }
1695 $old_ids[] = (string) $field->id;
1696 $old_keys[] = (string) $field->field_key;
1697 } else {
1698 $old_ids[] = (string) $field->id;
1699 $old_keys[] = (string) $field->field_key;
1700 }
1701 }
1702 }
1703 }
1704 }
1705
1706 $fields = array();
1707 if ($template->get('item') == '-2') {
1708 if ($template->get('item1')) {
1709 $where = array('fi.form_id' => (int) $template->get('item1'));
1710 $item_fields = FrmField::getAll($where, 'id ASC');
1711 if ($item_fields) {
1712 $fields = array_merge($fields, $item_fields);
1713 }
1714 }
1715
1716 if ($template->get('item2')) {
1717 $where = array('fi.form_id' => (int) $template->get('item2'));
1718 $item_fields = FrmField::getAll($where, 'id ASC');
1719
1720 if ($item_fields) {
1721 $fields = array_merge($fields, $item_fields);
1722 }
1723 }
1724 } else {
1725 $where = array('fi.form_id' => (int) $template->get('item'));
1726 $fields = FrmField::getAll($where, 'id ASC');
1727 }
1728
1729 $new_ids = array();
1730 $new_keys = array();
1731
1732 foreach ($fields as $field_key => $field) {
1733 if (isset($field->field_options['form_select']) && $field->field_options['form_select']) {
1734 $sub_where = array('fi.form_id' => (int) $field->field_options['form_select']);
1735 $sub_fields = FrmField::getAll($sub_where, 'id ASC');
1736 foreach ($sub_fields as $sub_field_key => $sub_field) {
1737 $new_ids[] = $sub_field->id;
1738 $new_keys[] = $sub_field->field_key;
1739 }
1740 $new_ids[] = $field->id;
1741 $new_keys[] = $field->field_key;
1742 } else {
1743 $new_ids[] = $field->id;
1744 $new_keys[] = $field->field_key;
1745 }
1746 }
1747
1748 if (count($old_ids) === count($new_ids)) {
1749
1750 $old_ids = array_reverse($old_ids);
1751 $new_ids = array_reverse($new_ids);
1752
1753 $old_keys = array_reverse($old_keys);
1754 $new_keys = array_reverse($new_keys);
1755
1756 $list_ids = array_combine($old_ids, $new_ids);
1757 $value = $this->replace_shortcodes($value, $list_ids);
1758
1759 $list_keys = array_combine($old_keys, $new_keys);
1760 $value = $this->replace_shortcodes($value, $list_keys);
1761 }
1762
1763 unset($dom);
1764 unlink($tmp);
1765 }
1766 return $value;
1767 }
1768
1769 /**
1770 * Delete attachments that were sent by email
1771 */
1772 public function action_frm_notification() {
1773
1774 $files = $this->helper->get('formidable_attachments');
1775 if (is_array($files) && !empty($files)) {
1776 foreach ($files as $key => $file) {
1777 $this->helper->delete_dir(dirname($file) . '/');
1778 }
1779 $this->helper->deset('formidable_attachments');
1780 }
1781 }
1782
1783 /**
1784 * Fix to render E2Pdf shortcodes with beforeContent and afterContent inside Formidable Form View Preview
1785 */
1786 public function action_check_ajax_referer($action, $result) {
1787 if ($action == 'frm_ajax' && false !== $result && isset($_POST['action']) && $_POST['action'] == 'frm_views_process_box_preview') {
1788 if (isset($_POST['beforeContent']) && $_POST['beforeContent']) {
1789 $_POST['beforeContent'] = $this->filter_view_preview_before_after_content($_POST['beforeContent']);
1790 }
1791 if (isset($_POST['afterContent']) && $_POST['afterContent']) {
1792 $_POST['afterContent'] = $this->filter_view_preview_before_after_content($_POST['afterContent']);
1793 }
1794 }
1795 }
1796
1797 public function action_frm_default_value($entry_id, $form_id) {
1798 global $wpdb;
1799 if ($form_id) {
1800 $fields = $wpdb->get_results($wpdb->prepare('SELECT * FROM `' . $wpdb->prefix . 'frm_fields` WHERE form_id = %d AND (default_value LIKE %s OR default_value LIKE %s)', $form_id, '%[e2pdf-download%', '%[e2pdf-save%'));
1801 if (!empty($fields)) {
1802 foreach ($fields as $key => $field) {
1803 $meta = FrmEntryMeta::get_entry_meta_by_field($entry_id, $field->id);
1804 if ($meta === null) {
1805 $new_value = $this->filter_frm_content($field->default_value, FrmForm::getOne($form_id), $entry_id);
1806 $added = FrmEntryMeta::add_entry_meta($entry_id, $field->id, null, $new_value);
1807 if (!$added) {
1808 FrmEntryMeta::update_entry_meta($entry_id, $field->id, null, $new_value);
1809 }
1810 }
1811 }
1812 }
1813 }
1814 }
1815
1816 /**
1817 * Filter "get" shortcodes with beforeContent and afterContent inside Formidable Form View Preview
1818 * @param type $content
1819 * @return type
1820 */
1821 public function filter_view_preview_before_after_content($content) {
1822
1823 if (false !== strpos($content, '[get ') && (
1824 false !== strpos($content, 'e2pdf-download') ||
1825 false !== strpos($content, 'e2pdf-save') ||
1826 false !== strpos($content, 'e2pdf-view') ||
1827 false !== strpos($content, 'e2pdf-adobesign') ||
1828 false !== strpos($content, 'e2pdf-zapier') ||
1829 false !== strpos($content, 'e2pdf-attachment')
1830 )) {
1831 $shortcode_tags = array(
1832 'get',
1833 );
1834 preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
1835 $tagnames = array_intersect($shortcode_tags, $matches[1]);
1836 if (!empty($tagnames)) {
1837 preg_match_all('/' . $this->helper->load('shortcode')->get_shortcode_regex($tagnames) . '/', $content, $shortcodes);
1838 foreach ($shortcodes[0] as $key => $shortcode_value) {
1839 $content = str_replace($shortcode_value, $this->convert_shortcodes($shortcode_value), $content);
1840 }
1841 }
1842 }
1843 return $content;
1844 }
1845
1846 public function filter_filter_content($content, $form, $entry = false) {
1847 $content = FrmFormsController::replace_form_name_shortcodes($content, $form);
1848 if (!$entry) {
1849 return $content;
1850 }
1851 if (is_object($form)) {
1852 $form = $form->id;
1853 }
1854 if (!empty($entry->parent_entry)) {
1855 $form = $entry->parent_entry->form_id;
1856 }
1857 $shortcodes = $this->get('cached_shortcodes');
1858 $content = apply_filters('frm_replace_content_shortcodes', $content, $entry, $shortcodes);
1859 return $content;
1860 }
1861
1862 /**
1863 * Auto Generate of Template for this extension
1864 * @return array - List of elements
1865 */
1866 public function auto() {
1867
1868 $response = array();
1869 $elements = array();
1870
1871 $form_id = $this->get('item');
1872
1873 $fields = array();
1874 if (class_exists('FrmField')) {
1875 $fields = FrmField::get_all_for_form($form_id, '', 'include', 'include');
1876 }
1877
1878 if ($fields) {
1879 foreach ($fields as $key => $field) {
1880 $field_id = get_option('e2pdf_formidable_use_keys', '0') ? $field->field_key : $field->id;
1881
1882 if ($field->type === 'lookup' && isset($field->field_options['data_type'])) {
1883 if ($field->field_options['data_type'] == 'select') {
1884 $field->options = array(
1885 '[e2pdf-frm-lookup-values id="' . $field_id . '"]',
1886 );
1887 } elseif ($field->field_options['data_type'] == 'radio' || $field->field_options['data_type'] == 'checkbox') {
1888 $options = array();
1889 $frm_filter = false;
1890 if (class_exists('FrmProFieldsHelper') && method_exists('FrmProFieldsHelper', 'add_default_field_settings')) {
1891 if (!has_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings')) {
1892 add_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings', 10, 2);
1893 $frm_filter = true;
1894 }
1895 }
1896
1897 $args = array();
1898 $field_array = FrmAppHelper::start_field_array($field);
1899 FrmFieldsHelper::prepare_new_front_field($field_array, $field, $args);
1900 $field_array = array_merge($field->field_options, $field_array);
1901 if (isset($field_array['options']) && is_array($field_array['options'])) {
1902 $options = $field_array['options'];
1903 }
1904 if ($frm_filter) {
1905 remove_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings');
1906 }
1907 $field->options = $options;
1908 }
1909 $field->type = $field->field_options['data_type'];
1910 } elseif ($field->type === 'data' && isset($field->field_options['data_type'])) {
1911 if ($field->field_options['data_type'] == 'select') {
1912 $field->options = array(
1913 '[e2pdf-frm-data-values id="' . $field_id . '"]',
1914 );
1915 } elseif ($field->field_options['data_type'] == 'radio' || $field->field_options['data_type'] == 'checkbox') {
1916 $options = array();
1917 $frm_filter = false;
1918 if (class_exists('FrmProFieldsHelper') && method_exists('FrmProFieldsHelper', 'add_default_field_settings')) {
1919 if (!has_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings')) {
1920 add_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings', 10, 2);
1921 $frm_filter = true;
1922 }
1923 }
1924
1925 $args = array();
1926 $field->field_options['restrict'] = '0';
1927 $field_array = FrmAppHelper::start_field_array($field);
1928 FrmFieldsHelper::prepare_new_front_field($field_array, $field, $args);
1929
1930 $field_array = array_merge($field->field_options, $field_array);
1931 if (isset($field_array['options']) && is_array($field_array['options'])) {
1932 $options = $field_array['options'];
1933 }
1934
1935 if ($frm_filter) {
1936 remove_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings');
1937 }
1938 $field->options = $options;
1939 }
1940 $field->type = $field->field_options['data_type'];
1941 }
1942
1943 /*
1944 * Repeatable fields Field ID modification
1945 * @since 0.01.42
1946 */
1947 if ($field->type !== 'lookup' && $field->type !== 'data' && isset($field->form_id) && $field->form_id != $form_id) {
1948 $field_id = $field_id . ':1';
1949 }
1950
1951 switch ($field->type) {
1952 case 'divider':
1953 if ($field->name) {
1954 $elements[] = $this->auto_field(
1955 $field,
1956 array(
1957 'type' => 'e2pdf-html',
1958 'block' => true,
1959 'properties' => array(
1960 'top' => '20',
1961 'left' => '20',
1962 'right' => '20',
1963 'width' => '100%',
1964 'height' => 'auto',
1965 'value' => '<h2>' . $field->name . '</h2>',
1966 ),
1967 )
1968 );
1969 }
1970 break;
1971 case 'html':
1972 if ($field->description) {
1973 $elements[] = $this->auto_field(
1974 $field,
1975 array(
1976 'type' => 'e2pdf-html',
1977 'block' => true,
1978 'properties' => array(
1979 'top' => '20',
1980 'left' => '20',
1981 'right' => '20',
1982 'width' => '100%',
1983 'height' => 'auto',
1984 'value' => $field->description,
1985 ),
1986 )
1987 );
1988 }
1989 break;
1990 case 'signature':
1991 $elements[] = $this->auto_field(
1992 $field,
1993 array(
1994 'type' => 'e2pdf-html',
1995 'block' => true,
1996 'properties' => array(
1997 'top' => '20',
1998 'left' => '20',
1999 'right' => '20',
2000 'width' => '100%',
2001 'height' => 'auto',
2002 'value' => $field->name,
2003 ),
2004 )
2005 );
2006
2007 $elements[] = $this->auto_field(
2008 $field,
2009 array(
2010 'type' => 'e2pdf-signature',
2011 'properties' => array(
2012 'top' => '5',
2013 'width' => '100%',
2014 'height' => '150',
2015 'dimension' => '1',
2016 'block_dimension' => '1',
2017 'value' => '[' . $field_id . ']',
2018 ),
2019 )
2020 );
2021 break;
2022 case 'scale':
2023 $elements[] = $this->auto_field(
2024 $field,
2025 array(
2026 'type' => 'e2pdf-html',
2027 'block' => true,
2028 'properties' => array(
2029 'top' => '20',
2030 'left' => '20',
2031 'right' => '20',
2032 'width' => '100%',
2033 'height' => 'auto',
2034 'value' => $field->name,
2035 ),
2036 )
2037 );
2038
2039 if (isset($field->options) && is_array($field->options)) {
2040 $start = true;
2041 foreach ($field->options as $opt_key => $option) {
2042 if (is_array($option)) {
2043 $elements[] = $this->auto_field(
2044 $field,
2045 array(
2046 'type' => 'e2pdf-radio',
2047 'float' => $start ? false : true,
2048 'properties' => array(
2049 'top' => $start ? '5' : '0',
2050 'left' => $start ? '0' : '5',
2051 'width' => 'auto',
2052 'height' => 'auto',
2053 'value' => '[' . $field_id . ']',
2054 'option' => $option['value'],
2055 'group' => 'group_' . $field_id,
2056 ),
2057 )
2058 );
2059 } else {
2060 $elements[] = $this->auto_field(
2061 $field,
2062 array(
2063 'type' => 'e2pdf-radio',
2064 'float' => $start ? false : true,
2065 'properties' => array(
2066 'top' => $start ? '5' : '0',
2067 'left' => $start ? '0' : '5',
2068 'width' => 'auto',
2069 'height' => 'auto',
2070 'value' => '[' . $field_id . ']',
2071 'option' => $option,
2072 'group' => 'group_' . $field_id,
2073 ),
2074 )
2075 );
2076 }
2077
2078 $start = false;
2079 }
2080
2081 $start = true;
2082 foreach ($field->options as $opt_key => $option) {
2083 if (is_array($option)) {
2084
2085 $elements[] = $this->auto_field(
2086 $field,
2087 array(
2088 'type' => 'e2pdf-html',
2089 'float' => $start ? false : true,
2090 'properties' => array(
2091 'top' => $start ? '5' : '0',
2092 'left' => $start ? '0' : '5',
2093 'width' => 'auto',
2094 'height' => 'auto',
2095 'value' => $option['label'],
2096 'text_align' => 'center',
2097 ),
2098 )
2099 );
2100 } else {
2101 $elements[] = $this->auto_field(
2102 $field,
2103 array(
2104 'type' => 'e2pdf-html',
2105 'float' => $start ? false : true,
2106 'properties' => array(
2107 'top' => $start ? '5' : '0',
2108 'left' => $start ? '0' : '5',
2109 'width' => 'auto',
2110 'height' => 'auto',
2111 'value' => $option,
2112 'text_align' => 'center',
2113 ),
2114 )
2115 );
2116 }
2117 $start = false;
2118 }
2119 }
2120 break;
2121 case 'rte':
2122 $elements[] = $this->auto_field(
2123 $field,
2124 array(
2125 'type' => 'e2pdf-html',
2126 'block' => true,
2127 'properties' => array(
2128 'top' => '20',
2129 'left' => '20',
2130 'right' => '20',
2131 'width' => '100%',
2132 'height' => 'auto',
2133 'value' => $field->name,
2134 ),
2135 )
2136 );
2137
2138 $elements[] = $this->auto_field(
2139 $field,
2140 array(
2141 'type' => 'e2pdf-html',
2142 'properties' => array(
2143 'top' => '5',
2144 'width' => '100%',
2145 'height' => '150',
2146 'value' => '[' . $field_id . ' wpautop=0]',
2147 ),
2148 )
2149 );
2150 break;
2151 case 'text':
2152 case 'email':
2153 case 'url':
2154 case 'number':
2155 case 'phone':
2156 case 'date':
2157 case 'image':
2158 case 'tag':
2159 case 'password':
2160 case 'quiz_score':
2161 $elements[] = $this->auto_field(
2162 $field,
2163 array(
2164 'type' => 'e2pdf-html',
2165 'block' => true,
2166 'properties' => array(
2167 'top' => '20',
2168 'left' => '20',
2169 'right' => '20',
2170 'width' => '100%',
2171 'height' => 'auto',
2172 'value' => $field->name,
2173 ),
2174 )
2175 );
2176
2177 $elements[] = $this->auto_field(
2178 $field,
2179 array(
2180 'type' => 'e2pdf-input',
2181 'properties' => array(
2182 'top' => '5',
2183 'width' => '100%',
2184 'height' => 'auto',
2185 'value' => '[' . $field_id . ']',
2186 'pass' => $field->type === 'password' ? '1' : '0',
2187 ),
2188 )
2189 );
2190 break;
2191 case 'time':
2192 $elements[] = $this->auto_field(
2193 $field,
2194 array(
2195 'type' => 'e2pdf-html',
2196 'block' => true,
2197 'properties' => array(
2198 'top' => '20',
2199 'left' => '20',
2200 'right' => '20',
2201 'width' => '100%',
2202 'height' => 'auto',
2203 'value' => $field->name,
2204 ),
2205 )
2206 );
2207
2208 $options_tmp = array();
2209 if (class_exists('FrmProFieldTime')) {
2210 $frm_pro_field_time = new FrmProFieldTime($field);
2211 $options_tmp = $frm_pro_field_time->get_options($field->field_options);
2212 }
2213
2214 if (isset($field->field_options['single_time']) && $field->field_options['single_time']) {
2215 $elements[] = $this->auto_field(
2216 $field,
2217 array(
2218 'type' => 'e2pdf-select',
2219 'properties' => array(
2220 'top' => '5',
2221 'width' => '100%',
2222 'height' => 'auto',
2223 'options' => implode("\n", $options_tmp),
2224 'value' => '[' . $field_id . ']',
2225 ),
2226 )
2227 );
2228 } else {
2229
2230 $options_h = isset($options_tmp['H']) && is_array($options_tmp['H']) ? $options_tmp['H'] : array();
2231 $options_m = isset($options_tmp['m']) && is_array($options_tmp['m']) ? $options_tmp['m'] : array();
2232 $options_a = isset($options_tmp['A']) && is_array($options_tmp['A']) ? $options_tmp['A'] : array();
2233
2234 $elements[] = $this->auto_field(
2235 $field,
2236 array(
2237 'type' => 'e2pdf-select',
2238 'float' => true,
2239 'properties' => array(
2240 'top' => '5',
2241 'width' => isset($field->field_options['clock']) && $field->field_options['clock'] == '12' ? '33.3%' : '50%',
2242 'height' => 'auto',
2243 'options' => implode("\n", $options_h),
2244 'value' => isset($field->field_options['clock']) && $field->field_options['clock'] == '12' ? '[' . $field_id . ' format="g"]' : '[' . $field_id . ' format="H"]',
2245 ),
2246 )
2247 );
2248
2249 $elements[] = $this->auto_field(
2250 $field,
2251 array(
2252 'type' => 'e2pdf-select',
2253 'float' => true,
2254 'properties' => array(
2255 'top' => '5',
2256 'left' => '20',
2257 'width' => isset($field->field_options['clock']) && $field->field_options['clock'] == '12' ? '33.3%' : '50%',
2258 'height' => 'auto',
2259 'options' => implode("\n", $options_m),
2260 'value' => '[' . $field_id . ' format="i"]',
2261 ),
2262 )
2263 );
2264
2265 if (isset($field->field_options['clock']) && $field->field_options['clock'] == '12') {
2266 $elements[] = $this->auto_field(
2267 $field,
2268 array(
2269 'type' => 'e2pdf-select',
2270 'float' => true,
2271 'properties' => array(
2272 'top' => '5',
2273 'left' => '20',
2274 'width' => '33.3%',
2275 'height' => 'auto',
2276 'options' => implode("\n", $options_a),
2277 'value' => '[' . $field_id . ' format="A"]',
2278 ),
2279 )
2280 );
2281 }
2282 }
2283 break;
2284 case 'select':
2285 $elements[] = $this->auto_field(
2286 $field,
2287 array(
2288 'type' => 'e2pdf-html',
2289 'block' => true,
2290 'properties' => array(
2291 'top' => '20',
2292 'left' => '20',
2293 'right' => '20',
2294 'width' => '100%',
2295 'height' => 'auto',
2296 'value' => $field->name,
2297 ),
2298 )
2299 );
2300
2301 $options_tmp = array();
2302 if (isset($field->options) && is_array($field->options)) {
2303 foreach ($field->options as $opt_key => $option) {
2304 if (is_array($option)) {
2305 $options_tmp[] = isset($option['label']) ? $option['label'] : $option['value'];
2306 } else {
2307 $options_tmp[] = $option;
2308 }
2309 }
2310 }
2311
2312 $elements[] = $this->auto_field(
2313 $field,
2314 array(
2315 'type' => 'e2pdf-select',
2316 'properties' => array(
2317 'top' => '5',
2318 'width' => '100%',
2319 'height' => 'auto',
2320 'options' => implode("\n", $options_tmp),
2321 'value' => '[' . $field_id . ']',
2322 'height' => isset($field->field_options['multiple']) && $field->field_options['multiple'] ? '80' : 'auto',
2323 'multiline' => isset($field->field_options['multiple']) && $field->field_options['multiple'] ? '1' : '0',
2324 ),
2325 )
2326 );
2327 break;
2328 case 'credit_card':
2329 $elements[] = $this->auto_field(
2330 $field,
2331 array(
2332 'type' => 'e2pdf-html',
2333 'block' => true,
2334 'properties' => array(
2335 'top' => '20',
2336 'left' => '20',
2337 'right' => '20',
2338 'width' => '100%',
2339 'height' => 'auto',
2340 'value' => $field->name,
2341 ),
2342 )
2343 );
2344
2345 $elements[] = $this->auto_field(
2346 $field,
2347 array(
2348 'type' => 'e2pdf-input',
2349 'properties' => array(
2350 'top' => '5',
2351 'width' => '100%',
2352 'height' => 'auto',
2353 'value' => '[' . $field_id . ' show="cc"]',
2354 ),
2355 )
2356 );
2357
2358 $elements[] = $this->auto_field(
2359 $field,
2360 array(
2361 'type' => 'e2pdf-select',
2362 'properties' => array(
2363 'top' => '5',
2364 'width' => '33.3%',
2365 'left' => '0',
2366 'height' => 'auto',
2367 'options' => implode("\n", range(1, 12)),
2368 'value' => '[' . $field_id . ' show="month"]',
2369 ),
2370 )
2371 );
2372
2373 $elements[] = $this->auto_field(
2374 $field,
2375 array(
2376 'type' => 'e2pdf-select',
2377 'float' => true,
2378 'properties' => array(
2379 'top' => '5',
2380 'left' => '20',
2381 'width' => '33.3%',
2382 'height' => 'auto',
2383 'options' => implode("\n", range(date('Y'), date('Y') + 10)),
2384 'value' => '[' . $field_id . ' show="year"]',
2385 ),
2386 )
2387 );
2388
2389 $elements[] = $this->auto_field(
2390 $field,
2391 array(
2392 'type' => 'e2pdf-input',
2393 'float' => true,
2394 'properties' => array(
2395 'top' => '5',
2396 'left' => '20',
2397 'width' => '33.3%',
2398 'height' => 'auto',
2399 'value' => '[' . $field_id . ' show="cvc"]',
2400 ),
2401 )
2402 );
2403 break;
2404 case 'address':
2405 $elements[] = $this->auto_field(
2406 $field,
2407 array(
2408 'type' => 'e2pdf-html',
2409 'block' => true,
2410 'properties' => array(
2411 'top' => '20',
2412 'left' => '20',
2413 'right' => '20',
2414 'width' => '100%',
2415 'height' => 'auto',
2416 'value' => $field->name,
2417 ),
2418 )
2419 );
2420
2421 if (isset($field->field_options['line1_desc']) && $field->field_options['line1_desc']) {
2422 $elements[] = $this->auto_field(
2423 $field,
2424 array(
2425 'type' => 'e2pdf-html',
2426 'properties' => array(
2427 'top' => '5',
2428 'width' => '100%',
2429 'height' => 'auto',
2430 'value' => $field->field_options['line1_desc'],
2431 ),
2432 )
2433 );
2434 }
2435
2436 $elements[] = $this->auto_field(
2437 $field,
2438 array(
2439 'type' => 'e2pdf-input',
2440 'properties' => array(
2441 'top' => '5',
2442 'width' => '100%',
2443 'height' => 'auto',
2444 'value' => '[' . $field_id . ' show="line1"]',
2445 ),
2446 )
2447 );
2448
2449 if (isset($field->field_options['line2_desc']) && $field->field_options['line2_desc']) {
2450 $elements[] = $this->auto_field(
2451 $field,
2452 array(
2453 'type' => 'e2pdf-html',
2454 'properties' => array(
2455 'top' => '5',
2456 'width' => '100%',
2457 'height' => 'auto',
2458 'value' => $field->field_options['line2_desc'],
2459 ),
2460 )
2461 );
2462 }
2463
2464 $elements[] = $this->auto_field(
2465 $field,
2466 array(
2467 'type' => 'e2pdf-input',
2468 'properties' => array(
2469 'top' => '5',
2470 'width' => '100%',
2471 'height' => 'auto',
2472 'value' => '[' . $field_id . ' show="line2"]',
2473 ),
2474 )
2475 );
2476
2477 if (
2478 (isset($field->field_options['city_desc']) && $field->field_options['city_desc']) ||
2479 (isset($field->field_options['state_desc']) && $field->field_options['state_desc'] && isset($field->field_options['address_type']) && $field->field_options['address_type'] != 'europe') ||
2480 (isset($field->field_options['zip_desc']) && $field->field_options['zip_desc'])
2481 ) {
2482
2483 $float = false;
2484 if (isset($field->field_options['address_type']) && $field->field_options['address_type'] != 'europe') {
2485 $elements[] = $this->auto_field(
2486 $field,
2487 array(
2488 'type' => 'e2pdf-html',
2489 'float' => $float,
2490 'properties' => array(
2491 'top' => '5',
2492 'left' => $float ? '20' : '0',
2493 'width' => '33.3%',
2494 'height' => 'auto',
2495 'value' => isset($field->field_options['city_desc']) && $field->field_options['city_desc'] ? $field->field_options['city_desc'] : '',
2496 ),
2497 )
2498 );
2499 $float = true;
2500 }
2501
2502 if (isset($field->field_options['address_type']) && (
2503 $field->field_options['address_type'] == 'international' ||
2504 $field->field_options['address_type'] == 'us' ||
2505 $field->field_options['address_type'] == 'generic'
2506 )
2507 ) {
2508
2509 $elements[] = $this->auto_field(
2510 $field,
2511 array(
2512 'type' => 'e2pdf-html',
2513 'float' => $float,
2514 'properties' => array(
2515 'top' => '5',
2516 'left' => $float ? '20' : '0',
2517 'width' => '33.3%',
2518 'height' => 'auto',
2519 'value' => isset($field->field_options['state_desc']) && $field->field_options['state_desc'] ? $field->field_options['state_desc'] : '',
2520 ),
2521 )
2522 );
2523 $float = true;
2524 }
2525
2526 $elements[] = $this->auto_field(
2527 $field,
2528 array(
2529 'type' => 'e2pdf-html',
2530 'float' => $float,
2531 'properties' => array(
2532 'top' => '5',
2533 'left' => $float ? '20' : '0',
2534 'width' => '33.3%',
2535 'height' => 'auto',
2536 'value' => isset($field->field_options['zip_desc']) && $field->field_options['zip_desc'] ? $field->field_options['zip_desc'] : '',
2537 ),
2538 )
2539 );
2540 $float = true;
2541
2542 if (isset($field->field_options['address_type']) && $field->field_options['address_type'] == 'europe') {
2543
2544 $elements[] = $this->auto_field(
2545 $field,
2546 array(
2547 'type' => 'e2pdf-html',
2548 'float' => $float,
2549 'properties' => array(
2550 'top' => '5',
2551 'left' => $float ? '20' : '0',
2552 'width' => '33.3%',
2553 'height' => 'auto',
2554 'value' => isset($field->field_options['city_desc']) && $field->field_options['city_desc'] ? $field->field_options['city_desc'] : '',
2555 ),
2556 )
2557 );
2558 }
2559 }
2560
2561 $float = false;
2562 if (isset($field->field_options['address_type']) && $field->field_options['address_type'] != 'europe') {
2563 $elements[] = $this->auto_field(
2564 $field,
2565 array(
2566 'type' => 'e2pdf-input',
2567 'float' => $float,
2568 'properties' => array(
2569 'top' => '5',
2570 'left' => $float ? '20' : '0',
2571 'width' => '33.3%',
2572 'height' => 'auto',
2573 'value' => '[' . $field_id . ' show="city"]',
2574 ),
2575 )
2576 );
2577 $float = true;
2578 }
2579
2580 if (isset($field->field_options['address_type']) && (
2581 $field->field_options['address_type'] == 'international' ||
2582 $field->field_options['address_type'] == 'us' ||
2583 $field->field_options['address_type'] == 'generic'
2584 )
2585 ) {
2586 if ($field->field_options['address_type'] == 'us') {
2587 $options_tmp = array();
2588 if (class_exists('FrmFieldsHelper')) {
2589 $options_tmp = array_values(FrmFieldsHelper::get_us_states());
2590 }
2591
2592 $elements[] = $this->auto_field(
2593 $field,
2594 array(
2595 'type' => 'e2pdf-select',
2596 'float' => $float,
2597 'properties' => array(
2598 'top' => '5',
2599 'left' => $float ? '20' : '0',
2600 'width' => '33.3%',
2601 'height' => 'auto',
2602 'options' => implode("\n", $options_tmp),
2603 'value' => '[' . $field_id . ' show="state"]',
2604 ),
2605 )
2606 );
2607 } else {
2608 $elements[] = $this->auto_field(
2609 $field,
2610 array(
2611 'type' => 'e2pdf-input',
2612 'float' => $float,
2613 'properties' => array(
2614 'top' => '5',
2615 'left' => $float ? '20' : '0',
2616 'width' => '33.3%',
2617 'height' => 'auto',
2618 'value' => '[' . $field_id . ' show="state"]',
2619 ),
2620 )
2621 );
2622 }
2623 $float = true;
2624 }
2625
2626 $elements[] = $this->auto_field(
2627 $field,
2628 array(
2629 'type' => 'e2pdf-input',
2630 'float' => $float,
2631 'properties' => array(
2632 'top' => '5',
2633 'left' => $float ? '20' : '0',
2634 'width' => '33.3%',
2635 'height' => 'auto',
2636 'value' => '[' . $field_id . ' show="zip"]',
2637 ),
2638 )
2639 );
2640 $float = true;
2641
2642 if (isset($field->field_options['address_type']) && $field->field_options['address_type'] == 'europe') {
2643 $elements[] = $this->auto_field(
2644 $field,
2645 array(
2646 'type' => 'e2pdf-input',
2647 'float' => $float,
2648 'properties' => array(
2649 'top' => '5',
2650 'left' => $float ? '20' : '0',
2651 'width' => '33.3%',
2652 'height' => 'auto',
2653 'value' => '[' . $field_id . ' show="city"]',
2654 ),
2655 )
2656 );
2657 }
2658
2659 if (isset($field->field_options['address_type']) && ($field->field_options['address_type'] == 'international' || $field->field_options['address_type'] == 'europe')) {
2660 if (isset($field->field_options['country_desc']) && $field->field_options['country_desc']) {
2661 $elements[] = $this->auto_field(
2662 $field,
2663 array(
2664 'type' => 'e2pdf-html',
2665 'properties' => array(
2666 'top' => '5',
2667 'width' => '100%',
2668 'height' => 'auto',
2669 'value' => $field->field_options['country_desc'],
2670 ),
2671 )
2672 );
2673 }
2674
2675 $options_tmp = array();
2676 if (class_exists('FrmFieldsHelper')) {
2677 $options_tmp = array_values(FrmFieldsHelper::get_countries());
2678 }
2679
2680 $elements[] = $this->auto_field(
2681 $field,
2682 array(
2683 'type' => 'e2pdf-select',
2684 'properties' => array(
2685 'top' => '5',
2686 'width' => '100%',
2687 'height' => 'auto',
2688 'options' => implode("\n", $options_tmp),
2689 'value' => '[' . $field_id . ' show="country"]',
2690 ),
2691 )
2692 );
2693 }
2694 break;
2695 case 'textarea':
2696 $elements[] = $this->auto_field(
2697 $field,
2698 array(
2699 'type' => 'e2pdf-html',
2700 'block' => true,
2701 'properties' => array(
2702 'top' => '20',
2703 'left' => '20',
2704 'right' => '20',
2705 'width' => '100%',
2706 'height' => 'auto',
2707 'value' => $field->name,
2708 ),
2709 )
2710 );
2711 $elements[] = $this->auto_field(
2712 $field,
2713 array(
2714 'type' => 'e2pdf-textarea',
2715 'properties' => array(
2716 'top' => '5',
2717 'width' => '100%',
2718 'height' => '150',
2719 'value' => '[' . $field_id . ' wpautop=0]',
2720 ),
2721 )
2722 );
2723 break;
2724 case 'file':
2725 $elements[] = $this->auto_field(
2726 $field,
2727 array(
2728 'type' => 'e2pdf-html',
2729 'block' => true,
2730 'properties' => array(
2731 'top' => '20',
2732 'left' => '20',
2733 'right' => '20',
2734 'width' => '100%',
2735 'height' => 'auto',
2736 'value' => $field->name,
2737 ),
2738 )
2739 );
2740 if (strpos($field_id, ':') !== false) {
2741 $field_id .= ' size="full" show_image="0" add_link="0"';
2742 } else {
2743 $field_id .= ' size="full"';
2744 }
2745 $elements[] = $this->auto_field(
2746 $field,
2747 array(
2748 'type' => 'e2pdf-textarea',
2749 'properties' => array(
2750 'top' => '5',
2751 'width' => '100%',
2752 'height' => '150',
2753 'value' => '[' . $field_id . ']',
2754 ),
2755 )
2756 );
2757 break;
2758 case 'radio':
2759 $elements[] = $this->auto_field(
2760 $field,
2761 array(
2762 'type' => 'e2pdf-html',
2763 'block' => true,
2764 'properties' => array(
2765 'top' => '20',
2766 'left' => '20',
2767 'right' => '20',
2768 'width' => '100%',
2769 'height' => 'auto',
2770 'value' => $field->name,
2771 ),
2772 )
2773 );
2774
2775 $image_options = false;
2776 if (isset($field->field_options['image_options']) && $field->field_options['image_options']) {
2777 $image_options = true;
2778 }
2779
2780 $separate_value = false;
2781 if (isset($field->field_options['separate_value']) && $field->field_options['separate_value']) {
2782 $separate_value = true;
2783 }
2784
2785 if (isset($field->options) && is_array($field->options)) {
2786
2787 foreach ($field->options as $opt_key => $option) {
2788 if (is_array($option)) {
2789 $elements[] = $this->auto_field(
2790 $field,
2791 array(
2792 'type' => 'e2pdf-radio',
2793 'properties' => array(
2794 'top' => '5',
2795 'width' => 'auto',
2796 'height' => 'auto',
2797 'value' => $image_options ? '[' . $field_id . ' show="value"]' : '[' . $field_id . ']',
2798 'option' => $image_options && $separate_value && isset($option['value']) ? $option['value'] : $option['label'],
2799 'group' => '[' . $field_id . ']',
2800 ),
2801 )
2802 );
2803 $elements[] = $this->auto_field(
2804 $field,
2805 array(
2806 'type' => 'e2pdf-html',
2807 'float' => true,
2808 'properties' => array(
2809 'left' => '5',
2810 'width' => '100%',
2811 'height' => 'auto',
2812 'value' => $option['label'],
2813 ),
2814 )
2815 );
2816 } else {
2817
2818 $elements[] = $this->auto_field(
2819 $field,
2820 array(
2821 'type' => 'e2pdf-radio',
2822 'properties' => array(
2823 'top' => '5',
2824 'width' => 'auto',
2825 'height' => 'auto',
2826 'value' => '[' . $field_id . ']',
2827 'option' => substr($opt_key, 0, 6) === 'other_' ? '[' . $field_id . ' show="value" key="other"]' : $option,
2828 'group' => '[' . $field_id . ']',
2829 ),
2830 )
2831 );
2832 $elements[] = $this->auto_field(
2833 $field,
2834 array(
2835 'type' => 'e2pdf-html',
2836 'float' => true,
2837 'properties' => array(
2838 'left' => '5',
2839 'width' => '100%',
2840 'height' => 'auto',
2841 'value' => $option,
2842 ),
2843 )
2844 );
2845
2846 if (substr($opt_key, 0, 6) === 'other_') {
2847 $elements[] = $this->auto_field(
2848 $field,
2849 array(
2850 'type' => 'e2pdf-input',
2851 'properties' => array(
2852 'top' => '5',
2853 'width' => '100%',
2854 'height' => 'auto',
2855 'value' => '[' . $field_id . ' show="value" key="other"]',
2856 ),
2857 )
2858 );
2859 }
2860 }
2861 }
2862 }
2863 break;
2864 case 'checkbox':
2865 $elements[] = $this->auto_field(
2866 $field,
2867 array(
2868 'type' => 'e2pdf-html',
2869 'block' => true,
2870 'properties' => array(
2871 'top' => '20',
2872 'left' => '20',
2873 'right' => '20',
2874 'width' => '100%',
2875 'height' => 'auto',
2876 'value' => $field->name,
2877 ),
2878 )
2879 );
2880
2881 $image_options = false;
2882 if (isset($field->field_options['image_options']) && $field->field_options['image_options']) {
2883 $image_options = true;
2884 }
2885
2886 $separate_value = false;
2887 if (isset($field->field_options['separate_value']) && $field->field_options['separate_value']) {
2888 $separate_value = true;
2889 }
2890
2891 if (isset($field->options) && is_array($field->options)) {
2892 foreach ($field->options as $opt_key => $option) {
2893 if (is_array($option)) {
2894 $elements[] = $this->auto_field(
2895 $field,
2896 array(
2897 'type' => 'e2pdf-checkbox',
2898 'properties' => array(
2899 'top' => '5',
2900 'width' => 'auto',
2901 'height' => 'auto',
2902 'value' => $image_options ? '[' . $field_id . ' show="value"]' : '[' . $field_id . ']',
2903 'option' => $image_options && $separate_value && isset($option['value']) ? $option['value'] : $option['label'],
2904 ),
2905 )
2906 );
2907 $elements[] = $this->auto_field(
2908 $field,
2909 array(
2910 'type' => 'e2pdf-html',
2911 'float' => true,
2912 'properties' => array(
2913 'left' => '5',
2914 'width' => '100%',
2915 'height' => 'auto',
2916 'value' => $option['label'],
2917 ),
2918 )
2919 );
2920 } else {
2921
2922 $elements[] = $this->auto_field(
2923 $field,
2924 array(
2925 'type' => 'e2pdf-checkbox',
2926 'properties' => array(
2927 'top' => '5',
2928 'width' => 'auto',
2929 'height' => 'auto',
2930 'value' => '[' . $field_id . ']',
2931 'option' => substr($opt_key, 0, 6) === 'other_' ? '[' . $field_id . ' show="value" key="' . $opt_key . '"]' : $option,
2932 ),
2933 )
2934 );
2935
2936 $elements[] = $this->auto_field(
2937 $field,
2938 array(
2939 'type' => 'e2pdf-html',
2940 'float' => true,
2941 'properties' => array(
2942 'left' => '5',
2943 'width' => '100%',
2944 'height' => 'auto',
2945 'value' => $option,
2946 ),
2947 )
2948 );
2949
2950 if (substr($opt_key, 0, 6) === 'other_') {
2951 $elements[] = $this->auto_field(
2952 $field,
2953 array(
2954 'type' => 'e2pdf-input',
2955 'properties' => array(
2956 'top' => '5',
2957 'width' => '100%',
2958 'height' => 'auto',
2959 'value' => '[' . $field_id . ' show="value" key="' . $opt_key . '"]',
2960 ),
2961 )
2962 );
2963 }
2964 }
2965 }
2966 }
2967 break;
2968 default:
2969 break;
2970 }
2971 }
2972 }
2973
2974 $response['page'] = array(
2975 'bottom' => '20',
2976 'top' => '20',
2977 'right' => '20',
2978 'left' => '20',
2979 );
2980
2981 $response['elements'] = $elements;
2982 return $response;
2983 }
2984
2985 /**
2986 * Generate field for Auto PDF
2987 * @param object $field - Formidable field object
2988 * @param string $type - Field type
2989 * @param array $options - Field additional options
2990 * @return array - Prepared auto field
2991 */
2992 public function auto_field($field = false, $element = array()) {
2993
2994 if (!$field) {
2995 return false;
2996 }
2997
2998 if (!isset($element['block'])) {
2999 $element['block'] = false;
3000 }
3001
3002 if (!isset($element['float'])) {
3003 $element['float'] = false;
3004 }
3005
3006 $classes = array();
3007 if (isset($field->field_options['classes'])) {
3008 $classes = explode(' ', $field->field_options['classes']);
3009 }
3010
3011 $float_classes = array(
3012 'frm_half',
3013 'frm_third',
3014 'frm_two_thirds',
3015 'frm_fourth',
3016 'frm_three_fourths',
3017 'frm_fifth',
3018 'frm_two_fifths',
3019 'frm_sixth',
3020 'frm_seventh',
3021 'frm_eighth',
3022 );
3023
3024 $array_intersect = array_intersect($classes, $float_classes);
3025
3026 if (!empty($array_intersect) && !in_array('frm_first', $classes) && isset($element['block']) && $element['block']) {
3027 $element['float'] = true;
3028 }
3029
3030 $primary_class = false;
3031 if (!empty($array_intersect)) {
3032 $primary_class = end($array_intersect);
3033 }
3034
3035 if (isset($element['block']) && $element['block']) {
3036 switch ($primary_class) {
3037 case 'frm_half':
3038 $element['properties']['width'] = '50%';
3039 break;
3040 case 'frm_third':
3041 $element['properties']['width'] = '33.3%';
3042 break;
3043 case 'frm_two_thirds':
3044 $element['properties']['width'] = '66.67%';
3045 break;
3046 case 'frm_fourth':
3047 $element['properties']['width'] = '25%';
3048 break;
3049 case 'frm_three_fourths':
3050 $element['properties']['width'] = '75%';
3051 break;
3052 case 'frm_fifth':
3053 $element['properties']['width'] = '20%';
3054 break;
3055 case 'frm_two_fifths':
3056 $element['properties']['width'] = '80%';
3057 break;
3058 case 'frm_sixth':
3059 $element['properties']['width'] = '16.67%';
3060 break;
3061 case 'frm_seventh':
3062 $element['properties']['width'] = '14.29%';
3063 break;
3064 case 'frm_eighth':
3065 $element['properties']['width'] = '12.5%';
3066 break;
3067 default:
3068 break;
3069 }
3070 }
3071
3072 return $element;
3073 }
3074
3075 /**
3076 * Backup form action
3077 * @param object xml - XML object where to add params for saved item
3078 */
3079 public function backup($xml = false) {
3080 if (class_exists('FrmXMLController')) {
3081
3082 $ids = array();
3083 if ($this->get('item') == '-2') {
3084 $ids[] = $this->get('item1');
3085 $ids[] = $this->get('item2');
3086 } else {
3087 $ids[] = $this->get('item');
3088 }
3089
3090 $type = array();
3091 $type[] = 'forms';
3092
3093 ob_start();
3094 FrmXMLController::generate_xml($type, compact('ids'));
3095 $backup = ob_get_clean();
3096 $xml->addChildCData('formidable', base64_encode($backup));
3097 }
3098 }
3099
3100 /**
3101 * Import form action
3102 * @param object xml - XML object to parse data to import form
3103 */
3104 public function import($xml, $options = array()) {
3105
3106 $updated_items = array();
3107 $new_form = isset($options['formidable_item_new_form']) && $options['formidable_item_new_form'] ? true : false;
3108
3109 if (class_exists('FrmXMLHelper') && class_exists('FrmField') && $this->get('item')) {
3110
3111 if (isset($xml->formidable) && $xml->formidable) {
3112
3113 $tmp = tempnam($this->helper->get('tmp_dir'), 'e2pdf');
3114 file_put_contents($tmp, base64_decode((string) $xml->formidable), LOCK_EX);
3115
3116 if ($new_form) {
3117 add_filter('frm_match_xml_form', array($this, 'filter_frm_match_xml_form'), 10, 2);
3118 }
3119 $result = FrmXMLHelper::import_xml($tmp);
3120
3121 if ($new_form) {
3122 remove_filter('frm_match_xml_form', array($this, 'filter_frm_match_xml_form'));
3123 }
3124 unlink($tmp);
3125
3126 FrmXMLHelper::parse_message($result, $message, $errors);
3127
3128 if ($errors) {
3129 return array(
3130 'errors' => $errors,
3131 );
3132 } else {
3133 if ($this->get('item') == '-2') {
3134 if ($this->get('item1') && isset($result['forms'][$this->get('item1')])) {
3135 $updated_items[$this->get('item1')] = $result['forms'][$this->get('item1')];
3136 }
3137 if ($this->get('item2') && isset($result['forms'][$this->get('item2')])) {
3138 $updated_items[$this->get('item2')] = $result['forms'][$this->get('item2')];
3139 }
3140 } elseif (isset($result['forms'][$this->get('item')])) {
3141 $updated_items[$this->get('item')] = $result['forms'][$this->get('item')];
3142 }
3143 }
3144 }
3145 }
3146 return $updated_items;
3147 }
3148
3149 public function after_import($old_template_id, $new_template_id) {
3150
3151 if ($this->get('item') && $old_template_id && $new_template_id && $old_template_id != $new_template_id && class_exists('FrmForm')) {
3152 $forms = array();
3153 if ($this->get('item') == '-2') {
3154 if ($this->get('item1')) {
3155 $forms[] = $this->get('item1');
3156 }
3157 if ($this->get('item2')) {
3158 $forms[] = $this->get('item2');
3159 }
3160 } else {
3161 $forms[] = $this->get('item');
3162 }
3163
3164 foreach ($forms as $form_id) {
3165 $form = FrmForm::getOne($form_id);
3166 if ($form) {
3167 if (isset($form->options['success_msg'])) {
3168 $success_msg = $this->replace_template_id($form->options['success_msg'], $old_template_id, $new_template_id);
3169 if ($success_msg != $form->options['success_msg']) {
3170 $update = array(
3171 'options' => array(
3172 'success_msg' => $success_msg,
3173 ),
3174 );
3175 FrmForm::update($form_id, $update);
3176 }
3177 }
3178
3179 if (class_exists('FrmFormAction')) {
3180 $actions = FrmFormAction::get_action_for_form($form_id, 'email');
3181 foreach ($actions as $action) {
3182 if (isset($action->post_content['email_message'])) {
3183 $email_message = $this->replace_template_id($action->post_content['email_message'], $old_template_id, $new_template_id);
3184 if ($email_message != $action->post_content['email_message']) {
3185 $action->post_content['email_message'] = $email_message;
3186 FrmFormAction::clear_cache();
3187 FrmDb::save_settings($action, 'frm_actions');
3188 }
3189 }
3190 }
3191 }
3192 }
3193 }
3194 }
3195 return false;
3196 }
3197
3198 public function replace_template_id($message, $old_template_id, $new_template_id) {
3199 $old_template_id = (int) $old_template_id;
3200 $new_template_id = (int) $new_template_id;
3201 $message = preg_replace('/\[(e2pdf-download|e2pdf-view|e2pdf-save|e2pdf-attachment|e2pdf-adobesign|e2pdf-zapier)(.*) id=(|\'|")' . $old_template_id . '(|\'|")(.*)\]/i', '[${1}${2} id=${3}' . $new_template_id . '${4}${5}]', $message);
3202 return $message;
3203 }
3204
3205 public function replace_meta_shortcodes($value) {
3206 if (false !== strpos($value, '[')) {
3207 $replace = array(
3208 '[referer]' => '',
3209 '[browser]' => '',
3210 '[referer2]' => '',
3211 '[browser2]' => '',
3212 '[entry_num]' => '',
3213 '[entry_num2]' => '',
3214 );
3215 if ((false !== strpos($value, '[referer]') || false !== strpos($value, '[browser]')) && $this->get('cached_entry') && isset($this->get('cached_entry')->description)) {
3216 if (is_serialized($this->get('cached_entry')->description)) {
3217 $description = $this->helper->load('convert')->unserialize(trim($this->get('cached_entry')->description));
3218 } else {
3219 $description = $this->get('cached_entry')->description;
3220 }
3221 if (isset($description['referrer'])) {
3222 $replace['[referer]'] = @preg_match('/Referer +\d+\:[ \t]+([^\n\t]+)/', $description['referrer'], $m) ? $m[1] : $description['referrer']; // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
3223 }
3224 $replace['[browser]'] = isset($description['browser']) ? $description['browser'] : '';
3225 }
3226 if ((false !== strpos($value, '[referer2]') || false !== strpos($value, '[browser2]')) && $this->get('cached_entry2') && isset($this->get('cached_entry2')->description)) {
3227 if (is_serialized($this->get('cached_entry2')->description)) {
3228 $description = $this->helper->load('convert')->unserialize(trim($this->get('cached_entry2')->description));
3229 } else {
3230 $description = $this->get('cached_entry2')->description;
3231 }
3232 $replace['[referer2]'] = '';
3233 if (isset($description['referrer'])) {
3234 $replace['[referer2]'] = @preg_match('/Referer +\d+\:[ \t]+([^\n\t]+)/', $description['referrer'], $m) ? $m[1] : $description['referrer']; // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
3235 }
3236 $replace['[browser2]'] = isset($description['browser']) ? $description['browser'] : '';
3237 }
3238 if (false !== strpos($value, '[entry_num]')) {
3239 $replace['[entry_num]'] = class_exists('FrmDb') && $this->get('cached_entry') ? FrmDb::get_count('frm_items', array("form_id = '{$this->get('cached_form')->id}' AND id <= '{$this->get('cached_entry')->id}' AND 1" => '1')) : '';
3240 }
3241 if (false !== strpos($value, '[entry_num2]')) {
3242 $replace['[entry_num2]'] = class_exists('FrmDb') && $this->get('cached_entry2') ? FrmDb::get_count('frm_items', array("form_id = '{$this->get('cached_form2')->id}' AND id <= '{$this->get('cached_entry2')->id}' AND 1" => '1')) : '';
3243 }
3244 $value = str_replace(array_keys($replace), $replace, $value);
3245 }
3246 return $value;
3247 }
3248
3249 /**
3250 * Replace Old Formidable shortcodes to new values on pages
3251 * @param array $pages - List of pages to replace shortcodes
3252 * @param array $shortcodes_list - List of new/old shortcodes to replace
3253 * @return array - List of updated pages
3254 */
3255 public function pages_replace_shortcodes($pages = array(), $shortcodes_list = array()) {
3256
3257 foreach ($pages as $page_key => $page) {
3258 /* Replace page actions and conditions shortcodes */
3259 if (isset($page['actions']) && !empty($page['actions'])) {
3260 foreach ($page['actions'] as $action_key => $action_value) {
3261 if (isset($action_value['change'])) {
3262 $pages[$page_key]['actions'][$action_key]['change'] = $this->replace_shortcodes($action_value['change'], $shortcodes_list);
3263 }
3264
3265 if (isset($action_value['conditions']) && !empty($action_value['conditions'])) {
3266 foreach ($action_value['conditions'] as $condition_key => $condition_value) {
3267 if (isset($condition_value['if'])) {
3268 $pages[$page_key]['actions'][$action_key]['conditions'][$condition_key]['if'] = $this->replace_shortcodes($condition_value['if'], $shortcodes_list);
3269 }
3270
3271 if (isset($condition_value['value'])) {
3272 $pages[$page_key]['actions'][$action_key]['conditions'][$condition_key]['value'] = $this->replace_shortcodes($condition_value['value'], $shortcodes_list);
3273 }
3274 }
3275 }
3276 }
3277 }
3278
3279 foreach ($page['elements'] as $element_key => $element_value) {
3280 $pages[$page_key]['elements'][$element_key]['value'] = $this->replace_shortcodes($element_value['value'], $shortcodes_list);
3281
3282 if (isset($element_value['properties']['option'])) {
3283 $pages[$page_key]['elements'][$element_key]['properties']['option'] = $this->replace_shortcodes($element_value['properties']['option'], $shortcodes_list);
3284 }
3285
3286 if (isset($element_value['properties']['options'])) {
3287 $pages[$page_key]['elements'][$element_key]['properties']['options'] = $this->replace_shortcodes($element_value['properties']['options'], $shortcodes_list);
3288 }
3289
3290 if (isset($element_value['properties']['group'])) {
3291 $pages[$page_key]['elements'][$element_key]['properties']['group'] = $this->replace_shortcodes($element_value['properties']['group'], $shortcodes_list);
3292 }
3293
3294 /* Replace element actions and conditions shortcodes */
3295 if (isset($element_value['actions']) && !empty($element_value['actions'])) {
3296 foreach ($element_value['actions'] as $action_key => $action_value) {
3297 if (isset($action_value['change'])) {
3298 $pages[$page_key]['elements'][$element_key]['actions'][$action_key]['change'] = $this->replace_shortcodes($action_value['change'], $shortcodes_list);
3299 }
3300
3301 if (isset($action_value['conditions']) && !empty($action_value['conditions'])) {
3302 foreach ($action_value['conditions'] as $condition_key => $condition_value) {
3303 if (isset($condition_value['if'])) {
3304 $pages[$page_key]['elements'][$element_key]['actions'][$action_key]['conditions'][$condition_key]['if'] = $this->replace_shortcodes($condition_value['if'], $shortcodes_list);
3305 }
3306
3307 if (isset($condition_value['value'])) {
3308 $pages[$page_key]['elements'][$element_key]['actions'][$action_key]['conditions'][$condition_key]['value'] = $this->replace_shortcodes($condition_value['value'], $shortcodes_list);
3309 }
3310 }
3311 }
3312 }
3313 }
3314 }
3315 }
3316
3317 return $pages;
3318 }
3319
3320 public function actions_replace_shortcodes($actions = array(), $shortcodes_list = array()) {
3321
3322 foreach ($actions as $action_key => $action_value) {
3323 if (isset($action_value['change'])) {
3324 $actions[$action_key]['change'] = $this->replace_shortcodes($action_value['change'], $shortcodes_list);
3325 }
3326
3327 if (isset($action_value['conditions']) && !empty($action_value['conditions'])) {
3328 foreach ($action_value['conditions'] as $condition_key => $condition_value) {
3329 if (isset($condition_value['if'])) {
3330 $actions[$action_key]['conditions'][$condition_key]['if'] = $this->replace_shortcodes($condition_value['if'], $shortcodes_list);
3331 }
3332
3333 if (isset($condition_value['value'])) {
3334 $actions[$action_key]['conditions'][$condition_key]['value'] = $this->replace_shortcodes($condition_value['value'], $shortcodes_list);
3335 }
3336 }
3337 }
3338 }
3339
3340 return $actions;
3341 }
3342
3343 /**
3344 * Replace Old Formidable shortcodes to new values
3345 * @param string $content - Value that can contains old shortcodes
3346 * @param array $shortcodes_list - List of new/old shortcodes to replace
3347 * @return string - Updated value
3348 */
3349 public function replace_shortcodes($content = '', $shortcodes_list = array()) {
3350 if (false === strpos($content, '[')) {
3351 return $content;
3352 }
3353 foreach ($shortcodes_list as $list_key => $list_value) {
3354 $content = preg_replace("/(\[|\[(?:[^\]]*?)\s|\[(?:[^\]]*?)(?:field_id|e2pdf-frm-data-values id|e2pdf-frm-lookup-values id)=(?:\'|\"|)){$list_key}(\:(?:.*?)\]|\s(?:.*?)\]|(?:\'|\")(?:.*?)\]|\])/", '${1}' . $list_value . '${2}', $content);
3355 }
3356 return $content;
3357 }
3358
3359 /**
3360 * Verify if item and dataset exists
3361 * @return bool - item and dataset exists
3362 */
3363 public function verify() {
3364 $verify = false;
3365 if ($this->get('item') == '-2') {
3366 if ($this->get('cached_entry')) {
3367 $verify = true;
3368 } else {
3369 $this->set('dataset', false);
3370 }
3371 if ($this->get('cached_entry2')) {
3372 $verify = true;
3373 } else {
3374 $this->set('dataset2', false);
3375 }
3376 } elseif ($this->get('cached_entry')) {
3377 $verify = true;
3378 }
3379 return $verify;
3380 }
3381
3382 /**
3383 * Create Form based on uploaded PDF
3384 * @param object $template - Template Object to work with
3385 * @param array $data - Settings to create labels/shortcodes
3386 * @return object - Mapped Template Object
3387 */
3388 public function auto_form($template, $data = array()) {
3389
3390 if ($template->get('ID')) {
3391
3392 $auto_form_label = isset($data['auto_form_label']) && $data['auto_form_label'] ? $data['auto_form_label'] : false;
3393 $auto_form_shortcode = isset($data['auto_form_shortcode']) ? true : false;
3394
3395 $form = array(
3396 'form_key' => '',
3397 'name' => $template->get('title'),
3398 'description' => '',
3399 'status' => 'published',
3400 'options' => array(
3401 'success_msg' => sprintf(__('Success. [e2pdf-download id="%s"]', 'e2pdf'), $template->get('ID')),
3402 ),
3403 );
3404
3405 $item = FrmForm::create($form);
3406 if ($item) {
3407 $template->set('item', $item);
3408
3409 $checkboxes = array();
3410 $radios = array();
3411
3412 $pages = $template->get('pages');
3413
3414 foreach ($pages as $page_key => $page) {
3415 if (isset($page['elements']) && !empty($page['elements'])) {
3416 foreach ($page['elements'] as $element_key => $element) {
3417 $field_values = array();
3418 if ($element['type'] == 'e2pdf-input' || ($element['type'] == 'e2pdf-signature' && !class_exists('FrmSigAppHelper'))) {
3419 $field_values = FrmFieldsHelper::setup_new_vars('text', $item);
3420 } elseif ($element['type'] == 'e2pdf-signature' && class_exists('FrmSigAppHelper')) {
3421 $field_values = FrmFieldsHelper::setup_new_vars('signature', $item);
3422 } elseif ($element['type'] == 'e2pdf-textarea') {
3423 $field_values = FrmFieldsHelper::setup_new_vars('textarea', $item);
3424 } elseif ($element['type'] == 'e2pdf-select') {
3425 $field_values = FrmFieldsHelper::setup_new_vars('select', $item);
3426 $field_values['options'] = array();
3427 if (isset($element['properties']['options'])) {
3428 $field_options = explode("\n", $element['properties']['options']);
3429 foreach ($field_options as $option) {
3430 $field_values['options'][] = $option;
3431 }
3432 }
3433 } elseif ($element['type'] == 'e2pdf-checkbox') {
3434 $field_key = array_search($element['name'], array_column($checkboxes, 'name'));
3435 if ($field_key !== false) {
3436 $checkboxes[$field_key]['options'][] = $element['properties']['option'];
3437 $pages[$page_key]['elements'][$element_key]['value'] = '[' . $checkboxes[$field_key]['element_id'] . ']';
3438 } else {
3439 $field_values = FrmFieldsHelper::setup_new_vars('checkbox', $item);
3440 $field_values['options'] = array();
3441 }
3442 } elseif ($element['type'] == 'e2pdf-radio') {
3443 if (isset($element['properties']['group']) && $element['properties']['group']) {
3444 $element['name'] = $element['properties']['group'];
3445 } else {
3446 $element['name'] = $element['element_id'];
3447 }
3448
3449 $field_key = array_search($element['name'], array_column($radios, 'name'));
3450 if ($field_key !== false) {
3451 $radios[$field_key]['options'][] = $element['properties']['option'];
3452 $pages[$page_key]['elements'][$element_key]['value'] = '[' . $radios[$field_key]['element_id'] . ']';
3453 } else {
3454 $field_values = FrmFieldsHelper::setup_new_vars('radio', $item);
3455 $field_values['options'] = array();
3456 }
3457 }
3458
3459 $field_id = !empty($field_values) ? FrmField::create($field_values) : false;
3460 if ($field_id) {
3461 $field = FrmField::getOne($field_id);
3462 $labels = array();
3463
3464 if ($auto_form_shortcode) {
3465 $labels[] = get_option('e2pdf_formidable_use_keys', '0') ? '[' . $field->field_key . ']' : '[' . $field->id . ']';
3466 }
3467
3468 if ($auto_form_label && $auto_form_label == 'value' && isset($element['value']) && $element['value']) {
3469 $labels[] = $element['value'];
3470 } elseif ($auto_form_label && $auto_form_label == 'name' && isset($element['name']) && $element['name']) {
3471 $labels[] = $element['name'];
3472 }
3473
3474 if (!empty($labels)) {
3475 $update = array(
3476 'name' => implode(' ', $labels),
3477 );
3478 FrmField::update($field_id, $update);
3479 }
3480
3481 if ($element['type'] == 'e2pdf-textarea') {
3482 $pages[$page_key]['elements'][$element_key]['value'] = get_option('e2pdf_formidable_use_keys', '0') ? '[' . $field->field_key . ' wpautop=0]' : '[' . $field->id . ' wpautop=0]';
3483 } else {
3484 $pages[$page_key]['elements'][$element_key]['value'] = get_option('e2pdf_formidable_use_keys', '0') ? '[' . $field->field_key . ']' : '[' . $field->id . ']';
3485 }
3486
3487 if (isset($element['properties']['esig'])) {
3488 unset($pages[$page_key]['elements'][$element_key]['properties']['esig']);
3489 }
3490
3491 if ($element['type'] == 'e2pdf-checkbox') {
3492 $checkboxes[] = array(
3493 'name' => $element['name'],
3494 'element_id' => $field_id,
3495 'field_id' => $field->id,
3496 'options' => array(
3497 $element['properties']['option'],
3498 ),
3499 );
3500 } elseif ($element['type'] == 'e2pdf-radio') {
3501 $radios[] = array(
3502 'name' => $element['name'],
3503 'element_id' => $field_id,
3504 'field_id' => $field->id,
3505 'options' => array(
3506 $element['properties']['option'],
3507 ),
3508 );
3509 }
3510 }
3511 }
3512 }
3513 }
3514
3515 foreach ($checkboxes as $element) {
3516 $update = array(
3517 'options' => $element['options'],
3518 );
3519 FrmField::update($element['field_id'], $update);
3520 }
3521
3522 foreach ($radios as $element) {
3523 $update = array(
3524 'options' => $element['options'],
3525 );
3526 FrmField::update($element['field_id'], $update);
3527 }
3528
3529 $template->set('pages', $pages);
3530 }
3531 }
3532
3533 return $template;
3534 }
3535
3536 /**
3537 * Init Visual Mapper data
3538 * @return bool|string - HTML data source for Visual Mapper
3539 */
3540 public function visual_mapper() {
3541
3542 $html = '';
3543 $source = '';
3544
3545 if ($this->get('item') && class_exists('FrmformsController')) {
3546 $child = false;
3547 if ($this->get('cached_form') && !empty($this->get('cached_form')->parent_form_id)) {
3548 $child = true;
3549 $this->set('item', $this->get('cached_form')->parent_form_id);
3550 }
3551 if (class_exists('FrmProFieldsHelper')) {
3552 add_filter('frm_get_paged_fields', array($this, 'filter_remove_pagebreaks'), 9);
3553 }
3554 add_filter('frm_show_new_entry_page', array($this, 'filter_frm_show_new_entry_page'), 99);
3555 add_filter('frm_pre_display_form', array($this, 'filter_frm_pre_display_form'));
3556 $source = FrmformsController::show_form($this->get('item'), '', true, true);
3557 if (class_exists('FrmProFieldsHelper')) {
3558 remove_filter('frm_get_paged_fields', array($this, 'filter_remove_pagebreaks'), 9);
3559 }
3560 remove_filter('frm_show_new_entry_page', array($this, 'filter_frm_show_new_entry_page'), 99);
3561 remove_filter('frm_pre_display_form', array($this, 'filter_frm_pre_display_form'));
3562 if ($source) {
3563 $dom = new DOMDocument();
3564 $html = $this->helper->load('convert')->load_html($source, $dom, true);
3565 }
3566 if (!$source) {
3567 return '<div class="e2pdf-vm-error">' . __("The form source is empty or doesn't exist", 'e2pdf') . '</div>';
3568 } elseif (!$html) {
3569 return '<div class="e2pdf-vm-error">' . __('The form could not be parsed due the incorrect HTML', 'e2pdf') . '</div>';
3570 } else {
3571
3572 $xml = $this->helper->load('xml');
3573 $xpath = new DomXPath($dom);
3574
3575 // remove by name
3576 $remove_by_name = array(
3577 'frm_action',
3578 'form_id',
3579 'frm_hide_fields_' . $this->get('item'),
3580 'form_key',
3581 '0',
3582 'frm_submit_entry_' . $this->get('item'),
3583 '_wp_http_referer',
3584 'item_key',
3585 'frm_state',
3586 );
3587 foreach ($remove_by_name as $key => $name) {
3588 $elements = $xpath->query('//*[@name="' . $name . '"]');
3589 foreach ($elements as $element) {
3590 $element->parentNode->removeChild($element);
3591 }
3592 }
3593
3594 // remove by class
3595 $remove_by_class = array(
3596 'frm_ajax_loading',
3597 'wp-editor-tools',
3598 'quicktags-toolbar',
3599 'frm_button_submit',
3600 'frm_range_value',
3601 'star-rating',
3602 'frm_repeat_buttons',
3603 'frm_save_draft',
3604 'frm_final_submit',
3605 'frm_verify',
3606 );
3607 foreach ($remove_by_class as $key => $class) {
3608 $elements = $xpath->query("//*[contains(@class, '{$class}')]");
3609 foreach ($elements as $element) {
3610 $element->parentNode->removeChild($element);
3611 }
3612 }
3613
3614 // remove by tag
3615 $remove_by_tag = array(
3616 'link',
3617 'style',
3618 'script',
3619 );
3620 foreach ($remove_by_tag as $key => $tag) {
3621 $elements = $xpath->query('//' . $tag);
3622 foreach ($elements as $element) {
3623 $element->parentNode->removeChild($element);
3624 }
3625 }
3626
3627 // remove classes
3628 $remove_classes = array(
3629 'wp-editor-container',
3630 'frm_logic_form',
3631 'frm_pos_none',
3632 );
3633 foreach ($remove_classes as $key => $class) {
3634 $elements = $xpath->query("//*[contains(@class, '{$class}')]");
3635 foreach ($elements as $element) {
3636 $xml->set_node_value($element, 'class', str_replace($class, '', $xml->get_node_value($element, 'class')));
3637 }
3638 }
3639
3640 // remove styles
3641 $remove_styles = array(
3642 'frm_toggle_container',
3643 );
3644 foreach ($remove_styles as $key => $class) {
3645 $elements = $xpath->query("//*[contains(@class, '{$class}')]");
3646 foreach ($elements as $element) {
3647 $xml->set_node_value($element, 'style', '');
3648 }
3649 }
3650
3651 /*
3652 * Metas patterns to replace field names
3653 * @since 0.01.42
3654 */
3655 $metas_pattern = [
3656 '/item_meta\[(?:.*?)\]\[0\]\[(.*?)\](?:\[\])?/i' => $child ? '$1' : '$1:1',
3657 '/item_meta\[(.*?)\](\[\])?/i' => '$1',
3658 ];
3659
3660 // replace names
3661 $metas = $xpath->query("//*[contains(@name, 'item_meta')]");
3662 foreach ($metas as $element) {
3663 $field_id = preg_replace(array_keys($metas_pattern), $metas_pattern, $xml->get_node_value($element, 'name'));
3664 if (get_option('e2pdf_formidable_use_keys', '0') && class_exists('FrmField')) {
3665 if (strpos($field_id, ':') !== false) {
3666 $repeat_data = explode(':', $field_id);
3667 if (isset($repeat_data['0'])) {
3668 $field_data = FrmField::getOne($repeat_data['0']);
3669 if ($field_data) {
3670 $field_id = $field_data->field_key . ':1';
3671 }
3672 }
3673 } else {
3674 $field_data = FrmField::getOne($field_id);
3675 if ($field_data) {
3676 $field_id = $field_data->field_key;
3677 }
3678 }
3679 }
3680 $xml->set_node_value($element, 'name', $field_id);
3681 }
3682
3683 $frm_combo_inputs_container = $xpath->query("//*[contains(@class, 'frm_combo_inputs_container')]");
3684 foreach ($frm_combo_inputs_container as $element) {
3685 $inputs = $xpath->query('.//input', $element);
3686 $selects = $xpath->query('.//select', $element);
3687
3688 foreach ($selects as $key => $sub_element) {
3689 $field_data = array();
3690 preg_match('/(.*?)\[(.*?)\]/i', $xml->get_node_value($sub_element, 'name'), $field_data);
3691 if (!empty($field_data) && isset($field_data[1]) && isset($field_data[2])) {
3692 $field_id = $field_data[1] . ' show="' . $field_data[2] . '"';
3693 $xml->set_node_value($sub_element, 'name', $field_id);
3694 }
3695 }
3696
3697 foreach ($inputs as $key => $sub_element) {
3698 $field_data = array();
3699 preg_match('/(.*?)\[(.*?)\]/i', $xml->get_node_value($sub_element, 'name'), $field_data);
3700 if (!empty($field_data) && isset($field_data[1]) && isset($field_data[2])) {
3701 $field_id = $field_data[1] . ' show="' . $field_data[2] . '"';
3702 $xml->set_node_value($sub_element, 'name', $field_id);
3703 }
3704 }
3705 }
3706
3707 $frm_dropzone = $xpath->query("//*[contains(@class, 'frm_dropzone')]/parent::*");
3708 foreach ($frm_dropzone as $element) {
3709 $dropzone = $xpath->query(".//*[contains(@class, 'frm_dropzone')]", $element)->item(0);
3710 $input = $xpath->query('.//input', $element)->item(0);
3711 if ($input && $dropzone) {
3712 $input_cloned = $input->cloneNode(true);
3713
3714 $xml->set_node_value($input_cloned, 'type', 'text');
3715 $xml->set_node_value($input_cloned, 'value', __('File Upload', 'formidable'));
3716 $xml->set_node_value($input_cloned, 'style', 'width: 100%; height: 200px; text-align: center;');
3717
3718 if (strpos($xml->get_node_value($input_cloned, 'name'), ':') !== false) {
3719 $xml->set_node_value($input_cloned, 'name', $xml->get_node_value($input_cloned, 'name') . ' size="full" show_image="0" add_link="0"');
3720 } else {
3721 $xml->set_node_value($input_cloned, 'name', $xml->get_node_value($input_cloned, 'name') . ' size="full"');
3722 }
3723
3724 $input->parentNode->replaceChild($input_cloned, $input);
3725 $dropzone->parentNode->removeChild($dropzone);
3726 }
3727 }
3728
3729 // replace signature
3730 $sigpad = $xpath->query("//*[contains(@class, 'sigPad')]");
3731 foreach ($sigpad as $element) {
3732 $input = $xpath->query('.//input', $element)->item(0);
3733 if ($input) {
3734 $input_cloned = $input->cloneNode(true);
3735
3736 $field_id = preg_replace('/\[(.*?)\]/i', '', $xml->get_node_value($input_cloned, 'name'));
3737 if (get_option('e2pdf_formidable_use_keys', '0') && class_exists('FrmField')) {
3738 $field_data = FrmField::getOne($field_id);
3739 if ($field_data) {
3740 $field_id = $field_data->field_key;
3741 }
3742 }
3743
3744 $xml->set_node_value($input_cloned, 'style', 'width: 300px; height: 100px;');
3745 $xml->set_node_value($input_cloned, 'name', $field_id);
3746 $element->parentNode->replaceChild($input_cloned, $element);
3747 }
3748 }
3749
3750 // replace names
3751 $fields = $xpath->query('//input');
3752 foreach ($fields as $element) {
3753
3754 $image_options = false;
3755 $separate_value = false;
3756
3757 if (class_exists('FrmField') && ($xml->get_node_value($element, 'type') == 'checkbox' || $xml->get_node_value($element, 'type') == 'radio')) {
3758
3759 $field_id = $xml->get_node_value($element, 'name');
3760 if (false !== strpos($xml->get_node_value($element, 'name'), ':')) {
3761 $field_id = substr($xml->get_node_value($element, 'name'), 0, strpos($xml->get_node_value($element, 'name'), ':'));
3762 }
3763 if (preg_match('/\[(other(.*?[^\]]))\]/', $field_id)) {
3764 $field_id = preg_replace('/\[(other(.*?[^\]]))\]/', '', $field_id);
3765 }
3766
3767 $field_data = FrmField::getOne($field_id);
3768
3769 if (isset($field_data->field_options['image_options']) && $field_data->field_options['image_options']) {
3770 $image_options = true;
3771 }
3772
3773 if (isset($field_data->field_options['separate_value']) && $field_data->field_options['separate_value']) {
3774 $separate_value = true;
3775 }
3776
3777 if (isset($field_data->type) && $field_data->type === 'data' && isset($field_data->field_options['form_select'])) {
3778 $dynamic_form_id = false;
3779 $dynamic_field_id = false;
3780
3781 $dynamic_field_id = $field_data->field_options['form_select'];
3782 $dynamic_field_data = FrmField::getOne($dynamic_field_id);
3783 if ($dynamic_field_data) {
3784 $dynamic_form_id = $dynamic_field_data->form_id;
3785 }
3786
3787 $options = array();
3788 if (class_exists('FrmEntry') && class_exists('FrmEntryMeta')) {
3789 $where = array(
3790 'it.form_id' => $dynamic_form_id,
3791 );
3792 $entries_tmp = FrmEntry::getAll($where, ' ORDER BY id ASC');
3793 foreach ($entries_tmp as $key => $entry) {
3794 $options[] = array(
3795 'label' => FrmEntryMeta::get_meta_value($entry, $dynamic_field_id),
3796 'value' => $key,
3797 );
3798 }
3799 }
3800 $field_data->options = $options;
3801 }
3802
3803 if (isset($field_data->options) && is_array($field_data->options)) {
3804
3805 $field_options = $field_data->options;
3806 $field_value = $xml->get_node_value($element, 'value');
3807
3808 $field_key = false;
3809 foreach ($field_options as $fv_key => $fv) {
3810 if (isset($fv['value']) && $fv['value'] == $field_value) {
3811 $field_key = $fv_key;
3812 break;
3813 }
3814 }
3815
3816 if ($field_key !== false) {
3817 if ($image_options && $separate_value) {
3818 $field_label = isset($field_options[$field_key]['value']) ? $field_options[$field_key]['value'] : $field_value;
3819 } else {
3820 $field_label = isset($field_options[$field_key]['label']) ? $field_options[$field_key]['label'] : $field_value;
3821 }
3822 $xml->set_node_value($element, 'value', $field_label);
3823 } elseif ($xml->get_node_value($element, 'type') == 'radio') {
3824 $xml->set_node_value($element, 'value', '[' . $field_id . ' show="value" key="other"]');
3825 } else {
3826 $field_key = array_search($field_value, $field_options);
3827 if ($field_key !== false) {
3828 $xml->set_node_value($element, 'value', '[' . $field_id . ' show="value" key="' . $field_key . '"]');
3829 }
3830 }
3831 }
3832 }
3833
3834 $name = false;
3835 if ($xml->get_node_value($element, 'type') == 'text') {
3836 if (preg_match('/other\[(.*?[^\]])\]\[(other(.*?[^\]]))\]/', $xml->get_node_value($element, 'name'))) {
3837 $name = preg_replace('/other\[(.*?[^\]])\]\[(other(.*?[^\]]))\]/', '$1 show="value" key="$2"', $xml->get_node_value($element, 'name'));
3838 } elseif (preg_match('/other\[(.*?[^\]])\]/', $xml->get_node_value($element, 'name'))) {
3839 $name = preg_replace('/other\[(.*?[^\]])\]/', '$1 show="value" key="other"', $xml->get_node_value($element, 'name'));
3840 }
3841 } elseif ($xml->get_node_value($element, 'type') == 'checkbox') {
3842 if (preg_match('/\[(other(.*?[^\]]))\]/', $xml->get_node_value($element, 'name'))) {
3843 $name = preg_replace('/\[(other(.*?[^\]]))\]/', '', $xml->get_node_value($element, 'name'));
3844 } else {
3845 if ($image_options) {
3846 $name = $xml->get_node_value($element, 'name') . ' show="value"';
3847 }
3848 }
3849 } elseif ($xml->get_node_value($element, 'type') == 'radio') {
3850 if ($image_options) {
3851 $name = $xml->get_node_value($element, 'name') . ' show="value"';
3852 }
3853 }
3854
3855 if (!$name) {
3856 $name = $xml->get_node_value($element, 'name');
3857 }
3858
3859 $xml->set_node_value($element, 'name', '[' . $name . ']');
3860 }
3861
3862 // replace names
3863 $textareas = $xpath->query('//textarea');
3864 foreach ($textareas as $element) {
3865 $xml->set_node_value($element, 'name', '[' . $xml->get_node_value($element, 'name') . ' wpautop=0]');
3866 }
3867
3868 // replace names
3869 $selects = $xpath->query('//select');
3870 foreach ($selects as $element) {
3871
3872 if (class_exists('FrmField')) {
3873
3874 $options = $xpath->query('.//option', $element);
3875 $field_id = $xml->get_node_value($element, 'name');
3876
3877 /* Time Field names */
3878 if (false !== strpos($xml->get_node_value($element, 'name'), ':')) {
3879 $field_id = substr($xml->get_node_value($element, 'name'), 0, strpos($xml->get_node_value($element, 'name'), ':'));
3880 }
3881 $field_id = str_replace(array('[H]', '[m]', '[A]'), '', $field_id);
3882
3883 $field_data = FrmField::getOne($field_id);
3884 if (isset($field_data->type) && $field_data->type === 'lookup') {
3885 foreach ($options as $option) {
3886 $option->parentNode->removeChild($option);
3887 }
3888 $wrapper = $dom->createElement('option');
3889 $wrapper_atts = array(
3890 'value' => '[e2pdf-frm-lookup-values id="' . $field_id . '"]',
3891 );
3892 foreach ($wrapper_atts as $key => $value) {
3893 $attr = $dom->createAttribute($key);
3894 $attr->value = $value;
3895 $wrapper->appendChild($attr);
3896 }
3897 $element->appendChild($wrapper);
3898 } elseif (isset($field_data->type) && $field_data->type === 'data') {
3899 foreach ($options as $option) {
3900 $option->parentNode->removeChild($option);
3901 }
3902 $wrapper = $dom->createElement('option');
3903 $wrapper_atts = array(
3904 'value' => '[e2pdf-frm-data-values id="' . $field_id . '"]',
3905 );
3906 foreach ($wrapper_atts as $key => $value) {
3907 $attr = $dom->createAttribute($key);
3908 $attr->value = $value;
3909 $wrapper->appendChild($attr);
3910 }
3911 $element->appendChild($wrapper);
3912 } elseif (isset($field_data->type) && $field_data->type === 'time') {
3913 $replace = array(
3914 '[m]' => ' format="i"',
3915 '[A]' => ' format="A"',
3916 );
3917 if (isset($field_data->field_options['clock']) && $field_data->field_options['clock'] == '12') {
3918 $replace['[H]'] = ' format="g"';
3919 } else {
3920 $replace['[H]'] = ' format="H"';
3921 }
3922 $xml->set_node_value($element, 'name', str_replace(array_keys($replace), $replace, $xml->get_node_value($element, 'name')));
3923 }
3924
3925 if (isset($field_data->options) && is_array($field_data->options)) {
3926 $field_options = $field_data->options;
3927 foreach ($options as $option) {
3928 $field_value = $xml->get_node_value($option, 'value');
3929 foreach ($field_options as $field_option) {
3930 if (isset($field_option['value']) && $field_option['value'] === $field_value) {
3931 $field_label = isset($field_option['label']) ? $field_option['label'] : $field_value;
3932 $xml->set_node_value($option, 'value', $field_label);
3933 }
3934 }
3935 }
3936 }
3937 }
3938 $xml->set_node_value($element, 'name', '[' . $xml->get_node_value($element, 'name') . ']');
3939 }
3940
3941 // show total formatted fields
3942 $total_formatted = $xpath->query("//*[contains(@class, 'frm_total_formatted')]/parent::*");
3943 foreach ($total_formatted as $element) {
3944 $elements = $xpath->query("//*[contains(@class, 'frm_hidden')]");
3945 foreach ($elements as $element) {
3946 $xml->set_node_value($element, 'class', str_replace('frm_hidden', '', $xml->get_node_value($element, 'class')));
3947 }
3948 }
3949
3950 if (defined('LIBXML_HTML_NOIMPLIED') && defined('LIBXML_HTML_NODEFDTD')) {
3951 return str_replace(array('<html>', '</html>'), '', $dom->saveHTML());
3952 } else {
3953 return $dom->saveHTML();
3954 }
3955 }
3956 }
3957 return false;
3958 }
3959
3960 /**
3961 * Convert Field name to Value
3962 * @since 0.01.34
3963 * @param string $name - Field name
3964 * @return bool|string - Converted value or false
3965 */
3966 public function auto_map($name = false) {
3967
3968 $item = $this->get('item');
3969
3970 if ($item && class_exists('FrmField')) {
3971 $where = array(
3972 'fi.form_id' => (int) $item,
3973 array(
3974 'or' => 1,
3975 'fi.field_key' => $name,
3976 'fi.name' => $name,
3977 ),
3978 );
3979 $field = FrmField::getAll($where, 'id ASC', '1');
3980
3981 if ($field && is_object($field)) {
3982 $field_id = get_option('e2pdf_formidable_use_keys', '0') ? $field->field_key : $field->id;
3983 if ($field->type == 'textarea' || $field->type == 'rte') {
3984 return '[' . $field_id . ' wpautop=0]';
3985 } else {
3986 return '[' . $field_id . ']';
3987 }
3988 }
3989 }
3990
3991 return false;
3992 }
3993
3994 /**
3995 * Load additional shortcodes for this extension
3996 */
3997 public function load_shortcodes() {
3998 add_shortcode('e2pdf-frm-entry-values', array($this, 'shortcode_e2pdf_frm_entry_values'));
3999 add_shortcode('e2pdf-frm-lookup-values', array($this, 'shortcode_e2pdf_frm_lookup_values'));
4000 add_shortcode('e2pdf-frm-data-values', array($this, 'shortcode_e2pdf_frm_data_values'));
4001 add_shortcode('e2pdf-frm-repeatable', array($this, 'shortcode_e2pdf_frm_repeatable'));
4002 }
4003
4004 /**
4005 * [e2pdf-frm-repeatable id="entry_id' field_id="field_id"] shortcode
4006 * @param array $atts - Atributes for shortcode
4007 * @return string - Output of shortcode
4008 */
4009 public function shortcode_e2pdf_frm_repeatable($atts = array()) {
4010 $id = (int) $atts['id'];
4011 $field_id = $atts['field_id'];
4012
4013 $response = '[frm-field-value field_id="' . $field_id . '" entry="' . $id . '"]';
4014 return $response;
4015 }
4016
4017 /**
4018 * [e2pdf-frm-entry-values id='{form_id}' field_id='{field_id}' separator=''] shortcode
4019 * @param array $atts - Atributes for shortcode
4020 * @return string - Output of shortcodes
4021 */
4022 public function shortcode_e2pdf_frm_entry_values($atts = array()) {
4023 $form_id = (int) $atts['id'];
4024 $field_id = $atts['field_id'];
4025 $separator = isset($atts['separator']) ? $atts['separator'] : "\r\n";
4026
4027 $response = '';
4028 $values = array();
4029 if ($form_id && $field_id && class_exists('FrmEntry') && class_exists('FrmEntryMeta')) {
4030
4031 $where = array(
4032 'it.form_id' => $form_id,
4033 );
4034 $entries_tmp = FrmEntry::getAll($where, ' ORDER BY id ASC');
4035 foreach ($entries_tmp as $key => $entry) {
4036 $values[] = FrmEntryMeta::get_meta_value($entry, $field_id);
4037 }
4038 }
4039 $response = implode($separator, $values);
4040 return $response;
4041 }
4042
4043 /**
4044 * [e2pdf-frm-lookup-values id='{field_id}'] shortcode
4045 * @param array $atts - Atributes for shortcode
4046 * @return string - Output of shortcode
4047 */
4048 public function shortcode_e2pdf_frm_lookup_values($atts = array()) {
4049
4050 $id = isset($atts['id']) ? $atts['id'] : false;
4051 $user_id = isset($atts['user_id']) ? $atts['user_id'] : '0';
4052 $separator = isset($atts['separator']) ? $atts['separator'] : "\r\n";
4053
4054 $response = '';
4055 $values = array();
4056
4057 if ($id && class_exists('FrmField') && class_exists('FrmAppHelper') && class_exists('FrmFieldsHelper')) {
4058 $field = FrmField::getOne($id);
4059 if ($field && $field->type === 'lookup') {
4060
4061 $frm_filter = false;
4062 if (class_exists('FrmProFieldsHelper') && method_exists('FrmProFieldsHelper', 'add_default_field_settings')) {
4063 if (!has_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings')) {
4064 add_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings', 10, 2);
4065 $frm_filter = true;
4066 }
4067 }
4068
4069 $args = array();
4070 if (is_admin()) {
4071 $original_user_id = get_current_user_id();
4072 wp_set_current_user($user_id);
4073 if (!current_user_can('administrator')) {
4074 add_filter('frm_lookup_is_current_user_filter_needed', array($this, 'filter_frm_lookup_is_current_user_filter_needed'), 10, 3);
4075 }
4076 }
4077
4078 $field_array = FrmAppHelper::start_field_array($field);
4079 FrmFieldsHelper::prepare_new_front_field($field_array, $field, $args);
4080 $field_array = array_merge($field->field_options, $field_array);
4081 if (isset($field_array['options']) && is_array($field_array['options'])) {
4082 $values = $field_array['options'];
4083 }
4084
4085 if (is_admin()) {
4086 if (!current_user_can('administrator')) {
4087 remove_filter('frm_lookup_is_current_user_filter_needed', array($this, 'filter_frm_lookup_is_current_user_filter_needed'));
4088 }
4089 wp_set_current_user($original_user_id);
4090 }
4091 if ($frm_filter) {
4092 remove_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings');
4093 }
4094 }
4095 }
4096
4097 $response = implode($separator, $values);
4098 return $response;
4099 }
4100
4101 /**
4102 * [e2pdf-frm-data-values id='{field_id}'] shortcode
4103 * @param array $atts - Atributes for shortcode
4104 * @return string - Output of shortcode
4105 */
4106 public function shortcode_e2pdf_frm_data_values($atts = array()) {
4107
4108 $id = isset($atts['id']) ? $atts['id'] : false;
4109 $user_id = isset($atts['user_id']) ? $atts['user_id'] : '0';
4110 $separator = isset($atts['separator']) ? $atts['separator'] : "\r\n";
4111
4112 $response = '';
4113 $values = array();
4114
4115 if ($id && class_exists('FrmField') && class_exists('FrmAppHelper') && class_exists('FrmFieldsHelper')) {
4116 $field = FrmField::getOne($id);
4117 if ($field && $field->type === 'data') {
4118 $frm_filter = false;
4119 if (class_exists('FrmProFieldsHelper') && method_exists('FrmProFieldsHelper', 'add_default_field_settings')) {
4120 if (!has_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings')) {
4121 add_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings', 10, 2);
4122 $frm_filter = true;
4123 }
4124 }
4125
4126 $args = array();
4127 if (is_admin()) {
4128 $original_user_id = get_current_user_id();
4129 wp_set_current_user($user_id);
4130 if (current_user_can('administrator')) {
4131 $field->field_options['restrict'] = '0';
4132 }
4133 }
4134
4135 $field_array = FrmAppHelper::start_field_array($field);
4136 FrmFieldsHelper::prepare_new_front_field($field_array, $field, $args);
4137
4138 $field_array = array_merge($field->field_options, $field_array);
4139 if (isset($field_array['options']) && is_array($field_array['options'])) {
4140 $values = $field_array['options'];
4141 }
4142
4143 if (is_admin()) {
4144 wp_set_current_user($original_user_id);
4145 }
4146 if ($frm_filter) {
4147 remove_filter('frm_default_field_options', 'FrmProFieldsHelper::add_default_field_settings');
4148 }
4149 }
4150 }
4151
4152 $response = implode($separator, $values);
4153 return $response;
4154 }
4155
4156 /**
4157 * Get styles for generating Map Field function
4158 * @return array - List of css files to load
4159 */
4160 public function styles($item_id = false) {
4161
4162 $styles = array();
4163 if (class_exists('FrmStylesHelper')) {
4164 $uploads = FrmStylesHelper::get_upload_base();
4165 $saved_css_path = '/formidable/css/formidablepro.css';
4166 if (is_readable($uploads['basedir'] . $saved_css_path)) {
4167 $url = $uploads['baseurl'] . $saved_css_path;
4168 } else {
4169 $url = admin_url('admin-ajax.php?action=frmpro_css');
4170 }
4171 $styles[] = $url;
4172 $styles[] = plugins_url('css/extension/formidable.css?v=' . time(), $this->helper->get('plugin_file_path'));
4173 }
4174 return $styles;
4175 }
4176
4177 public function merged_items() {
4178 return true;
4179 }
4180
4181 public function hook_formidable_entry_view($entry) {
4182 if (!empty($entry->form_id)) {
4183 $hooks = $this->helper->load('hooks')->get('formidable', 'hook_formidable_entry_view', $entry->form_id);
4184 if (!empty($hooks)) {
4185 echo '<h3>' . apply_filters('e2pdf_hook_section_title', __('E2Pdf Actions', 'e2pdf'), 'hook_formidable_entry_view') . '</h3>';
4186 echo '<div class="inside">';
4187 foreach ($hooks as $hook) {
4188 if ($this->helper->load('hooks')->process_hook(
4189 $hook,
4190 [
4191 'dataset' => $entry->id,
4192 ],
4193 'hook_formidable_entry_view'
4194 )
4195 ) {
4196 $action = apply_filters(
4197 'e2pdf_hook_action_button',
4198 array(
4199 'html' => '<div class="misc-pub-section"><a class="e2pdf-download-hook" target="_blank" title="%2$s" href="%1$s"><span class="dashicons dashicons-pdf"></span> %2$s</a></div>',
4200 'url' => $this->helper->get_url(
4201 array(
4202 'page' => 'e2pdf',
4203 'action' => 'export',
4204 'id' => $hook,
4205 'dataset' => $entry->id,
4206 ), 'admin.php?'
4207 ),
4208 'title' => 'PDF #' . $hook,
4209 ), 'hook_formidable_entry_view', $hook, $entry->id
4210 );
4211 if (!empty($action)) {
4212 echo sprintf(
4213 $action['html'], $action['url'], $action['title']
4214 );
4215 }
4216 }
4217 }
4218 echo '</div>';
4219 }
4220 }
4221 }
4222
4223 public function hook_formidable_entry_edit($entry) {
4224 if (!empty($entry->form_id)) {
4225 $hooks = $this->helper->load('hooks')->get('formidable', 'hook_formidable_entry_edit', $entry->form_id);
4226 if (!empty($hooks)) {
4227 echo '<h3>' . apply_filters('e2pdf_hook_section_title', __('E2Pdf Actions', 'e2pdf'), 'hook_formidable_entry_view') . '</h3>';
4228 echo '<div class="inside">';
4229 foreach ($hooks as $hook) {
4230 if ($this->helper->load('hooks')->process_hook(
4231 $hook,
4232 [
4233 'dataset' => $entry->id,
4234 ],
4235 'hook_formidable_entry_edit'
4236 )
4237 ) {
4238 $action = apply_filters(
4239 'e2pdf_hook_action_button',
4240 array(
4241 'html' => '<div class="misc-pub-section"><a class="e2pdf-download-hook" target="_blank" title="%2$s" href="%1$s"><span class="dashicons dashicons-pdf"></span> %2$s</a></div>',
4242 'url' => $this->helper->get_url(
4243 array(
4244 'page' => 'e2pdf',
4245 'action' => 'export',
4246 'id' => $hook,
4247 'dataset' => $entry->id,
4248 ), 'admin.php?'
4249 ),
4250 'title' => 'PDF #' . $hook,
4251 ), 'hook_formidable_entry_edit', $hook, $entry->id
4252 );
4253 if (!empty($action)) {
4254 echo sprintf(
4255 $action['html'], $action['url'], $action['title']
4256 );
4257 }
4258 }
4259 }
4260 echo '</div>';
4261 }
4262 }
4263 }
4264
4265 public function hook_formidable_row_actions($actions, $entry) {
4266 if (!empty($entry->form_id) && !empty($entry->id)) {
4267 $hooks = $this->helper->load('hooks')->get('formidable', 'hook_formidable_row_actions', $entry->form_id);
4268 foreach ($hooks as $hook) {
4269 if ($this->helper->load('hooks')->process_hook(
4270 $hook,
4271 [
4272 'dataset' => $entry->id,
4273 ],
4274 'hook_formidable_row_actions'
4275 )
4276 ) {
4277 $action = apply_filters(
4278 'e2pdf_hook_action_button',
4279 array(
4280 'html' => '<a class="e2pdf-download-hook" target="_blank" href="%s">%s</a>',
4281 'url' => $this->helper->get_url(
4282 array(
4283 'page' => 'e2pdf',
4284 'action' => 'export',
4285 'id' => $hook,
4286 'dataset' => $entry->id,
4287 ), 'admin.php?'
4288 ),
4289 'title' => 'PDF #' . $hook,
4290 ), 'hook_formidable_row_actions', $hook, $entry->id
4291 );
4292 if (!empty($action)) {
4293 $actions['e2pdf_' . $hook] = sprintf(
4294 $action['html'], $action['url'], $action['title']
4295 );
4296 }
4297 }
4298 }
4299 }
4300 return $actions;
4301 }
4302 }
4303