CRM-14470 - Prevent users from adding two fields of the same field type
authorLola Slade <lola@freeform.ca>
Wed, 30 Apr 2014 01:31:35 +0000 (18:31 -0700)
committerLola Slade <lola@freeform.ca>
Wed, 30 Apr 2014 01:31:35 +0000 (18:31 -0700)
(eg. phone) with location type 'is_primary'.

CRM/UF/Form/Field.php
templates/CRM/UF/Form/Field.hlp
templates/CRM/UF/Form/Field.tpl

index c2882867b050843f7227d30fada079145d4f215c..12d848060f6998c35aebba58bae4997f63213754 100644 (file)
@@ -713,6 +713,43 @@ class CRM_UF_Form_Field extends CRM_Core_Form {
     }
   }
 
+  /**
+   * validation rule to prevent multiple fields of primary location type and the same communication type.
+   *
+   * @param Array   $fields            Submitted fields
+   * @param String  $profileFieldName  Group Id.
+   * @param Array   $groupFields       List of fields already in the group
+   * @param Array   $errors            Collect errors
+   *
+   * @static
+   * @access public
+   */
+  static function formRulePrimaryCheck($fields, $profileFieldName, $groupFields, &$errors) {
+    //FIXME: This may need to also apply to website fields if they are refactored to allow more than one per profile
+    $checkPrimary = array('phone' => 'civicrm_phone.phone', 'phone_and_ext' => 'civicrm_phone.phone');
+    $whereCheck = NULL;
+    $primaryOfSameTypeFound = NULL;
+    // Is this a primary location type field of interest
+    if (array_key_exists($profileFieldName, $checkPrimary)) {
+      $whereCheck = $checkPrimary[$profileFieldName];
+    }
+    $potentialLocationType = CRM_Utils_Array::value(2, $fields['field_name']);
+
+    if ($whereCheck && $potentialLocationType == 0) {
+      $primaryOfSameTypeFound = '';
+
+      foreach ($groupFields as $groupField) {
+        // if it is a phone
+        if ($groupField['where'] == $whereCheck && is_null($groupField['location_type_id'])) {
+          $primaryOfSameTypeFound = $groupField['title'];
+        }
+      }
+      if ($primaryOfSameTypeFound) {
+        $errors['field_name'] = ts('You have already added a primary location field of this type: %1', $primaryOfSameTypeFound);
+      }
+    }
+  }
+
   /**
    * global validation rules for the form
    *
@@ -737,14 +774,14 @@ class CRM_UF_Form_Field extends CRM_Core_Form {
       $errors['is_view'] = ts('A View Only field cannot be required');
     }
 
-    $fieldName = $fields['field_name'][0];
-    if (!$fieldName) {
+    $entityName = $fields['field_name'][0];
+    if (!$entityName) {
       $errors['field_name'] = ts('Please select a field name');
     }
 
-    if ($in_selector && in_array($fieldName, array(
+    if ($in_selector && in_array($entityName, array(
       'Contribution', 'Participant', 'Membership', 'Activity'))) {
-      $errors['in_selector'] = ts("'In Selector' cannot be checked for %1 fields.", array(1 => $fieldName));
+      $errors['in_selector'] = ts("'In Selector' cannot be checked for %1 fields.", array(1 => $entityName));
     }
 
     $isCustomField = FALSE;
@@ -773,6 +810,13 @@ class CRM_UF_Form_Field extends CRM_Core_Form {
       }
     }
 
+    // Get list of fields already in the group
+    $groupFields = CRM_Core_BAO_UFGroup::getFields($fields['group_id'], FALSE, NULL, NULL, NULL, TRUE, NULL, TRUE);
+    // Check if we already added a primary field of the same communication type
+    if (empty($fields['field_id'])) {
+      self::formRulePrimaryCheck($fields, $profileFieldName, $groupFields, $errors);
+    }
+
     //check profile is configured for double option process
     //adding group field, email field should be present in the group
     //fixed for  issue CRM-2861 & CRM-4153
index 817e66aefb7efb53ff1126e707189f0f5631c955..de20114e61af64b1e4ac6dd146d5a8ca1a85a37f 100644 (file)
@@ -1,3 +1,18 @@
+{htxt id='field_name_0-title'}
+{ts}Field Name{/ts}
+{/htxt}
+{htxt id='field_name_0'}
+  {capture assign="ltURL"}{crmURL p="civicrm/admin/locationType" q="reset=1"}{/capture}
+  <p>
+    {ts}Choose the field to add to the profile.{/ts}<br/>
+    <strong>{ts}Restrictions:{/ts}</strong><br/>
+    {ts}Only one field of each communication type (EG. phone) can use the primary location type.{/ts}
+  </p>
+  <p>
+    {ts 1=$ltURL}When you choose the primary location type the collected data will use the default location type from the <a href="%1">Location types</a> setup.{/ts}
+  </p>
+{/htxt}
+
 {htxt id='label-title'}
   {ts}Field Label{/ts}
 {/htxt}
index 5863edb675b2029e2bfd5098927a9d5793f0e1c4..7b6d37c624e4cecee86ffd1fe2ee37066521b2b6 100644 (file)
@@ -34,7 +34,7 @@
   <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="top"}</div>
   <table class="form-layout-compressed">
     <tr class="crm-uf-field-form-block-field_name">
-      <td class="label">{$form.field_name.label}</td>
+      <td class="label">{$form.field_name.label} {help id='field_name_0'}</td>
       <td>{$form.field_name.html}<br />
         <span class="description">&nbsp;{ts}Select the type of CiviCRM record and the field you want to include in this Profile.{/ts}</span></td>
     </tr>