CRM-14165 - HR-221 Further abstract options editing to work with civiHR
[civicrm-core.git] / CRM / Core / BAO / CustomField.php
index 3f3bf2e80ffa59acc59e10d987dfbe5ee289e16b..5fac6b6f60ceb9ced2a228ee3033c6be9b40fdb8 100644 (file)
@@ -151,7 +151,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
 
     $indexExist = FALSE;
     //as during create if field is_searchable we had created index.
-    if (CRM_Utils_Array::value('id', $params)) {
+    if (!empty($params['id'])) {
       $indexExist = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomField', $params['id'], 'is_searchable');
     }
 
@@ -180,8 +180,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
           }
         }
         else {
-          if (CRM_Utils_Array::value('default_option', $params)
-            && isset($params['option_value'][$params['default_option']])
+          if (!empty($params['default_option']) && isset($params['option_value'][$params['default_option']])
           ) {
             $params['default_value'] = $params['option_value'][$params['default_option']];
           }
@@ -244,14 +243,14 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
     }
 
     // check for orphan option groups
-    if (CRM_Utils_Array::value('option_group_id', $params)) {
-      if (CRM_Utils_Array::value('id', $params)) {
+    if (!empty($params['option_group_id'])) {
+      if (!empty($params['id'])) {
         self::fixOptionGroups($params['id'], $params['option_group_id']);
       }
 
       // if we dont have a default value
       // retrive it from one of the other custom fields which use this option group
-      if (!CRM_Utils_Array::value('default_value', $params)) {
+      if (empty($params['default_value'])) {
         //don't insert only value separator as default value, CRM-4579
         $defaultValue = self::getOptionGroupDefault($params['option_group_id'],
           $params['html_type']
@@ -283,7 +282,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
     $customField->find(TRUE);
 
     //create/drop the index when we toggle the is_searchable flag
-    if (CRM_Utils_Array::value('id', $params)) {
+    if (!empty($params['id'])) {
       self::createField($customField, 'modify', $indexExist);
     }
     else {
@@ -619,7 +618,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
     foreach ($fields as $id => $values) {
       // for now we should not allow multiple fields in profile / export etc, hence unsetting
       if (!$search &&
-        (CRM_Utils_Array::value('is_multiple', $values) && !$withMultiple)
+        (!empty($values['is_multiple']) && !$withMultiple)
       ) {
         continue;
       }
@@ -754,6 +753,25 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
       $field->html_type = 'Text';
     }
 
+    // FIXME: Why are select state/country separate widget types?
+    if (in_array($field->html_type, array('Select', 'Multi-Select', 'Select State/Province', 'Multi-Select State/Province', 'Select Country', 'Multi-Select Country'))) {
+      $selectAttributes = array(
+        'data-crm-custom' => $dataCrmCustomVal,
+        'class' => 'crm-select2',
+      );
+      if (strpos($field->html_type, 'Multi') === 0) {
+        $selectAttributes['multiple'] = 'multiple';
+      }
+    }
+    // Add data so popup link. Normally this is handled by CRM_Core_Form->addSelect
+    if (in_array($field->html_type, array('Select', 'Multi-Select')) && !$search && CRM_Core_Permission::check('administer CiviCRM')) {
+      $selectAttributes += array(
+        'data-api-entity' => 'contact', // FIXME: This works because the getoptions api isn't picky about custom fields, but it's WRONG
+        'data-api-field' => 'custom_' . $field->id,
+        'data-option-edit-path' => 'civicrm/admin/options/' . CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', $field->option_group_id),
+      );
+    }
+
     if (!isset($label)) {
       $label = $field->label;
     }
@@ -845,16 +863,19 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
           foreach ($customOption as $v => $l) {
             $choice[] = $qf->createElement('radio', NULL, '', $l, (string)$v, $field->attributes);
           }
-          $qf->addGroup($choice, $elementName, $label);
+          $group = $qf->addGroup($choice, $elementName, $label);
         }
         else {
           $choice[] = $qf->createElement('radio', NULL, '', ts('Yes'), '1', $field->attributes);
           $choice[] = $qf->createElement('radio', NULL, '', ts('No'), '0', $field->attributes);
-          $qf->addGroup($choice, $elementName, $label);
+          $group = $qf->addGroup($choice, $elementName, $label);
         }
         if ($useRequired && !$search) {
           $qf->addRule($elementName, ts('%1 is a required field.', array(1 => $label)), 'required');
         }
+        else {
+          $group->setAttribute('unselectable', TRUE);
+        }
         break;
 
       case 'Select':
@@ -865,7 +886,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
           array(
             '' => ts('- select -')) + $selectOption,
           $useRequired && !$search,
-          $dataCrmCustomAttr
+          $selectAttributes
         );
         break;
 
@@ -910,7 +931,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         ) {
           $selectOption['CiviCRM_OP_OR'] = ts('Select to match ANY; unselect to match ALL');
         }
-        $qf->addElement('select', $elementName, $label, $selectOption, array('size' => '5', 'multiple', 'data-crm-custom' => $dataCrmCustomVal));
+        $qf->addElement('select', $elementName, $label, $selectOption, $selectAttributes);
 
         if ($useRequired && !$search) {
           $qf->addRule($elementName, ts('%1 is a required field.', array(1 => $label)), 'required');
@@ -956,7 +977,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         $stateOption = array('' => ts('- select -')) + CRM_Core_PseudoConstant::stateProvince();
         $qf->add('select', $elementName, $label, $stateOption,
           $useRequired && !$search,
-          $dataCrmCustomAttr
+          $selectAttributes
         );
         $qf->_stateCountryMap['state_province'][] = $elementName;
         break;
@@ -965,7 +986,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         //Add Multi-select State/Province
         $stateOption = CRM_Core_PseudoConstant::stateProvince();
 
-        $qf->addElement('select', $elementName, $label, $stateOption, array('size' => '5', 'multiple', 'data-crm-custom' => $dataCrmCustomVal));
+        $qf->addElement('select', $elementName, $label, $stateOption, $selectAttributes);
         if ($useRequired && !$search) {
           $qf->addRule($elementName, ts('%1 is a required field.', array(1 => $label)), 'required');
         }
@@ -976,7 +997,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         $countryOption = array('' => ts('- select -')) + CRM_Core_PseudoConstant::country();
         $qf->add('select', $elementName, $label, $countryOption,
           $useRequired && !$search,
-          $dataCrmCustomAttr
+          $selectAttributes
         );
         $qf->_stateCountryMap['country'][] = $elementName;
         break;
@@ -984,7 +1005,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
       case 'Multi-Select Country':
         //Add Country
         $countryOption = CRM_Core_PseudoConstant::country();
-        $qf->addElement('select', $elementName, $label, $countryOption, array('size' => '5', 'multiple', 'data-crm-custom' => $dataCrmCustomVal));
+        $qf->addElement('select', $elementName, $label, $countryOption, $selectAttributes);
         if ($useRequired && !$search) {
           $qf->addRule($elementName, ts('%1 is a required field.', array(1 => $label)), 'required');
         }
@@ -1584,7 +1605,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
     }
 
     // return if field is a 'code' field
-    if (CRM_Utils_Array::value('is_view', $customFields[$customFieldId])) {
+    if (!empty($customFields[$customFieldId]['is_view'])) {
       return;
     }
 
@@ -2056,7 +2077,7 @@ AND    cf.id = %1";
       $customOptionGroup[$cacheKey] = NULL;
     }
 
-    if (!CRM_Utils_Array::value($cacheKey, $customOptionGroup)) {
+    if (empty($customOptionGroup[$cacheKey])) {
       $whereClause = '( g.is_active = 1 AND f.is_active = 1 )';
 
       //support for single as well as array format.