diff --git a/assets/.gitkept b/assets/.gitkept deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/includes/class-integration.php b/includes/class-integration.php index f85830defcb58de4f72360b54a6d70b02a051363..a31ce80725c5aa7e93866a1386bb9e85df3be486 100644 --- a/includes/class-integration.php +++ b/includes/class-integration.php @@ -10,42 +10,66 @@ abstract class Integration extends Singleton { abstract public function serialize_submission($submission, $form); abstract public function serialize_form($form); - abstract public function get_uploads($submission, $form_data); - abstract public function init(); + abstract public function get_uploads($submission, $form_data); + abstract public function init(); protected function __construct() { add_action('init', [$this, 'init']); + + add_filter('option_wpct-erp-forms_rest-api', function ($setting) { + return $this->populate_refs($setting); + }, 10, 1); + add_filter('option_wpct-erp-forms_rpc-api', function ($setting) { + return $this->populate_refs($setting); + }, 10, 1); + add_action('update_option', function ($option, $from, $to) { + if ($option === 'wpct-erp-forms_rest-api' || $option === 'wpct-erp-forms_rpc-api') { + foreach ($to['forms'] as $form) { + $this->set_form_ref($form['form_id'], $form['ref']); + } + } + }, 10, 3); } public function submit($payload, $endpoints, $uploads, $form_data) { $success = true; - foreach ($endpoints as $endpoint) { + foreach ($endpoints as $proto => $urls) { + foreach ($urls as $url) { + if (!$success) { + continue; + } - if (empty($uploads)) { - $response = Wpct_Http_Client::post($endpoint, $payload); - } else { - $response = Wpct_Http_Client::post_multipart($endpoint, $payload, $uploads); - } + if ($proto === 'rpc') { + $data = $this->rpc_payload($payload); + } else { + $data = $payload; + } + if (empty($uploads)) { + $response = Wpct_Http_Client::post($url, $data); + } else { + $response = Wpct_Http_Client::post_multipart($url, $data, $uploads); + } - if (!$response) { - $success = false; + $success = $success && (bool) $response; + } + } - $settings = get_option('wpct-erp-forms_general'); - if (!isset($settings['notification_receiver'])) { - return; - } + if (!$success) { + $email = Settings::get_setting('wpct-erp-forms', 'general', 'notification_receiver'); + if (empty($email)) { + return; + } - $to = $settings['notification_receiver']; - $subject = 'Wpct ERP Forms Error'; - $body = "Form ID: {$form_data['id']}\n"; - $body .= "Form title: {$form_data['title']}"; - $body .= 'Submission: ' . print_r($payload, true); - $success = wp_mail($to, $subject, $body); - if (!$success) { - throw new Exception('Error while submitting form ' . $form_data['id']); - } + $to = $email; + $subject = 'Wpct ERP Forms Error'; + $body = "Form ID: {$form_data['id']}\n"; + $body .= "Form title: {$form_data['title']}"; + $body .= 'Submission: ' . print_r($payload, true); + $success = wp_mail($to, $subject, $body); + if (!$success) { + throw new Exception('Error while submitting form ' . $form_data['id']); } } @@ -55,7 +79,7 @@ abstract class Integration extends Singleton public function do_submission($submission, $form) { $form_data = $this->serialize_form($form); - if (!$this->has_endpoints($form_data['id'])) { + if ($form_data['ref'] === null) { return; } @@ -76,7 +100,7 @@ abstract class Integration extends Singleton $this->cleanup_empties($data); $payload = apply_filters('wpct_erp_forms_payload', $data, $uploads, $form_data); - $endpoints = apply_filters('wpct_erp_forms_endpoints', $this->get_endpoints($form_data['id']), $payload, $uploads, $form_data); + $endpoints = apply_filters('wpct_erp_forms_endpoints', $this->get_form_endpoints($form_data['id']), $payload, $uploads, $form_data); do_action('wpct_erp_forms_before_submission', $payload, $uploads, $form_data); $success = $this->submit($payload, $endpoints, $uploads, $form_data); @@ -99,31 +123,37 @@ abstract class Integration extends Singleton return $submission; } - public function has_endpoints($form_id) - { - return sizeof($this->get_endpoints($form_id)) > 0; - } - - private function get_endpoints($form_id) + private function get_form_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; - } - ); + $rest_forms = Settings::get_setting('wpct-erp-forms', 'rest-api', 'forms'); + $rpc_forms = Settings::get_setting('wpct-erp-forms', 'rpc-api', 'forms'); + $rpc_endpoint = Settings::get_setting('wpct-erp-forms', 'rpc-api', 'endpoint'); + + $endpoints = [ + 'rpc' => $rpc_forms, + 'rest' => $rest_forms, + ]; + + foreach ($endpoints as $proto => $forms) { + $endpoints[$proto] = array_map(function ($form) use ($rpc_endpoint) { + return isset($form['endpoint']) ? $form['endpoint'] : $rpc_endpoint; + }, array_filter( + $forms, + function ($form) use ($form_id) { + return (string) $form['form_id'] === (string) $form_id; + } + )); + } - return array_map(function ($map) { - return $map['endpoint']; - }, $maps); + return $endpoints; } public function get_form_ref($form_id) { - $setting = get_option('wpct-erp-forms_api', ['endpoints' => []]); - foreach ($setting['endpoints'] as $endpoint) { - if ((string) $endpoint['form_id'] === (string) $form_id) { - return isset($endpoint['ref']) ? $endpoint['ref'] : null; + $setting = get_option('wpct-erp-forms_refs', []); + foreach ($setting as $ref_id => $ref) { + if ((string) $ref_id === (string) $form_id) { + return $ref; } } @@ -132,14 +162,46 @@ abstract class Integration extends Singleton public function set_form_ref($form_id, $ref) { - $setting = get_option('wpct-erp-forms_api', ['endpoints' => []]); - for ($i = 0; $i < count($setting['endpoints']); $i++) { - if ((string) $setting['endpoints'][$i]['form_id'] === (string) $form_id) { - $endpoints[$i]['ref'] = $ref; - break; + $setting = get_option('wpct-erp-forms_refs', []); + $setting[$form_id] = $ref; + update_option('wpct-erp-forms_refs', $setting); + } + + private function populate_refs($setting) + { + $refs = get_option('wpct-erp-forms_refs', []); + for ($i = 0; $i < count($setting['forms']); $i++) { + $form = $setting['forms'][$i]; + if (!isset($refs[$form['form_id']])) { + continue; } + $form['ref'] = $refs[$form['form_id']]; + $setting['forms'][$i] = $form; } - update_option('wpct-erp-forms_api', $setting); + return $setting; + } + + private function rpc_payload($payload) + { + $setting = Settings::get_setting('wpct-erp-forms', 'rpc-api'); + + return [ + 'jsonrpc' => '2.0', + 'method' => 'call', + 'id' => time(), + 'params' => [ + 'service' => 'object', + 'method' => 'execute', + 'args' => [ + $setting['database'], + $setting['user'], + $setting['password'], + $setting['model'], + 'create', + $payload + ] + ] + ]; } } diff --git a/includes/class-settings.php b/includes/class-settings.php index 17cb1e7feebfbdb24cf5265516afc2e2b09984f0..82577286c9012487f5c68c74ed926a84e4f9c48b 100644 --- a/includes/class-settings.php +++ b/includes/class-settings.php @@ -18,27 +18,31 @@ class Settings extends BaseSettings public function register() { - $setting_name = $this->group_name . '_general'; - $this->register_setting($setting_name, [ - 'notification_receiver' => [ - 'type' => 'string' - ], - ], [ - 'notification_receiver' => 'admin@' . parse_url(get_bloginfo('url'))['host'], - ]); - - $setting_name = $this->group_name . '_api'; + $host = parse_url(get_bloginfo('url'))['host']; $this->register_setting( - $setting_name, + 'general', [ - 'protocol' => [ + 'notification_receiver' => [ + 'type' => 'string', + ], + 'base_url' => [ 'type' => 'string', - 'enum' => [ - 'JSON-RPC', - 'JSON-REST' - ] ], - 'endpoints' => [ + 'api_key' => [ + 'type' => 'string', + ], + ], + [ + 'notification_receiver' => 'admin@' . $host, + 'base_url' => 'https://erp.' . $host, + 'api_key' => '', + ], + ); + + $this->register_setting( + 'rest-api', + [ + 'forms' => [ 'type' => 'array', 'items' => [ 'form_id' => 'number', @@ -48,12 +52,52 @@ class Settings extends BaseSettings ] ], [ - 'protocol' => 'JSON-RPC', - 'endpoints' => [ + 'forms' => [ + [ + 'endpoint' => '/api/crm-lead', + 'form_id' => null, + 'ref' => null + ] + ] + ] + ); + + $this->register_setting( + 'rpc-api', + [ + 'endpoint' => [ + 'type' => 'string' + ], + 'user' => [ + 'type' => 'string' + ], + 'password' => [ + 'type' => 'string' + ], + 'database' => [ + 'type' => 'string' + ], + 'model' => [ + 'type' => 'string' + ], + 'forms' => [ + 'type' => 'array', + 'items' => [ + 'form_id' => 'string', + 'ref' => 'string' + ] + ] + ], + [ + 'endpoint' => '/jsonrpc', + 'user' => 'admin', + 'password' => 'admin', + 'database' => 'default', + 'model' => 'crm.lead', + 'forms' => [ [ - 'endpoint' => '/wp-json/wp/v2', 'form_id' => 0, - 'ref' => '' + 'ref' => null ] ] ] @@ -62,34 +106,20 @@ class Settings extends BaseSettings protected function input_render($setting, $field, $value) { - if (preg_match('/^endpoints.*form_id$/', $field)) { + if (preg_match('/^forms.*form_id$/', $field)) { return $this->render_forms_dropdown($setting, $field, $value); - } elseif ($field === 'api_protocol') { - return $this->render_protocol_radio($setting, $field, $value); } return parent::input_render($setting, $field, $value); } - private function render_protocol_radio($setting, $field, $value) - { - $options = ['JSON REST API', 'JSON-RPC']; - $fieldset = '<fieldset class="structure-selection">'; - foreach ($options as $option) { - $fieldset .= "<div class='row'><input type='radio' id=name='{$setting}[{$field}]' name='{$setting}[{$field}]' value={$option}><div><label for=name='{$setting}[{$field}]'>Description</div></div>"; - } - - $fieldset .= '</fieldset>'; - return $fieldset; - } - private function render_forms_dropdown($setting, $field, $value) { $forms = self::get_forms(); - $options = array_map(function ($form) use ($value) { + $options = array_merge(['<option value=""></option>'], array_map(function ($form) use ($value) { $selected = $form->id == $value ? 'selected' : ''; return "<option value='{$form->id}' {$selected}>{$form->title}</option>"; - }, $forms); + }, $forms)); return "<select name='{$setting}[{$field}]'>" . implode('', $options) . '</select>'; } } diff --git a/includes/integrations/wpcf7/class-integration.php b/includes/integrations/wpcf7/class-integration.php index f04efc81484ae69456092e2532e07a43c0624333..28ccdea78a4c677748151a548b46a35e560f2e5f 100644 --- a/includes/integrations/wpcf7/class-integration.php +++ b/includes/integrations/wpcf7/class-integration.php @@ -2,7 +2,7 @@ namespace WPCT_ERP_FORMS\WPCF7; -use WPCT_ERP_FORMS\Abstract\Integration as BaseIntegration; +use WPCT_ERP_FORMS\Integration as BaseIntegration; class Integration extends BaseIntegration { @@ -13,22 +13,6 @@ class Integration extends BaseIntegration add_filter('wpcf7_before_send_mail', function ($form, &$abort, $submission) { $this->do_submission($submission, $form); }, 10, 3); - - // add_action('wpcf7_save_contact_form', function ($form, $args, $context) { - // $field = array_filter($form->scan_form_tags(), function ($tag) { - // $field = $this->serialize_field($tag, null); - // return $field['name'] === 'erp_form_ref'; - // }); - - // if (sizeof($field) === 0) { - // return; - // } else { - // $field = $field[0]; - // $ref = $field->get_option('default')[0]; - // } - - // do_action('wpct_erp_forms_ref', ['form_id' => $form->id(), 'ref' => $ref]); - // }, 10, 3); } public function init() diff --git a/wpct-erp-forms.php b/wpct-erp-forms.php index 2f63e879e7dd53b5ffdf3d9d1305cfc7444805ac..d75f73628720e523a4e54b858535ac80ec294fbd 100755 --- a/wpct-erp-forms.php +++ b/wpct-erp-forms.php @@ -34,7 +34,6 @@ require_once 'wpct-i18n/wpct-i18n.php'; require_once 'includes/class-integration.php'; require_once 'includes/class-menu.php'; require_once 'includes/class-settings.php'; -require_once 'includes/class-rest-controller.php'; class Wpct_Erp_Forms extends BasePlugin { @@ -68,12 +67,13 @@ class Wpct_Erp_Forms extends BasePlugin array_unshift($links, $link); return $links; }, 5, 2); - - new REST_Controller(); } public function init() { + add_filter('option_wpct-http-bridge_general', function () { + return Settings::get_setting('wpct-erp-forms', 'general'); + }); } public static function activate() diff --git a/wpct-http-bridge b/wpct-http-bridge index 427059d1c82c9506b9471f63c1c5700be7ceb653..f625b3c83f952ff5e2d7c9d10453bab2bed146e3 160000 --- a/wpct-http-bridge +++ b/wpct-http-bridge @@ -1 +1 @@ -Subproject commit 427059d1c82c9506b9471f63c1c5700be7ceb653 +Subproject commit f625b3c83f952ff5e2d7c9d10453bab2bed146e3 diff --git a/wpct-i18n b/wpct-i18n index b4cfb8c2641380f160f5f147f5b6167a4d2fcba3..dfda2d8fc482fc8c8ccbd6e44f77578edd11d88b 160000 --- a/wpct-i18n +++ b/wpct-i18n @@ -1 +1 @@ -Subproject commit b4cfb8c2641380f160f5f147f5b6167a4d2fcba3 +Subproject commit dfda2d8fc482fc8c8ccbd6e44f77578edd11d88b