Merge pull request #23210 from eileenmcnaughton/cancel
[civicrm-core.git] / CRM / Core / BAO / Country.php
index 10934d932c11c74c22eceda9bbde41268ffc78bb..d81958f09dbe21f1e890088812926787c5a5bc84 100644 (file)
@@ -57,7 +57,7 @@ class CRM_Core_BAO_Country extends CRM_Core_DAO_Country {
     if (!isset(Civi::$statics[__CLASS__]['countryLimit'])) {
       $countryIsoCodes = CRM_Core_PseudoConstant::countryIsoCode();
       $country = [];
-      $countryLimit = Civi::settings()->get('countryLimit');
+      $countryLimit = Civi::settings()->get('countryLimit') ?? [];
       if (is_array($countryLimit)) {
         foreach ($countryLimit as $val) {
           // CRM-12007
@@ -94,6 +94,61 @@ class CRM_Core_BAO_Country extends CRM_Core_DAO_Country {
     return $cachedContactCountry;
   }
 
+  /**
+   * Provide list of Pinned countries.
+   *
+   * @param $availableCountries
+   * @return array
+   */
+  public static function pinnedContactCountries($availableCountries) {
+    if (!isset(Civi::$statics[__CLASS__]['cachedPinnedContactCountries'])) {
+      $pinnedContactCountries = Civi::settings()->get('pinnedContactCountries');
+      $pinnedCountries = [];
+      if (!empty($pinnedContactCountries)) {
+        foreach ($pinnedContactCountries as $pinnedContactCountry) {
+          // pinned country must exist in available country list.
+          if (array_key_exists($pinnedContactCountry, $availableCountries)) {
+            $pinnedCountries[$pinnedContactCountry] = $availableCountries[$pinnedContactCountry];
+          }
+        }
+      }
+      Civi::$statics[__CLASS__]['cachedPinnedContactCountries'] = $pinnedCountries;
+    }
+
+    return Civi::$statics[__CLASS__]['cachedPinnedContactCountries'];
+  }
+
+  /**
+   * Provide sorted list of countries with default country with first position
+   * then Pinned countries then rest of countries.
+   *
+   * @param $availableCountries
+   * @return array
+   */
+  public static function _defaultContactCountries($availableCountries) {
+    // localise the country names if in an non-en_US locale
+    $tsLocale = CRM_Core_I18n::getLocale();
+    if ($tsLocale != '' and $tsLocale != 'en_US') {
+      $i18n = CRM_Core_I18n::singleton();
+      $i18n->localizeArray($availableCountries, [
+        'context' => 'country',
+      ]);
+      $availableCountries = CRM_Utils_Array::asort($availableCountries);
+    }
+    $pinnedContactCountries = CRM_Core_BAO_Country::pinnedContactCountries($availableCountries);
+    // if default country is set, percolate it to the top, then pinned countries and then remaining available countries.
+    if ($defaultContactCountry = Civi::settings()->get('defaultContactCountry')) {
+      $default = [$defaultContactCountry => $availableCountries[$defaultContactCountry] ?? NULL];
+      $availableCountries = $default + $pinnedContactCountries + $availableCountries;
+    }
+    elseif (!empty($pinnedContactCountries)) {
+      // if default country is missing then use only pinned countries at the top then rest of the countries.
+      $availableCountries = $pinnedContactCountries + $availableCountries;
+    }
+
+    return $availableCountries;
+  }
+
   /**
    * Provide cached default country name.
    *