PluginProbe
FormsCRM – Connect Forms to CRM directly / 3.1
FormsCRM – Connect Forms to CRM directly v3.1
4.4.3 4.4.2 4.4.1 4.4.0 4.3.3 trunk 1.1.0 1.2.0 1.2.1 3.0 3.1 3.1.1 3.10.0 3.11.0 3.12.0 3.12.2 3.12.3 3.12.4 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.13.5 3.14.0 All 63 releases
formscrm / includes / class-gravityforms.php

class-gravityforms.php in FormsCRM – Connect Forms to CRM directly 3.1, at includes/class-gravityforms.php

450 lines 13.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Functions for CRM in Gravity Forms
4 *
5 * All helpers functions for Gravity Forms
6 *
7 * @package WordPress
8 * @author David Perez <david@closemarketing.net>
9 * @copyright 2019 Closemarketing
10 * @version 1.0
11 */
12
13 GFForms::include_feed_addon_framework();
14 global $formscrm_api;
15
16 class GFCRM extends GFFeedAddOn {
17
18 protected $_version = FORMSCRM_VERSION;
19 protected $_min_gravityforms_version = '1.9.0';
20 protected $_slug = 'formscrm';
21 protected $_path = 'formscrm/crm.php';
22 protected $_full_path = __FILE__;
23 protected $_url = 'https://www.formscrm.com';
24 protected $_title = 'CRM Add-On';
25 protected $_short_title = 'FormsCRM';
26
27 // Members plugin integration.
28 protected $_capabilities = array(
29 'formscrm',
30 'formscrm_uninstall',
31 );
32
33 // Permissions.
34 protected $_capabilities_settings_page = 'formscrm';
35 protected $_capabilities_form_settings = 'formscrm';
36 protected $_capabilities_uninstall = 'formscrm_uninstall';
37 protected $_enable_rg_autoupgrade = true;
38
39 private static $_instance = null;
40
41 private $crmlib;
42
43 public static function get_instance() {
44 if ( self::$_instance == null ) {
45 self::$_instance = new GFCRM();
46 }
47
48 return self::$_instance;
49 }
50 /**
51 * Init function of library
52 *
53 * @return void
54 */
55 public function init() {
56
57 parent::init();
58 load_plugin_textdomain( 'formscrm', FALSE, '/formscrm/languages' );
59
60 }
61
62 public function init_admin() {
63 parent::init_admin();
64
65 $this->ensure_upgrade();
66 }
67
68 /**
69 * Plugin settings
70 *
71 * @return void
72 */
73 public function plugin_settings_fields() {
74
75 global $formscrm_api;
76
77 return array(
78 array(
79 'title' => __( 'CRM Account Information', 'formscrm' ),
80 'description' => __( 'Use this connector with CRM software. Use Gravity Forms to collect customer information and automatically add them to your CRM Leads.', 'formscrm' ),
81 'fields' => array(
82 array(
83 'name' => 'fc_crm_type',
84 'label' => __( 'CRM Type', 'formscrm' ),
85 'type' => 'select',
86 'class' => 'medium',
87 'onchange' => 'jQuery(this).parents("form").submit();',
88 'choices' => formscrm_get_choices(),
89 ),
90 array(
91 'name' => 'fc_crm_url',
92 'label' => __( 'CRM URL', 'formscrm' ),
93 'type' => 'text',
94 'class' => 'medium',
95 'tooltip' => __( 'Use the URL with http and the ending slash /.', 'formscrm' ),
96 'tooltip_class' => 'tooltipclass',
97 'dependency' => array(
98 'field' => 'fc_crm_type',
99 'values' => formscrm_get_dependency_url(),
100 ),
101 ),
102 array(
103 'name' => 'fc_crm_username',
104 'label' => __( 'Username', 'formscrm' ),
105 'type' => 'text',
106 'class' => 'medium',
107 'dependency' => array(
108 'field' => 'fc_crm_type',
109 'values' => formscrm_get_dependency_username(),
110 ),
111 'feedback_callback' => $this->login_api_crm(),
112 ),
113 array(
114 'name' => 'fc_crm_password',
115 'label' => __('Password', 'formscrm' ),
116 'type' => 'api_key',
117 'class' => 'medium',
118 'tooltip' => __( 'Use the password of the actual user.', 'formscrm' ),
119 'tooltip_class' => 'tooltipclass',
120 'dependency' => array(
121 'field' => 'fc_crm_type',
122 'values' => formscrm_get_dependency_password(),
123 ),
124 ),
125 array(
126 'name' => 'fc_crm_apipassword',
127 'label' => __('API Password for User', 'formscrm'),
128 'type' => 'api_key',
129 'class' => 'medium',
130 //'feedback_callback' => $this->login_api_crm(),
131 'tooltip' => __('Find the API Password in the profile of the user in CRM.', 'formscrm'),
132 'tooltip_class' => 'tooltipclass',
133 'dependency' => array(
134 'field' => 'fc_crm_type',
135 'values' => formscrm_get_dependency_apipassword(),
136 ),
137 ),
138 array(
139 'name' => 'fc_crm_apisales',
140 'label' => __('Password and Security Key', 'formscrm'),
141 'type' => 'api_key',
142 'class' => 'medium',
143 'tooltip' => __( '"Password""SecurityKey" Go to My Settings / Reset my Security Key.', 'formscrm'),
144 'tooltip_class' => 'tooltipclass',
145 'dependency' => array(
146 'field' => 'fc_crm_type',
147 'values' => formscrm_get_dependency_apisales(),
148 ),
149 ),
150 array(
151 'name' => 'fc_crm_odoodb',
152 'label' => __( 'Odoo DB Name', 'formscrm' ),
153 'type' => 'text',
154 'class' => 'medium',
155 'dependency' => array(
156 'field' => 'fc_crm_type',
157 'values' => formscrm_get_dependency_odoodb(),
158 ),
159 ),
160 ),
161 ),
162 );
163 }
164
165 public function settings_api_key( $field, $echo = true ) {
166
167 $field['type'] = 'text';
168
169 $api_key_field = $this->settings_text( $field, false );
170
171 //switch type="text" to type="password" so the key is not visible
172 $api_key_field = str_replace('type="text"', 'type="password"', $api_key_field);
173
174 $caption = '<small>' . sprintf( esc_html__( 'Find a Password or API key depending of CRM.', 'formscrm' ) ) . '</small>';
175
176 if ( $echo ) {
177 echo esc_html( $api_key_field ) . '</br>' . esc_html( $caption );
178 }
179
180 return $api_key_field . '</br>' . $caption;
181 }
182
183 /**
184 * Forms Settings
185 *
186 * @param array $form Form.
187 * @param string $feed_id Feed id.
188 * @return void
189 */
190 public function feed_edit_page( $form, $feed_id ) {
191
192 // Ensures valid credentials were entered in the settings page.
193 if ( false == $this->login_api_crm() ) {
194 ?>
195 <div class="notice notice-error">
196 <?php
197 esc_html_e( 'We are unable to login to CRM.', 'formscrm' );
198 echo ' <a href="' . esc_url( $this->get_plugin_settings_url() ) . '">' . esc_html__( 'Use Settings Page', 'formscrm' ) . '</a>';
199 ?>
200 </div>
201 <?php
202 return;
203 }
204
205 echo '<script type="text/javascript">var form = ' . esc_html( GFCommon::json_encode( $form ) ) . ';</script>';
206
207 parent::feed_edit_page( $form, $feed_id );
208 }
209
210 /**
211 * Include library connector
212 *
213 * @param string $crmtype Type of CRM.
214 * @return void
215 */
216 private function include_library( $crmtype ) {
217 if ( isset( $_POST['_gform_setting_fc_crm_type'] ) ) {
218 $crmtype = sanitize_text_field( $_POST['_gform_setting_fc_crm_type'] );
219 }
220
221 if ( isset( $crmtype ) ) {
222 $crmname = strtolower( $crmtype );
223 $crmclassname = str_replace( ' ', '', $crmname );
224 $crmclassname = 'CRMLIB_' . strtoupper( $crmclassname );
225 $crmname = str_replace( ' ', '_', $crmname );
226
227 $array_path = formscrm_get_crmlib_path();
228 if ( isset( $array_path[ $crmname ] ) ) {
229 include_once $array_path[ $crmname ];
230 }
231
232 formscrm_debug_message( $array_path[ $crmname ]);
233
234 if ( class_exists( $crmclassname ) ) {
235 $this->crmlib = new $crmclassname();
236 }
237 }
238 }
239
240 public function feed_settings_fields() {
241
242 $settings = $this->get_plugin_settings();
243 $this->include_library( $settings['fc_crm_type'] );
244
245 return array(
246 array(
247 'title' => __('CRM Feed', 'formscrm'),
248 'description' => '',
249 'fields' => array(
250 array(
251 'name' => 'feedName',
252 'label' => __('Name', 'formscrm' ),
253 'type' => 'text',
254 'required' => true,
255 'class' => 'medium',
256 'tooltip' => '<h6>' . __('Name', 'formscrm' ) . '</h6>' . __( 'Enter a feed name to uniquely identify this setup.', 'formscrm' ),
257 ),
258 array(
259 'name' => 'gf_crm_module',
260 'label' => __( 'CRM Module', 'formscrm' ),
261 'type' => 'select',
262 'class' => 'medium',
263 'onchange' => 'jQuery(this).parents("form").submit();',
264 'choices' => $this->crmlib->list_modules( $settings ),
265 ),
266 array(
267 'name' => 'listFields',
268 'label' => __('Map Fields', 'formscrm' ),
269 'type' => 'field_map',
270 'dependency' => 'gf_crm_module',
271 'field_map' => $this->crmlib->list_fields( $settings, $this->get_setting( 'gf_crm_module' ) ),
272 'tooltip' => '<h6>' . __( 'Map Fields', 'formscrm' ) . '</h6>' . __('Associate your CRM custom fields to the appropriate Gravity Form fields by selecting the appropriate form field from the list.', 'formscrm' ),
273 ),
274 ),
275 ),
276 );
277 }
278
279 public function ensure_upgrade() {
280
281 if (get_option('gf_crm_upgrade')) {
282 return false;
283 }
284
285 $feeds = $this->get_feeds();
286 if (empty($feeds)) {
287
288 //Force Add-On framework upgrade
289 $this->upgrade('2.0');
290 }
291
292 update_option('gf_crm_upgrade', 1);
293 }
294
295 public function feed_list_columns() {
296 return array(
297 'feedName' => __('Name', 'formscrm'),
298 );
299 }
300
301 public function process_feed( $feed, $entry, $form ) {
302
303 if ( ! $this->is_valid_key() ) {
304 return;
305 }
306
307 $this->export_feed( $entry, $form, $feed );
308 }
309
310 public function export_feed( $entry, $form, $feed) {
311 $settings = $this->get_plugin_settings();
312 $this->include_library($settings['fc_crm_type']);
313
314 if (!empty($feed['meta']['listFields_first_name'])) {
315 $name = $this->get_name($entry, $feed['meta']['listFields_first_name']);
316 }
317
318 $merge_vars = array();
319 $field_maps = $this->get_field_map_fields($feed, 'listFields');
320
321 foreach ($field_maps as $var_key => $field_id) {
322 $field = RGFormsModel::get_field( $form, $field_id );
323
324 if ( isset( $field['type'] ) && GFCommon::is_product_field($field['type']) && rgar( $field, 'enablePrice' )) {
325 $ary = explode('|', $entry[$field_id]);
326 $product_name = count($ary) > 0 ? $ary[0] : '';
327 $merge_vars[] = array('name' => $var_key, 'value' => $product_name);
328 } elseif ( $field && RGFormsModel::get_input_type($field) == 'checkbox') {
329 $value = '';
330 foreach ($field['inputs'] as $input) {
331 $index = (string) $input['id'];
332 $value_n = apply_filters('formscrm_field_value', rgar($entry, $index), $form['id'], $field_id, $entry);
333 $value .= $value_n;
334 if ($value_n) {
335 $value .= '|';
336 }
337
338 }
339 $value = substr($value, 0, -1);
340 $merge_vars[] = array(
341 'name' => $var_key,
342 'value' => $value,
343 );
344 } elseif ( $field && RGFormsModel::get_input_type($field) == 'multiselect') {
345 $value = apply_filters('formscrm_field_value', rgar($entry, $field_id), $form['id'], $field_id, $entry);
346 $value = str_replace(',', '|', $value);
347
348 $merge_vars[] = array(
349 'name' => $var_key,
350 'value' => $value,
351 );
352 } elseif ( $field && RGFormsModel::get_input_type($field) == 'textarea') {
353 $value = apply_filters('formscrm_field_value', rgar($entry, $field_id), $form['id'], $field_id, $entry);
354 $value = str_replace(array("\r", "\n"), ' ', $value);
355 $merge_vars[] = array(
356 'name' => $var_key,
357 'value' => $value,
358 );
359 } else {
360 $merge_vars[] = array(
361 'name' => $var_key,
362 'value' => apply_filters( 'formscrm_field_value', rgar( $entry, $field_id ), $form['id'], $field_id, $entry ),
363 );
364 }
365 }
366
367 $override_custom_fields = apply_filters( 'formscrm_override_blank_custom_fields', false, $entry, $form, $feed );
368 if ( ! $override_custom_fields ) {
369 $merge_vars = $this->remove_blank_custom_fields( $merge_vars );
370 }
371
372 $settings = $this->get_plugin_settings();
373
374 formscrm_debug_message( $settings );
375 formscrm_debug_message( $merge_vars );
376
377 $id = $this->crmlib->create_entry( $settings, $merge_vars );
378
379 formscrm_debug_message( $id );
380 }
381
382 private static function remove_blank_custom_fields( $merge_vars ) {
383 $i = 0;
384
385 $count = count( $merge_vars );
386
387 for ( $i = 0; $i < $count; $i++ ) {
388 if ( rgblank( $merge_vars[$i]['value'] ) ) {
389 unset( $merge_vars[$i] );
390 }
391 }
392 //resort the array because items could have been removed, this will give an error from CRM if the keys are not in numeric sequence
393 sort( $merge_vars );
394 return $merge_vars;
395 }
396
397 private function get_name( $entry, $field_id ) {
398
399 // If field is simple (one input), simply return full content.
400 $name = rgar( $entry, $field_id );
401 if ( ! empty( $name ) ) {
402 return $name;
403 }
404
405 //Complex field (multiple inputs). Join all pieces and create name
406 $prefix = trim(rgar($entry, $field_id . '.2'));
407 $first = trim(rgar($entry, $field_id . '.3'));
408 $last = trim(rgar($entry, $field_id . '.6'));
409 $suffix = trim(rgar($entry, $field_id . '.8'));
410
411 $name = $prefix;
412 $name .= !empty($name) && !empty($first) ? " $first" : $first;
413 $name .= !empty($name) && !empty($last) ? " $last" : $last;
414 $name .= !empty($name) && !empty($suffix) ? " $suffix" : $suffix;
415
416 return $name;
417 }
418
419 private function is_valid_key() {
420 $result_api = $this->login_api_crm();
421
422 return $result_api;
423 }
424
425 private function login_api_crm() {
426 $login_result = false;
427
428 // Logins to CRM.
429 $settings = $this->get_plugin_settings();
430
431 if ( isset( $settings['fc_crm_type'] ) ) {
432 $this->include_library($settings['fc_crm_type']);
433 }
434
435 if ( isset( $this->crmlib ) ) {
436 $login_result = $this->crmlib->login( $settings );
437 formscrm_debug_message( $login_result );
438 }
439
440 formscrm_testserver();
441
442 if ( ! isset( $login_result ) ) {
443 $login_result = '';
444 }
445
446 return $login_result;
447 }
448
449 } //from main class
450