diff --git a/includes/wf_crm_webform_ajax.inc b/includes/wf_crm_webform_ajax.inc index d53793d09..e21f45fc0 100644 --- a/includes/wf_crm_webform_ajax.inc +++ b/includes/wf_crm_webform_ajax.inc @@ -53,6 +53,7 @@ class wf_crm_webform_ajax extends wf_crm_webform_base { } list($nid, $fid) = explode('-', $key, 2); $this->node = node_load($nid); + $this->settings = $this->node->webform_civicrm; if (!$this->autocompleteAccess($fid)) { drupal_access_denied(); } diff --git a/includes/wf_crm_webform_base.inc b/includes/wf_crm_webform_base.inc index c4b8c79af..0ab954fc1 100644 --- a/includes/wf_crm_webform_base.inc +++ b/includes/wf_crm_webform_base.inc @@ -85,6 +85,10 @@ abstract class wf_crm_webform_base { $params['options']['sort'] = 'is_primary DESC'; } $result = wf_civicrm_api($ent, 'get', $params); + // Handle location field sorting + if(in_array($ent, wf_crm_location_fields())){ + $result['values'] = $this->reorderByLocationType($c, $ent, $result['values']); + } if (!empty($result['values'])) { // Index array from 1 instead of 0 $result = array_merge(array(0), array_values($result['values'])); @@ -112,9 +116,11 @@ abstract class wf_crm_webform_base { $address['state_province_id'] = wf_crm_state_abbr($address['state_province_id']); } // Load custom data - $custom = $this->getCustomData($address['id'], 'address'); - if (!empty($custom['address'])) { - $address += $custom['address'][1]; + if(isset($address['id'])){ + $custom = $this->getCustomData($address['id'], 'address'); + if (!empty($custom['address'])) { + $address += $custom['address'][1]; + } } } } @@ -185,6 +191,109 @@ abstract class wf_crm_webform_base { return $info; } + /** + * Reorder returned results according to settings chosen in wf_civicrm backend + * + * @param integer $c + * @param string $ent + * @param array $values + * @return array $reorderedArray + */ + protected function reorderByLocationType($c, $ent, $values = array()){ + $reorderedArray = array(); + + if(isset($this->settings['data']['contact'][$c][$ent])){ + // First pass + $reorderedArray = $this->matchLocationTypes($c, $ent, $values); + + // Second pass + $reorderedArray = $this->handleRemainingValues($reorderedArray, $values); + + return $reorderedArray; + } else { + return $values; + } + } + + /** + * Organize values according to location types + * + * @param integer $c + * @param string $ent + * @param array $values + * @return array $reorderedArray + */ + protected function matchLocationTypes($c, $ent, &$values){ + // create temporary settings array to include 'user-select' fields + // on the right place in array + $settingsArray = $this->add_user_select_field_placeholder($ent, $this->settings['data']['contact'][$c]); + $userSelectIndex = 0; + // Go through the array and match up locations by type + // Put placeholder 'user-select' where location_type_id is empty for second pass + foreach ($settingsArray[$ent] as $setting) { + $valueFound = false; + foreach($values as $key => $value){ + if((in_array($ent, array('address', 'email')) && $value['location_type_id'] == $setting['location_type_id']) + || + ($value['location_type_id'] == $setting['location_type_id'] && $value[$ent.'_type_id'] == $setting[$ent.'_type_id']) + ){ + $reorderedArray[$key] = $value; + $valueFound = true; + unset($values[$key]); + break; + } else if(empty($setting['location_type_id'])) { // for 'user-select' fields + $valueFound = true; + $reorderedArray['us'.$userSelectIndex] = 'user-select'; + $userSelectIndex ++; + break; + } + } + + // always keep number of returned values equal to chosen settings + // if value is not found then set an empty array + if(!$valueFound){ + $reorderedArray[] = array(); + } + } + return $reorderedArray; + } + + /** + * Put remaining values in 'user-select' fields + * + * @param array $reorderedArray + * @param array $values + * @return array $reorderedArray + */ + protected function handleRemainingValues($reorderedArray, &$values){ + // Put leftover values in fields marked as 'user-select' + foreach($reorderedArray as $key => $value){ + if($reorderedArray[$key] == 'user-select'){ + $reorderedArray[$key] = !empty($values) ? array_shift($values) : ''; + } + } + return $reorderedArray; + } + + /** + * Add location_type_id = NULL for user-select fields for identification later + * + * @param string $ent + * @param array $settings + * @return array $settings + */ + protected function add_user_select_field_placeholder($ent, $settings = array()){ + if($settings['number_of_'.$ent] > count($settings[$ent])){ + for($i = 1; $i <= $settings['number_of_'.$ent]; $i++){ + if(!array_key_exists($i, $settings[$ent])){ + $settings[$ent][$i]['location_type_id'] = NULL; + } + } + ksort($settings[$ent]); + } + return $settings; + } + /** * Fetch relationship for a pair of contacts *