Skip to content
Snippets Groups Projects
Commit 89db69f2 authored by Lucas García's avatar Lucas García
Browse files

feat: wpcf7 integration

parent af880ae0
No related branches found
No related tags found
No related merge requests found
<?php
namespace WPCT_ERP_FORMS\Integrations;
use Exception;
class Integration
{
public function register()
{
}
public function submit($payload, $endpoints)
{
$success = true;
foreach ($endpoints as $endpoint) {
$response = wpct_oc_post_odoo($endpoint, $payload);
if (!$response) {
$success = false;
$settings = get_option('wpct_erp_forms_general');
if (!isset($settings['notification_receiver'])) return;
$to = $settings['notification_receiver'];
$subject = 'WPCT ERP Forms Error';
$body = "Form ID: {$form['id']}\n";
$body .= "Form title: {$form['title']}";
$body .= 'Submission: ' . print_r($payload, true);
wp_mail($to, $subject, $body);
}
}
return $success;
}
public function do_submission($submission, $form)
{
$form = $this->serialize_form($form);
if (!$this->has_endpoints($form['id'])) return;
$submission = $this->serialize_submission($submission, $form);
$submission = apply_filters('wpct_erp_forms_before_submission', $submission, $form);
$this->cleanup_empties($submission);
$payload = $this->get_payload($submission);
$endpoints = $this->get_endpoints($form['id']);
$success = $this->submit($payload, $endpoints);
if ($success) do_action('wpct_erp_forms_after_submission', $submission, $form);
else do_action('wpct_erp_forms_on_failure', $submission, $form);
}
public function get_payload($submission)
{
$payload = [
'name' => $submission['source_xml_id'] . ' submission: ' . $submission['id'],
'metadata' => []
];
foreach ($submission as $key => $val) {
if ($key == 'email_from') {
$payload[$key] = $val;
} elseif ($key === 'source_xml_id') {
$payload['source_xml_id'] = $val;
}
$payload['metadata'][] = [
'key' => $key,
'value' => $val
];
}
return $payload;
}
private function cleanup_empties(&$submission)
{
foreach ($submission as $key => $val) {
if (empty($val)) {
unset($submission[$key]);
}
}
return $submission;
}
public function has_endpoints($form_id)
{
return sizeof($this->get_endpoints($form_id)) > 0;
}
private function get_endpoints($form_id)
{
$maps = array_filter(
get_option('wpct_erp_forms_api', ['endpoints' => []])['endpoints'],
function ($map) use ($form_id) {
return (string) $map['form_id'] === (string) $form_id;
}
);
return array_map(function ($map) {
return $map['endpoint'];
}, $maps);
}
public function serialize_submission($submission, $form)
{
throw new Exception('Method to overwrite by inheritance');
}
public function serialize_form($form)
{
throw new Exception('Method to overwrite by inheritance');
}
}
<?php
namespace WPCT_ERP_FORMS\Integrations\WPCF7;
use WPCT_ERP_FORMS\Integrations\Integration;
class WPCF7 extends Integration
{
public function register()
{
parent::register();
add_filter('wpcf7_before_send_mail', function ($form, &$abort, $submission) {
$this->do_submission($submission, $form);
}, 10, 3);
}
public function serialize_submission($submission, $form = null)
{
$data = $submission->get_posted_data();
$data['id'] = $submission->get_posted_data_hash();
return $data;
}
public function serialize_form($form)
{
return [
'id' => $form->id(),
'title' => $form->title(),
'name' => $form->name(),
'properties' => $form->get_properties(),
'tag' => $form->unit_tag(),
'locale' => $form->locale(),
];
}
}
$wpct_erp_forms_wpct7 = new WPCF7();
$wpct_erp_forms_wpct7->register();
<?php
if (!defined('ABSPATH')) {
exit;
}
define('WPCT_ERP_FORMS_IBAN_FIELD_VERSION', '1.0');
add_action('gform_loaded', 'wpct_erp_forms_load_iban_field', 5);
function wpct_erp_forms_load_iban_field()
......
<?php
namespace WPCT_ERP_FORMS\Integrations;
use WPCT_ERP_FORMS\Integrations\Integration;
use Exception;
/* Custom fields */
require_once 'fields/iban/index.php';
class GF extends Integration
{
public function register()
{
parent::register();
add_action('gform_after_submission', function ($entry, $form) {
$this->do_submission($entry, $form);
}, 10, 2);
}
public function serialize_form($form)
{
return get_object_vars($form);
}
public function serialize_submission($entry, $form)
{
$entry_data = $this->get_entry_data($entry, $form);
$submission = $this->serialize_entry_data($entry_data);
$this->cleanup_empties($submission);
return $submission;
}
private function get_entry_data($entry, $form)
{
$submission = [
'entry_id' => $entry['id']
];
foreach ($form['fields'] as $field) {
if ($field->type === 'section') continue;
$input_name = $field->inputName
? $field->inputName
: ($field->adminLabel
? $field->adminLabel
: $field->label);
$inputs = $field->get_entry_inputs();
if (is_array($inputs)) {
// composed fields
$names = array_map(function ($input) {
return $input['name'];
}, $inputs);
if (sizeof(array_filter($names, fn ($name) => $name))) {
// Composed with subfields
for ($i = 0; $i < sizeof($inputs); $i++) {
if (empty($names[$i])) continue;
$submission[$names[$i]] = rgar($entry, (string) $inputs[$i]['id']);
}
} else {
// Plain composed
$values = [];
foreach ($inputs as $input) {
$value = rgar($entry, (string) $input['id']);
if ($input_name && $value) {
$value = $this->format_value($value, $field, $input);
if ($value !== null) $values[] = $value;
}
}
$submission[$input_name] = implode(',', $values);
}
} else {
// simple fields
if ($input_name) {
$raw_value = rgar($entry, (string) $field->id);
$submission[$input_name] = $this->format_value($raw_value, $field);
}
}
}
return $submission;
}
private function format_value($value, $field, $input = null)
{
try {
if ($field->type === 'fileupload' && $value && is_string($value)) {
return implode(',', json_decode($value));
} else if ($field->type === 'consent') {
if (isset($input['isHidden']) && $input['isHidden']) return null;
return $value;
}
} catch (Exception $e) {
// do nothing
}
return $value;
}
}
$wpct_erp_forms_gf = new GF();
$wpct_erp_forms_gf->register();
<?php
require_once 'Integration.php';
if (defined('WPCF7_VERSION')) {
require_once 'contactform7/index.php';
}
if (class_exists('GFForms')) {
require_once 'gravityforms/index.php';
}
<?php
/**
* Gent gform entry and form objects and parse it to a form values array
*/
function wpct_erp_forms_parse_form_entry($entry, $form)
{
$form_vals = [
'entry_id' => $entry['id']
];
foreach ($form['fields'] as $field) {
if ($field->type === 'section') continue;
$input_name = $field->inputName
? $field->inputName
: ($field->adminLabel
? $field->adminLabel
: $field->label);
$inputs = $field->get_entry_inputs();
if (is_array($inputs)) {
// composed fields
$names = array_map(function ($input) {
return $input['name'];
}, $inputs);
if (sizeof(array_filter($names, fn ($name) => $name))) {
// Composed with subfields
for ($i = 0; $i < sizeof($inputs); $i++) {
if (empty($names[$i])) continue;
$form_vals[$names[$i]] = rgar($entry, (string) $inputs[$i]['id']);
}
} else {
// Plain composed
$values = [];
foreach ($inputs as $input) {
$value = rgar($entry, (string) $input['id']);
if ($input_name && $value) {
$value = wpct_erp_forms_format_value($value, $field, $input);
if ($value !== null) $values[] = $value;
}
}
$form_vals[$input_name] = implode(',', $values);
}
} else {
// simple fields
if ($input_name) {
$raw_value = rgar($entry, (string) $field->id);
$form_vals[$input_name] = wpct_erp_forms_format_value($raw_value, $field);
}
}
}
return $form_vals;
}
function wpct_erp_forms_format_value($value, $field, $input = null)
{
try {
if ($field->type === 'fileupload' && $value && is_string($value)) {
return implode(',', json_decode($value));
} else if ($field->type === 'consent') {
if (isset($input['isHidden']) && $input['isHidden']) return null;
return $value;
}
} catch (Exception $e) {
// do nothing
}
return $value;
}
function wpct_erp_forms_add_cord_id($form_values)
{
......@@ -80,58 +10,3 @@ function wpct_erp_forms_add_cord_id($form_values)
return $form_values;
}
/**
* Remove empty fields from form submission
*/
function wpct_erp_forms_cleanup_empties($form_vals)
{
foreach ($form_vals as $key => $val) {
if (empty($val)) {
unset($form_vals[$key]);
}
}
return $form_vals;
}
/**
* Transform form submission array into a payload data structure
*/
function wpct_erp_forms_get_submission_payload($form_vals)
{
$payload = [
'name' => $form_vals['source_xml_id'] . ' submission: ' . $form_vals['entry_id'],
'metadata' => []
];
foreach ($form_vals as $key => $val) {
if ($key == 'company_id') {
$payload['company_id'] = (int) $val;
} elseif ($key == 'email_from') {
$payload[$key] = $val;
} elseif ($key === 'source_xml_id') {
$payload['source_xml_id'] = $val;
}
$payload['metadata'][] = [
'key' => $key,
'value' => $val
];
}
return $payload;
}
/**
* Pipe form submission transformations to get the submission post payload
*/
add_filter('wpct_erp_forms_prepare_submission', 'wpct_erp_forms_prepare_submission', 10, 2);
function wpct_erp_forms_prepare_submission($form_vals)
{
$form_vals = wpct_erp_forms_add_cord_id($form_vals);
$form_vals = wpct_erp_forms_cleanup_empties($form_vals);
return wpct_erp_forms_get_submission_payload($form_vals);
}
<?php
add_action('wpct_erp_after_submission', 'wpct_erp_forms_do_submissions', 10, 2);
function wpct_erp_forms_do_submissions($entry, $form)
{
$form_vals = wpct_erp_forms_parse_form_entry($entry, $form);
$endpoint = null;
array_filter(
get_option('wpct_erp_forms_api', ['endpoints' => []])['endpoints'],
function ($map) use ($form) {
if ((int) $map['form_id'] === (int) $form['id']) {
global $endpoint;
$endpoint = $map['endpoint'];
}
}
);
if ($endpoint === null) return;
$submission_payload = apply_filters('wpct_erp_forms_prepare_submission', $form_vals);
$response = wpct_oc_post_odoo($endpoint, $submission_payload);
if (!$response) {
$to = wpct_erp_forms_option_getter('wpct_erp_forms_general', 'notification_receiver');
$subject = 'Odoo subscription request submission error: Form(' . $form['id'] . ') Entry (' . $entry['id'] . ')';
$body = 'Submission subscription request for entry: ' . $entry['id'] . ' failed.<br/>Form id: ' . $form['id'] . "<br/>Form title: " . $form['title'];
wp_mail($to, $subject, $body);
}
}
......@@ -14,22 +14,20 @@
*/
/* Settings */
require_once "includes/options/index.php";
require_once 'includes/options/index.php';
/* Webhooks */
require_once "includes/webhooks.php";
require_once "includes/submissions.php";
require_once "includes/attachments.php";
require_once 'includes/attachments.php';
/* Fields population */
require_once "includes/fields-population.php";
require_once 'includes/fields-population.php';
/* Custom fields */
require_once "includes/fields/iban/index.php";
/* Integrations */
require_once 'includes/integrations/index.php';
/* Dependencies */
add_filter('wpct_dependencies_check', function ($dependencies) {
$dependencies['Gravity Forms'] = '<a href="https://www.gravityforms.com/">Gravity Forms</a>';
// $dependencies['Gravity Forms'] = '<a href="https://www.gravityforms.com/">Gravity Forms</a>';
$dependencies['Wpct Odoo Connect'] = '<a href="https://git.coopdevs.org/coopdevs/website/wp/wp-plugins/wpct-odoo-connect">Wpct Odoo Connect</a>';
return $dependencies;
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment