Merge pull request #2352 from colemanw/4.4
[civicrm-core.git] / CRM / Core / BAO / CustomField.php
index fd9080a4fb23cbf961929bdf3af3b33aaa2f4ab4..c56c9a943398f29f6dc2c4e46736965746e9edf5 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
   +--------------------------------------------------------------------+
-  | CiviCRM version 4.3                                                |
+  | CiviCRM version 4.4                                                |
   +--------------------------------------------------------------------+
   | Copyright CiviCRM LLC (c) 2004-2013                                |
   +--------------------------------------------------------------------+
@@ -130,6 +130,8 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
    * @static
    */
   static function create(&$params) {
+    $origParams = array_merge(array(), $params);
+
     if (!isset($params['id'])) {
       if (!isset($params['column_name'])) {
         // if add mode & column_name not present, calculate it.
@@ -285,6 +287,10 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
       self::createField($customField, 'modify', $indexExist);
     }
     else {
+      if (!isset($origParams['column_name'])) {
+        $columnName .= "_{$customField->id}";
+        $params['column_name'] = $columnName;
+      }
       $customField->column_name = $columnName;
       $customField->save();
       // make sure all values are present in the object
@@ -357,7 +363,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
   /**
    * Store and return an array of all active custom fields.
    *
-   * @param string      $customDataType      type of Custom Data
+   * @param string      $customDataType      type of Custom Data; empty is a synonym for "all contact data types"
    * @param boolean     $showAll             If true returns all fields (includes disabled fields)
    * @param boolean     $inline              If true returns all inline fields (includes disabled fields)
    * @param int         $customDataSubType   Custom Data sub type value
@@ -372,31 +378,28 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
    * @static
    */
   public static function &getFields($customDataType = 'Individual',
-    $showAll           = FALSE,
-    $inline            = FALSE,
-    $customDataSubType = NULL,
-    $customDataSubName = NULL,
-    $onlyParent        = FALSE,
-    $onlySubType       = FALSE,
-    $checkPermission   = TRUE
+                                    $showAll = FALSE,
+                                    $inline = FALSE,
+                                    $customDataSubType = NULL,
+                                    $customDataSubName = NULL,
+                                    $onlyParent = FALSE,
+                                    $onlySubType = FALSE,
+                                    $checkPermission = TRUE
   ) {
-    if ($customDataType &&
-      !is_array($customDataType)
-    ) {
+    if (empty($customDataType)) {
+      $customDataType = array('Contact', 'Individual', 'Organization', 'Household');
+    }
+    if ($customDataType && !is_array($customDataType)) {
 
-      if (in_array($customDataType,
-          CRM_Contact_BAO_ContactType::subTypes()
-        )) {
+      if (in_array($customDataType, CRM_Contact_BAO_ContactType::subTypes())) {
         // This is the case when getFieldsForImport() requires fields
         // limited strictly to a subtype.
         $customDataSubType = $customDataType;
-        $customDataType    = CRM_Contact_BAO_ContactType::getBasicType($customDataType);
-        $onlySubType       = TRUE;
+        $customDataType = CRM_Contact_BAO_ContactType::getBasicType($customDataType);
+        $onlySubType = TRUE;
       }
 
-      if (in_array($customDataType,
-          array_keys(CRM_Core_SelectValues::customGroupExtends())
-        )) {
+      if (in_array($customDataType, array_keys(CRM_Core_SelectValues::customGroupExtends()))) {
         // this makes the method flexible to support retrieving fields
         // for multiple extends value.
         $customDataType = array($customDataType);
@@ -460,11 +463,8 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         if (is_array($customDataType)) {
           $value = NULL;
           foreach ($customDataType as $dataType) {
-            if (in_array($dataType,
-                array_keys(CRM_Core_SelectValues::customGroupExtends())
-              )) {
-              if (in_array($dataType, array(
-                'Individual', 'Household', 'Organization'))) {
+            if (in_array($dataType, array_keys(CRM_Core_SelectValues::customGroupExtends()))) {
+              if (in_array($dataType, array('Individual', 'Household', 'Organization'))) {
                 $val = "'" . CRM_Utils_Type::escape($dataType, 'String') . "', 'Contact' ";
               }
               else {
@@ -478,13 +478,21 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
           }
         }
 
+        if (!empty($customDataType) && empty($extends)) {
+          // $customDataType specified a filter, but there is no corresponding SQL ($extends)
+          self::$_importFields[$cacheKey] = array();
+          return self::$_importFields[$cacheKey];
+        }
+
         if ($onlyParent) {
           $extends .= " AND $cgTable.extends_entity_column_value IS NULL AND $cgTable.extends_entity_column_id IS NULL ";
         }
 
         $query = "SELECT $cfTable.id, $cfTable.label,
                             $cgTable.title,
-                            $cfTable.data_type, $cfTable.html_type,
+                            $cfTable.data_type,
+                            $cfTable.html_type,
+                            $cfTable.default_value,
                             $cfTable.options_per_line, $cfTable.text_length,
                             $cfTable.custom_group_id,
                             $cgTable.extends, $cfTable.is_search_range,
@@ -548,6 +556,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
           $fields[$dao->id]['groupTitle'] = $dao->title;
           $fields[$dao->id]['data_type'] = $dao->data_type;
           $fields[$dao->id]['html_type'] = $dao->html_type;
+          $fields[$dao->id]['default_value'] = $dao->default_value;
           $fields[$dao->id]['text_length'] = $dao->text_length;
           $fields[$dao->id]['options_per_line'] = $dao->options_per_line;
           $fields[$dao->id]['custom_group_id'] = $dao->custom_group_id;
@@ -734,6 +743,12 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
 
     $field = self::getFieldObject($fieldId);
 
+    // Custom field HTML should indicate group+field name
+    $groupName = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $field->custom_group_id);
+    $dataCrmCustomVal = $groupName.':'.$field->name;
+    $dataCrmCustomAttr = 'data-crm-custom="'.$dataCrmCustomVal.'"';
+    $field->attributes .= $dataCrmCustomAttr;
+
     // Fixed for Issue CRM-2183
     if ($field->html_type == 'TextArea' && $search) {
       $field->html_type = 'Text';
@@ -762,7 +777,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         break;
 
       case 'TextArea':
-        $attributes = '';
+        $attributes = $dataCrmCustomAttr;
         if ($field->note_rows) {
           $attributes .= 'rows=' . $field->note_rows;
         }
@@ -794,6 +809,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
               'timeFormat' => $field->time_format,
               'startOffset' => $field->start_date_years,
               'endOffset' => $field->end_date_years,
+              'data-crm-custom' => $dataCrmCustomVal,
             )
           );
 
@@ -803,6 +819,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
               'timeFormat' => $field->time_format,
               'startOffset' => $field->start_date_years,
               'endOffset' => $field->end_date_years,
+              'data-crm-custom' => $dataCrmCustomVal,
             )
           );
         }
@@ -814,6 +831,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
               'timeFormat' => $field->time_format,
               'startOffset' => $field->start_date_years,
               'endOffset' => $field->end_date_years,
+              'data-crm-custom' => $dataCrmCustomVal,
             ));
         }
         break;
@@ -846,7 +864,8 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         $qf->add('select', $elementName, $label,
           array(
             '' => ts('- select -')) + $selectOption,
-          $useRequired && !$search
+          $useRequired && !$search,
+          $dataCrmCustomAttr
         );
         break;
 
@@ -870,6 +889,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
             'size' => 5,
             'style' => '',
             'class' => 'advmultiselect',
+            'data-crm-custom' => $dataCrmCustomVal,
           )
         );
 
@@ -890,7 +910,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'));
+        $qf->addElement('select', $elementName, $label, $selectOption, array('size' => '5', 'multiple', 'data-crm-custom' => $dataCrmCustomVal));
 
         if ($useRequired && !$search) {
           $qf->addRule($elementName, ts('%1 is a required field.', array(1 => $label)), 'required');
@@ -903,12 +923,12 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         );
         $check = array();
         foreach ($customOption as $v => $l) {
-          $check[] = &$qf->addElement('advcheckbox', $v, NULL, $l);
+          $check[] = &$qf->addElement('advcheckbox', $v, NULL, $l, array('data-crm-custom' => $dataCrmCustomVal));
         }
         if ($search &&
           count($check) > 1
         ) {
-          $check[] = &$qf->addElement('advcheckbox', 'CiviCRM_OP_OR', NULL, ts('Check to match ANY; uncheck to match ALL'));
+          $check[] = &$qf->addElement('advcheckbox', 'CiviCRM_OP_OR', NULL, ts('Check to match ANY; uncheck to match ALL'), array('data-crm-custom' => $dataCrmCustomVal));
         }
         $qf->addGroup($check, $elementName, $label);
         if ($useRequired && !$search) {
@@ -935,7 +955,8 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         //Add State
         $stateOption = array('' => ts('- select -')) + CRM_Core_PseudoConstant::stateProvince();
         $qf->add('select', $elementName, $label, $stateOption,
-          $useRequired && !$search
+          $useRequired && !$search,
+          $dataCrmCustomAttr
         );
         break;
 
@@ -943,7 +964,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'));
+        $qf->addElement('select', $elementName, $label, $stateOption, array('size' => '5', 'multiple', 'data-crm-custom' => $dataCrmCustomVal));
         if ($useRequired && !$search) {
           $qf->addRule($elementName, ts('%1 is a required field.', array(1 => $label)), 'required');
         }
@@ -953,21 +974,22 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         //Add Country
         $countryOption = array('' => ts('- select -')) + CRM_Core_PseudoConstant::country();
         $qf->add('select', $elementName, $label, $countryOption,
-          $useRequired && !$search
+          $useRequired && !$search,
+          $dataCrmCustomAttr
         );
         break;
 
       case 'Multi-Select Country':
         //Add Country
         $countryOption = CRM_Core_PseudoConstant::country();
-        $qf->addElement('select', $elementName, $label, $countryOption, array('size' => '5', 'multiple'));
+        $qf->addElement('select', $elementName, $label, $countryOption, array('size' => '5', 'multiple', 'data-crm-custom' => $dataCrmCustomVal));
         if ($useRequired && !$search) {
           $qf->addRule($elementName, ts('%1 is a required field.', array(1 => $label)), 'required');
         }
         break;
 
       case 'RichTextEditor':
-        $attributes = array('rows' => $field->note_rows, 'cols' => $field->note_columns);
+        $attributes = array('rows' => $field->note_rows, 'cols' => $field->note_columns, 'data-crm-custom' => $dataCrmCustomVal);
         if ($field->text_length) {
           $attributes['maxlength'] = $field->text_length;
         }
@@ -1055,6 +1077,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
           array(
             'onfocus' => "if (!this.value) {  this.value='http://';} else return false",
             'onblur' => "if ( this.value == 'http://') {  this.value='';} else return false",
+            'data-crm-custom' => $dataCrmCustomVal,
           ),
           $useRequired && !$search
         );
@@ -1157,7 +1180,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
           if ($value) {
             $display = ts('Yes');
           }
-          elseif ($value === '0') {
+          elseif ((string)$value === '0') {
             $display = ts('No');
           }
         }
@@ -1322,7 +1345,6 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
           $display = $value;
         }
     }
-
     return $display ? $display : $value;
   }
 
@@ -1532,6 +1554,10 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
     //get the custom fields for the entity
     //subtype and basic type
     $customDataSubType = NULL;
+    if (is_array($customFieldExtend)) {
+      $customFieldExtend = $customFieldExtend[0];
+    }
+
     if (in_array($customFieldExtend,
         CRM_Contact_BAO_ContactType::subTypes()
       )) {
@@ -1562,9 +1588,6 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
 
     list($tableName, $columnName, $groupID) = self::getTableColumnGroup($customFieldId);
 
-    if (is_array($customFieldExtend)) {
-      $customFieldExtend = $customFieldExtend[0];
-    }
     if (!$customValueId &&
       // we always create new entites for is_multiple unless specified
       !$customFields[$customFieldId]['is_multiple'] &&