diff --git a/includes/abstract-integration.php b/includes/abstract-integration.php index 11820fda6064e14b93e32b9fc634a059dd704133..9c84d778a30e7ebefdbbf2a37325399ae290c460 100644 --- a/includes/abstract-integration.php +++ b/includes/abstract-integration.php @@ -261,7 +261,12 @@ abstract class Integration extends Singleton foreach ($pipes as $pipe) { if ($pipe['from'] === $field) { unset($payload[$field]); - $payload[$pipe['to']] = $this->cast($pipe['cast'], $value); + if ($pipe['cast'] !== 'null') { + $payload[$pipe['to']] = $this->cast( + $pipe['cast'], + $value + ); + } } } } @@ -293,6 +298,10 @@ abstract class Integration extends Singleton } catch (TypeError) { return []; } + case 'null': + return null; + default: + return (string) $value; } } diff --git a/includes/class-settings.php b/includes/class-settings.php index 4414146f8d2cf78cb5221f34aa3d2f637b3b4025..0be9dc11299eca2263d2094abab4978ed1212ed3 100644 --- a/includes/class-settings.php +++ b/includes/class-settings.php @@ -143,6 +143,7 @@ class Settings extends BaseSettings 'integer', 'float', 'json', + 'null', ], ], ], @@ -197,6 +198,7 @@ class Settings extends BaseSettings 'integer', 'float', 'json', + 'null', ], ], ], diff --git a/includes/integrations/wpforms/class-integration.php b/includes/integrations/wpforms/class-integration.php new file mode 100644 index 0000000000000000000000000000000000000000..76c300f3d78d050d735b62ec336a8b860dfa42ac --- /dev/null +++ b/includes/integrations/wpforms/class-integration.php @@ -0,0 +1,251 @@ +<?php + +namespace WPCT_ERP_FORMS\WPFORMS; + +use WPCT_ERP_FORMS\Integration as BaseIntegration; +use WP_Post; +use WPForms_Field_File_Upload; + +/** + * WPForms integration. + * + * @since 1.0.0 + */ +class Integration extends BaseIntegration +{ + /** + * Inherit parent constructor and hooks submissions to wpcf7_before_send_mail + * + * @since 0.0.1 + */ + protected function __construct() + { + parent::__construct(); + + add_action( + 'wpforms_process_complete', + function ($fields, $entry, $form_data, $entry_id) { + // $submission = wpforms()->obj('submission'); + // $submission->register($fields, $entry, $form_data['id'], $form_data); + $entry['fields'] = $fields; + $entry['entry_id'] = $entry_id; + $this->do_submission($entry, $form_data); + }, + 10, + 4 + ); + } + + /** + * Integration initializer to be fired on wp init. + * + * @since 0.0.1 + */ + protected function init() + { + } + + /** + * Retrive the current WPForms_Form_Handler data. + * + * @return array $form_data Form data array representation. + */ + public function get_form() + { + $form_id = !empty($_POST['wpforms']['id']) + ? absint($_POST['wpforms']['id']) + : 0; + if (!$form_id) { + return null; + } + + $form = wpforms()->obj('form')->get($form_id); + return $this->serialize_form($form); + } + + /** + * Retrive form data by ID. + * + * @since 3.0.0 + * + * @param int $form_id Form ID. + * @return array $form_data Form data. + */ + public function get_form_by_id($form_id) + { + $form = wpforms()->obj('form')->get($form_id); + if (!$form) { + return null; + } + + return $this->serialize_form($form); + } + + /** + * Retrive available forms data. + * + * @since 3.0.0 + * + * @return array $forms Collection of form data. + */ + public function get_forms() + { + $forms = wpforms()->obj('form')->get(); + return array_map(function ($form) { + return $this->serialize_form($form); + }, $forms); + } + + /** + * Retrive the current submission data. + * + * @since 3.0.0 + * + * @return array $submission Submission data. + */ + public function get_submission() + { + $form = $this->get_form(); + if (!$form) { + return null; + } + + $submission = $_POST['wpforms']; + $submission['fields'] = $_POST['wpforms']['complete']; + return $this->serialize_submission($submission, $form); + } + + /** + * Retrive the current submission uploaded files. + * + * @since 3.0.0 + * + * @return array $files Uploaded files data. + */ + public function get_uploads() + { + $submission = $this->get_submission(); + if (!$submission) { + return null; + } + + return $this->submission_uploads($submission, $this->get_form()); + } + + /** + * Serialize form data. + * + * @since 1.0.0 + * + * @param object $form WPCF7_ContactForm instance. + * @return array $form_data Form data. + */ + public function serialize_form($form) + { + $data = + $form instanceof WP_Post + ? wpforms_decode($form->post_content) + : $form; + + $form_id = (int) $data['id']; + return [ + 'id' => $form_id, + 'title' => $data['settings']['form_title'], + 'hooks' => apply_filters( + 'wpct_erp_forms_form_hooks', + null, + $form_id + ), + 'fields' => array_values( + array_map(function ($field) { + return $this->serialize_field($field); + }, $data['fields']) + ), + ]; + } + + /** + * Serialize form field data. + * + * @since 1.0.0 + * + * @param object $field WPCF7_FormTag instance. + * @param array $form_data Form data. + * @return array $field_data Field data. + */ + private function serialize_field($field) + { + return [ + 'id' => (int) $field['id'], + 'type' => $field['type'], + 'name' => $field['label'], + 'label' => $field['label'], + 'required' => $field['required'] == '1', + 'options' => isset($field['choices']) ? $field['choices'] : [], + 'conditional' => false, + ]; + } + + /** + * Serialize form submission data. + * + * @since 1.0.0 + * + * @param object $submission Submission instance. + * @param array $form Form data. + * @return array $submission_data Submission data. + */ + public function serialize_submission($submission, $form_data) + { + $data = [ + 'submission_id' => $submission['entry_id'], + ]; + + foreach ($submission['fields'] as $field) { + $data[$field['name']] = $field['value']; + } + + return $data; + } + + /** + * Get form submission uploaded files. + * + * @since 1.0.0 + * + * @param object $submission WPCF7_Submission instance. + * @param array $form_data Form data. + * @return array $uploads Uploaded files data. + */ + protected function submission_uploads($submission, $form_data) + { + $fields = wpforms_get_form_fields($form_data['id'], ['file-upload']); + if (empty($fields) || empty($_FILES)) { + return []; + } + + $files_keys = preg_filter( + '/^/', + 'wpforms_' . $form_data['id'] . '_', + array_keys($fields) + ); + $files = wp_list_filter(wp_array_slice_assoc($_FILES, $files_keys), [ + 'error' => 0, + ]); + + $uploads = []; + foreach ($fields as $field) { + if (empty($files_paths)) { + continue; + } + + $is_multi = sizeof($paths) > 1; + $uploads[$field['name']] = [ + 'path' => $is_multi ? $paths : $paths[0], + 'is_multi' => $is_multi, + ]; + } + + return $uploads; + } +} diff --git a/src/FormPipes/Table.jsx b/src/FormPipes/Table.jsx index 7ac57d8d0b980cc357765431887c579c77c8ddef..863c6645285aaa8c25e9d6511aff14cad62cbcb3 100644 --- a/src/FormPipes/Table.jsx +++ b/src/FormPipes/Table.jsx @@ -33,14 +33,22 @@ const castOptions = [ value: "json", label: __("JSON", "wpct-erp-forms"), }, + { + value: "null", + label: __("Ignore", "wpct-erp-forms"), + }, ]; export default function PipesTable({ formId, pipes, setPipes }) { const fields = useFormFields({ formId }); - const fromOptions = fields.map((field) => ({ - label: field.label, - value: field.name, - })); + const fromOptions = [ + { label: __("Submission ID", "wpct-erp-forms"), value: "submission_id" }, + ].concat( + fields.map((field) => ({ + label: field.label, + value: field.name, + })) + ); const setPipe = (attr, index, value) => { const newPipes = pipes.map((pipe, i) => { diff --git a/wpct-erp-forms.php b/wpct-erp-forms.php index d76038b29dbf0023a108af6c58c13d7ee05421e1..45aea3c6dd1c0c687eda2731ec1177d2044c072f 100755 --- a/wpct-erp-forms.php +++ b/wpct-erp-forms.php @@ -15,6 +15,7 @@ namespace WPCT_ERP_FORMS; use WPCT_ERP_FORMS\WPCF7\Integration as Wpcf7Integration; use WPCT_ERP_FORMS\GF\Integration as GFIntegration; +use WPCT_ERP_FORMS\WPFORMS\Integration as WPFormsIntegration; use WPCT_ABSTRACT\Plugin as BasePlugin; if (!defined('ABSPATH')) { @@ -131,6 +132,17 @@ class Wpct_Erp_Forms extends BasePlugin ) { require_once 'includes/integrations/gf/class-integration.php'; $this->_integrations['gf'] = GFIntegration::get_instance(); + } elseif ( + apply_filters( + 'wpct_is_plugin_active', + false, + 'wpforms-lite/wpforms.php' + ) + ) { + require_once 'includes/integrations/wpforms/class-integration.php'; + $this->_integrations[ + 'wpforms' + ] = WPFormsIntegration::get_instance(); } }