From 1d9613660398698b7b40771f97feb26c9f298d77 Mon Sep 17 00:00:00 2001 From: Pratik Joshi Date: Mon, 21 Oct 2013 20:59:52 +0530 Subject: [PATCH] CRM-13490 : re-framed the logic, used proper error setting methods ---------------------------------------- * CRM-13490: Addresses with required custom fields can't be deleted from the Edit screen http://issues.civicrm.org/jira/browse/CRM-13490 --- CRM/Contact/Form/Edit/Address.php | 58 +++++++++++++++++++++++++------ CRM/Core/BAO/Address.php | 29 ---------------- 2 files changed, 47 insertions(+), 40 deletions(-) diff --git a/CRM/Contact/Form/Edit/Address.php b/CRM/Contact/Form/Edit/Address.php index ffae0dcc3d..95b95fb254 100644 --- a/CRM/Contact/Form/Edit/Address.php +++ b/CRM/Contact/Form/Edit/Address.php @@ -274,12 +274,11 @@ class CRM_Contact_Form_Edit_Address { // And we can't set it to 'address_' because we want to set it in a slightly different format. CRM_Core_BAO_CustomGroup::buildQuickForm($form, $groupTree, FALSE, 'dnc_'); - // detach required rule for custom data. // during contact editing : if no address is filled // required custom data must not produce 'required' form rule error // more handling done in formRule func if (!$inlineEdit) { - CRM_Core_BAO_Address::detachRequiredRule(&$form, $groupTree); + CRM_Contact_Form_Edit_Address::storeRequiredCustomDataInfo($form, $groupTree); } $template = CRM_Core_Smarty::singleton(); @@ -331,23 +330,36 @@ class CRM_Contact_Form_Edit_Address { // check for state/county match if not report error to user. if (CRM_Utils_Array::value('address', $fields) && is_array($fields['address'])) { foreach ($fields['address'] as $instance => $addressValues) { + if (CRM_Utils_System::isNull($addressValues)) { + // DETACH 'required' form rule error to + // custom data only if address data not exists upon submission + if (!empty($customDataRequiredFields)) { + foreach($customDataRequiredFields as $customElementName) { + $elementName = "address[$instance][$customElementName]"; + if ($self->getElementError($elementName)) { + // set element error to none + $self->setElementError($elementName, NULL); + } + } + } continue; } - // attach 'required' form rule error to - // custom data only if address data exists i.e. user intended to fill address - // but forgot to fill in required fields - if (!empty($customDataRequiredFields) && CRM_Core_BAO_Address::dataExists($addressValues)) { - foreach($customDataRequiredFields as $elementName) { - if (!CRM_Utils_Array::value($elementName, $addressValues)) { - $label = $self->getElement("address[$instance][$elementName]")->getLabel(); - $errors["address[$instance][$elementName]"] = ts('%1 is required field', array(1 => $label)); + // DETACH 'required' form rule error to + // custom data only if address data not exists upon submission + if (!empty($customDataRequiredFields) && !CRM_Core_BAO_Address::dataExists($addressValues)) { + foreach($customDataRequiredFields as $customElementName) { + $elementName = "address[$instance][$customElementName]"; + if ($self->getElementError($elementName)) { + // set element error to none + $self->setElementError($elementName, NULL); } } } $countryId = CRM_Utils_Array::value('country_id', $addressValues); + $stateProvinceId = CRM_Utils_Array::value('state_province_id', $addressValues); //do check for mismatch countries @@ -572,5 +584,29 @@ class CRM_Contact_Form_Edit_Address { // end of parse address functionality } } -} + + static function storeRequiredCustomDataInfo(&$form, $groupTree) { + if (CRM_Utils_System::getClassName($form) == 'CRM_Contact_Form_Contact') { + $requireOmission = NULL; + foreach ($groupTree as $csId => $csVal) { + // only process Address entity fields + if ($csVal['extends'] != 'Address') { + continue; + } + + foreach ($csVal['fields'] as $cdId => $cdVal) { + if ($cdVal['is_required']) { + $elementName = $cdVal['element_name']; + if (in_array($elementName, $form->_required)) { + // store the omitted rule for a element, to be used later on + $requireOmission .= $cdVal['element_custom_name'] . ','; + } + } + } + } + + $form->_addressRequireOmission = rtrim($requireOmission, ','); + } + } +} \ No newline at end of file diff --git a/CRM/Core/BAO/Address.php b/CRM/Core/BAO/Address.php index 113c522053..40785fcb78 100644 --- a/CRM/Core/BAO/Address.php +++ b/CRM/Core/BAO/Address.php @@ -1198,33 +1198,4 @@ SELECT is_primary, } return CRM_Core_PseudoConstant::get(__CLASS__, $fieldName, $params, $context); } - - /** - * CRM-13490 : helper function to detach required rule for address custom data - */ - static function detachRequiredRule(&$form, $groupTree) { - if (CRM_Utils_System::getClassName($form) == 'CRM_Contact_Form_Contact') { - $requireOmission = NULL; - foreach ($groupTree as $csId => $csVal) { - // only process Address entity fields - if ($csVal['extends'] != 'Address') { - continue; - } - - foreach ($csVal['fields'] as $cdId => $cdVal) { - if ($cdVal['is_required']) { - // unset-ing of required rule done here, also store the element name whose required rule is been removed - $elementName = $cdVal['element_name']; - if (in_array($elementName, $form->_required)) { - $form->_required = array_diff($form->_required, array($elementName)); - // store the omitted rule for a element, to be used later on - $requireOmission = $cdVal['element_custom_name'] . ','; - } - } - } - } - - $form->_addressRequireOmission = rtrim($requireOmission, ','); - } - } } \ No newline at end of file -- 2.25.1