X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FBAO%2FAddress.php;h=40785fcb7883d6ecaa4c9dda2b549b02e8a63a18;hb=fd96067165316831b50e48972059930ad1785444;hp=94115311a59145aaa9e334568f0d3cd547f924aa;hpb=ef0d4de8b06a73c463a8c323b78ef88261896fa3;p=civicrm-core.git diff --git a/CRM/Core/BAO/Address.php b/CRM/Core/BAO/Address.php index 94115311a5..40785fcb78 100644 --- a/CRM/Core/BAO/Address.php +++ b/CRM/Core/BAO/Address.php @@ -1,9 +1,7 @@ stateCountryMap)) { + elseif (!empty($config->stateCountryMap)) { $map = $config->stateCountryMap; } - if (!empty($map)) { foreach ($map as $index => $match) { - if ( - array_key_exists('state_province', $match) && - array_key_exists('country', $match) + if (array_key_exists('state_province', $match) + || array_key_exists('country', $match) + || array_key_exists('county', $match) ) { + $countryElementName = CRM_Utils_Array::value('country', $match); + $stateProvinceElementName = CRM_Utils_Array::value('state_province', $match); + $countyElementName = CRM_Utils_Array::value('county', $match); CRM_Contact_Form_Edit_Address::fixStateSelect( $form, - $match['country'], - $match['state_province'], - CRM_Utils_Array::value('county', $match), - CRM_Utils_Array::value($match['country'], $defaults), - CRM_Utils_Array::value($match['state_province'], $defaults) + $countryElementName, + $stateProvinceElementName, + $countyElementName, + CRM_Utils_Array::value($countryElementName, $defaults), + CRM_Utils_Array::value($stateProvinceElementName, $defaults) ); } else { @@ -1150,4 +1149,53 @@ SELECT is_primary, static function del($id) { return CRM_Contact_BAO_Contact::deleteObjectWithPrimary('Address', $id); } -} + + /** + * Get options for a given address field. + * @see CRM_Core_DAO::buildOptions + * + * TODO: Should we always assume chainselect? What fn should be responsible for controlling that flow? + * TODO: In context of chainselect, what to return if e.g. a country has no states? + * + * @param String $fieldName + * @param String $context: @see CRM_Core_DAO::buildOptionsContext + * @param Array $props: whatever is known about this dao object + */ + public static function buildOptions($fieldName, $context = NULL, $props = array()) { + $params = array(); + // Special logic for fields whose options depend on context or properties + switch ($fieldName) { + // Filter state_province list based on chosen country or site defaults + case 'state_province_id': + if (empty($props['country_id'])) { + $config = CRM_Core_Config::singleton(); + if (!empty($config->provinceLimit)) { + $props['country_id'] = $config->provinceLimit; + } + else { + $props['country_id'] = $config->defaultContactCountry; + } + } + if (!empty($props['country_id'])) { + $params['condition'] = 'country_id IN (' . implode(',', (array) $props['country_id']) . ')'; + } + break; + // Filter country list based on site defaults + case 'country_id': + if ($context != 'get' && $context != 'validate') { + $config = CRM_Core_Config::singleton(); + if (!empty($config->countryLimit) && is_array($config->countryLimit)) { + $params['condition'] = 'id IN (' . implode(',', $config->countryLimit) . ')'; + } + } + break; + // Filter county list based on chosen state + case 'county_id': + if (!empty($props['state_province_id'])) { + $params['condition'] = 'state_province_id IN (' . implode(',', (array) $props['state_province_id']) . ')'; + } + break; + } + return CRM_Core_PseudoConstant::get(__CLASS__, $fieldName, $params, $context); + } +} \ No newline at end of file