芝麻web文件管理V1.00
编辑当前文件:/home/royashxg/www/wp-content/plugins/fluentformpro/src/Integrations/ZohoCRM/Bootstrap.php
logo = fluentFormMix('img/integrations/zohocrm.png'); $this->description = 'Zoho CRM is an online Sales CRM software that manages your sales, marketing and support in one CRM platform.'; $this->registerAdminHooks(); add_filter('fluentform/save_integration_value_' . $this->integrationKey, [$this, 'validate'], 10, 3); add_action('admin_init', function () { if (isset($_REQUEST['ff_zohocrm_auth'])) { $client = $this->getRemoteClient(); if (isset($_REQUEST['code'])) { // Get the access token now $code = sanitize_text_field($_REQUEST['code']); $settings = $this->getGlobalSettings([]); $settings = $client->generateAccessToken($code, $settings); if (!is_wp_error($settings)) { $settings['status'] = true; update_option($this->optionKey, $settings, 'no'); } wp_redirect(admin_url('admin.php?page=fluent_forms_settings#general-zohocrm-settings')); exit(); } else { $client->redirectToAuthServer(); } die(); } }); // add_filter('fluentform/notifying_async_zohocrm', '__return_false'); add_filter( 'fluentform/get_integration_values_zohocrm', [$this, 'resolveIntegrationSettings'], 100, 3 ); } public function getGlobalFields($fields) { return [ 'logo' => $this->logo, 'menu_title' => __('Zoho CRM Settings', 'fluentformpro'), 'menu_description' => __($this->description, 'fluentformpro'), 'valid_message' => __('Your Zoho CRM API Key is valid', 'fluentformpro'), 'invalid_message' => __('Your Zoho CRM API Key is not valid', 'fluentformpro'), 'save_button_text' => __('Save Settings', 'fluentformpro'), 'config_instruction' => $this->getConfigInstructions(), 'fields' => [ 'accountUrl' => [ 'type' => 'select', 'placeholder' => __('Your Zoho CRM Account URL', 'fluentformpro'), 'label_tips' => __("Please Choose your Zoho CRM Account URL", 'fluentformpro'), 'label' => __('Account URL', 'fluentformpro'), 'options' => [ 'https://accounts.zoho.com' => 'US', 'https://accounts.zoho.com.au' => 'AU', 'https://accounts.zoho.eu' => 'EU', 'https://accounts.zoho.in' => 'IN', 'https://accounts.zoho.com.cn' => 'CN', ] ], 'client_id' => [ 'type' => 'text', 'placeholder' => __('Zoho CRM Client ID', 'fluentformpro'), 'label_tips' => __("Enter your Zoho CRM Client ID, if you do not have
Please login to your Zoho CRM account and go to
Zoho Developer Console
", 'fluentformpro'), 'label' => __('Zoho CRM Client ID', 'fluentformpro'), ], 'client_secret' => [ 'type' => 'password', 'placeholder' => __('Zoho CRM Client Secret', 'fluentformpro'), 'label_tips' => __("Enter your Zoho CRM Key, if you do not have
Please login to your Zoho CRM account and go to
Zoho Developer Console
", 'fluentformpro'), 'label' => __('Zoho CRM Client Secret', 'fluentformpro'), ], ], 'hide_on_valid' => true, 'discard_settings' => [ 'section_description' => __('Your Zoho CRM integration is up and running', 'fluentformpro'), 'button_text' => __('Disconnect Zoho CRM', 'fluentformpro'), 'data' => [ 'accountUrl' => '', 'client_id' => '', 'client_secret' => '' ], 'show_verify' => true ] ]; } public function getGlobalSettings($settings) { $globalSettings = get_option($this->optionKey); if (!$globalSettings) { $globalSettings = []; } $defaults = [ 'accountUrl' => '', 'client_id' => '', 'client_secret' => '', 'status' => '', 'access_token' => '', 'refresh_token' => '', 'expire_at' => false ]; return wp_parse_args($globalSettings, $defaults); } public function saveGlobalSettings($settings) { $integrationSettings = array(); $err_msg = 'Error: Authorization info missing.'; $err = false; if (empty($settings['client_secret'])) { $integrationSettings['client_secret'] = ''; $err_msg = 'Client Secret is required'; $err = true; } if (empty($settings['client_id'])) { $integrationSettings['client_id'] = ''; $err_msg = 'Client Id is required'; $err = true; } if (empty($settings['accountUrl'])) { $integrationSettings['accountUrl'] = ''; $err_msg = 'Choose an account Url.'; $err = true; } if ($err) { $integrationSettings['status'] = false; update_option($this->optionKey, $integrationSettings, 'no'); wp_send_json_error([ 'message' => __($err_msg, 'fluentformpro'), 'status' => false ], 400); } // Verify API key now try { $oldSettings = $this->getGlobalSettings([]); $oldSettings['accountUrl'] = esc_url_raw($settings['accountUrl']); $oldSettings['client_id'] = sanitize_text_field($settings['client_id']); $oldSettings['client_secret'] = sanitize_text_field($settings['client_secret']); $oldSettings['status'] = false; update_option($this->optionKey, $oldSettings, 'no'); wp_send_json_success([ 'message' => __('You are being redirected to authenticate', 'fluentformpro'), 'redirect_url' => admin_url('?ff_zohocrm_auth=1') ], 200); } catch (\Exception $exception) { wp_send_json_error([ 'message' => $exception->getMessage() ], 400); } } public function getIntegrationDefaults($settings, $formId) { $name = $this->app->request->get('serviceName', ''); $listId = $this->app->request->get('serviceId', ''); return [ 'name' => $name, 'list_id' => $listId, 'other_fields' => [ [ 'item_value' => '', 'label' => '' ] ], 'conditionals' => [ 'conditions' => [], 'status' => false, 'type' => 'all' ], 'enabled' => true ]; } public function pushIntegration($integrations, $formId) { $integrations[$this->integrationKey] = [ 'title' => $this->title . ' Integration', 'logo' => $this->logo, 'is_active' => $this->isConfigured(), 'configure_title' => __('Configuration required!', 'fluentformpro'), 'global_configure_url' => admin_url('admin.php?page=fluent_forms_settings#general-zohocrm-settings'), 'configure_message' => __('Zoho CRM is not configured yet! Please configure your Zoho CRM api first', 'fluentformpro'), 'configure_button_text' => __('Set Zoho CRM API', 'fluentformpro') ]; return $integrations; } public function getSettingsFields($settings, $formId) { $fieldSettings = [ 'fields' => [ [ 'key' => 'name', 'label' => __('Name', 'fluentformpro'), 'required' => true, 'placeholder' => __('Your Feed Name', 'fluentformpro'), 'component' => 'text' ], [ 'key' => 'list_id', 'label' => __('Services', 'fluentformpro'), 'placeholder' => __('Choose Service', 'fluentformpro'), 'required' => true, 'component' => 'refresh', 'options' => $this->getServices() ], ], 'button_require_list' => false, 'integration_title' => $this->title ]; $listId = $this->app->request->get( 'serviceId', Arr::get($settings, 'list_id') ); if ($listId) { $fields = $this->getFields($listId); $fields = array_merge($fieldSettings['fields'], $fields); $fieldSettings['fields'] = $fields; } $fieldSettings['fields'] = array_merge($fieldSettings['fields'], [ [ 'require_list' => false, 'key' => 'conditionals', 'label' => __('Conditional Logics', 'fluentformpro'), 'tips' => __('Allow this integration conditionally based on your submission values', 'fluentformpro'), 'component' => 'conditional_block' ], [ 'require_list' => false, 'key' => 'enabled', 'label' => __('Status', 'fluentformpro'), 'component' => 'checkbox-single', 'checkbox_label' => __('Enable This feed', 'fluentformpro') ] ]); return $fieldSettings; } public function resolveIntegrationSettings($settings, $feed, $formId) { $serviceName = $this->app->request->get('serviceName', ''); $serviceId = $this->app->request->get('serviceId', ''); if ($serviceName) { $settings['name'] = $serviceName; } if ($serviceId) { $settings['list_id'] = $serviceId; } return $settings; } public function getMergeFields($list, $listId, $formId) { return false; } public function validate($settings, $integrationId, $formId) { $error = false; $errors = array(); foreach ($this->getFields($settings['list_id']) as $field){ if ($field['required'] && empty($settings[$field['key']])) { $error = true; $errors[$field['key']] = [__($field['label'].' is required', 'fluentformpro')]; } } if ($error){ wp_send_json_error([ 'message' => __('Validation Failed', 'fluentformpro'), 'errors' => $errors ], 423); } return $settings; } public function notify($feed, $formData, $entry, $form) { $feedData = $feed['processedValues']; $list_id = $feedData['list_id']; if (!$list_id) { do_action('fluentform/integration_action_result', $feed, 'failed', __('Skipped insert Zoho CRM feed data for missing Service Id.', 'fluentformpro')); return false; } list ($formattedMainFields, $formattedOtherFields) = $this->getFormattedFields($list_id); $postData = []; $tags = null; foreach ($formattedMainFields as $fieldName => $mainField) { $fieldValue = Arr::get($feedData, $fieldName); if ($mainField['required'] && empty($fieldValue)) { do_action('fluentform/integration_action_result', $feed, 'failed', __("Skipped insert Zoho CRM $list_id data for missing required value. Field: " . $fieldName . '.' , 'fluentformpro')); return false; } if (!empty($fieldValue)) { if ('Tag' == $fieldName) { $tags = $fieldValue; continue; } switch ($mainField['data_type']) { case 'email' : $value = sanitize_email($fieldValue); break; case 'date' : if (strstr($fieldValue, '/')) { $fieldValue = str_replace('/', '.', $fieldValue); } $date = new \Datetime($fieldValue); $value = $date->format('Y-m-d'); break; case 'datetime': if (strstr($fieldValue, '/')) { $fieldValue = str_replace('/', '.', $fieldValue); } $datetime = new \Datetime($fieldValue); $value = $datetime->format("c"); break; default: $value = sanitize_text_field($fieldValue); break; } $postData[$fieldName] = $value; } } if(!empty($feedData['other_fields'])){ foreach ($feedData['other_fields'] as $otherField){ $fieldName = Arr::get($otherField, 'label'); $fieldValue = Arr::get($otherField, 'item_value'); if(!empty($fieldName) && !empty($fieldValue)){ $fieldType = Arr::get($formattedOtherFields, $fieldName . '.data_type'); if ('textarea' == $fieldType) { $fieldValue = sanitize_textarea_field($fieldValue); } $postData[$fieldName] = $fieldValue; } } } $client = $this->getRemoteClient(); $response = $client->insertModuleData($list_id, $postData); if (is_wp_error($response)) { // it's failed do_action('fluentform/integration_action_result', $feed, 'failed', __('Failed to insert Zoho CRM feed. Details : ', 'fluentformpro') . $response->get_error_message()); } else { // It's success do_action('fluentform/integration_action_result', $feed, 'success', __('Zoho CRM feed has been successfully inserted ', 'fluentformpro') . $list_id . __(' data.', 'fluentformpro')); // update record tags if ($tags && $recordId = Arr::get($response, 'data.0.details.id')) { try { $client->addTags($list_id, $recordId, $tags); } catch (\Exception $e) { // ... } } } } protected function getFormattedFields($list_id) { $mainFields = $otherFields = array(); $client = $this->getRemoteClient(); $response = $client->getAllFields($list_id); if (!is_wp_error($response) && $fields = Arr::get($response,'fields')) { foreach ($fields as $field) { $fieldName = Arr::get($field, 'api_name'); $fieldType = Arr::get($field, 'data_type'); if (!$fieldName || !$fieldType) { continue; } if ($this->isMainField($field)) { $mainFields[$fieldName] = [ 'required' => Arr::isTrue($field,'system_mandatory'), 'data_type' => $fieldType, ]; } elseif ($this->isOtherField($field)) { $otherFields[$fieldName] = [ 'required' => Arr::isTrue($field,'system_mandatory'), 'data_type' => $fieldType, ]; } } } return [$mainFields, $otherFields]; } protected function getServices() { $client = $this->getRemoteClient(); $response = $client->getAllModules(); $services_options = array(); if (is_wp_error($response)) { return $services_options; } if ($response['modules']) { $services = $response['modules']; $availableServices = [ 'Leads', 'Contacts', 'Accounts', 'Deals', 'Tasks', 'Cases', 'Vendors', 'Solutions', 'Campaigns' ]; foreach ($services as $service) { $validService = $service['creatable'] && $service['global_search_supported'] && in_array($service['api_name'], $availableServices); if ($validService) { $services_options[$service['api_name']] = $service['singular_label']; } } } return $services_options; } protected function getFields($module_key) { $client = $this->getRemoteClient(); $response = $client->getAllFields($module_key); if (is_wp_error($response)) { return false; } $fields = array(); if ($response['fields']) { $others_fields = array(); foreach ($response['fields'] as $field) { if ($this->isMainField($field)) { $data = array( 'key' => $field['api_name'], 'placeholder' => __($field['display_label'], 'fluentformpro'), 'label' => __($field['field_label'], 'fluentformpro'), 'required' => false, 'tips' => __('Enter ' . $field['display_label'] . ' value or choose form input provided by shortcode.', 'fluentformpro'), 'component' => 'value_text' ); if ($field['system_mandatory']) { $data['required'] = true; $data['tips'] = __($field['display_label'] . ' is a required field. Enter value or choose form input provided by shortcode.', 'fluentformpro'); } if($field['data_type'] == 'datetime'){ $data['tips'] = __($field['display_label'] . ' is a required field. Enter value or choose form input shortcode.
Make sure format is (01/01/2022 00:00 +0:00)', 'fluentformpro'); } if ($field['data_type'] == 'picklist' && $field['pick_list_values']) { $data['component'] = 'select'; $data['tips'] = __("Choose " . $field['display_label'] . " type in select list.", 'fluentformpro'); $data_options= array(); foreach ($field['pick_list_values'] as $option) { $data_options[$option['display_value']] = $option['display_value']; } $data['options'] = $data_options; } if ($field['data_type'] == 'textarea') { $data['component'] = 'value_textarea'; } $fields[] = $data; } elseif ($this->isOtherField($field)) { $others_fields[$field['api_name']] = $field['field_label']; } } if (!empty($others_fields)) { $fields[] = [ 'key' => 'other_fields', 'require_list' => false, 'required' => false, 'label' => __('Other Fields', 'fluentformpro'), 'tips' => __('Select which Fluent Forms fields pair with their respective Zoho crm modules fields.
Field value must be string type.', 'fluentformpro'), 'component' => 'dropdown_many_fields', 'field_label_remote' => __('Others Field', 'fluentformpro'), 'field_label_local' => __('Others Field', 'fluentformpro'), 'options' => $others_fields ]; } } return $fields; } protected function isMainField($field) { return $field['system_mandatory'] || 'picklist' == $field['data_type'] || 'email' == $field['data_type'] || 'Tag' == $field['api_name']; } protected function isOtherField($field) { return in_array(Arr::get($field, 'data_type'), ['text', 'textarea', 'integer', 'website', 'phone', 'double', 'currency']); } protected function getConfigInstructions() { ob_start(); ?>
To Authenticate Zoho CRM First you need to register your application with Zoho CRM.
To register, Go to
Zoho Developer Console
.
Choose a client type:
Web Based:
Applications that are running on a dedicated HTTP server.
Note:
No other client type allowed.
Enter the following details:
Client Name:
The name of your application you want to register with Zoho.
Homepage URL:
The URL of your web page. Your site url
Authorized Redirect URIs:
Your app redirect url must be
Click CREATE. You will receive the Client ID and Client Secret. Copy the Client Id and Client Secret.
Then go back to your Zoho CRM setting page and choose your account URL, also paste the Client Id and Secret Id in the input bellow.
Then save settings. You will be redirect to the Zoho CRM authorized page. Click Allow button for authorized.
Note:
If authorized successful you wil be redirected to the Zoho CRM settings page. If not you will see the error message on that page.
getGlobalSettings([]); return new ZohoCRM( $settings['accountUrl'], $settings ); } }