Refactor language pseudoconstant CRM-12464
authorColeman Watts <coleman@civicrm.org>
Mon, 6 May 2013 04:36:03 +0000 (21:36 -0700)
committerColeman Watts <coleman@civicrm.org>
Thu, 30 May 2013 05:14:05 +0000 (22:14 -0700)
----------------------------------------
* CRM-12464: Search improvements in 4.4
  http://issues.civicrm.org/jira/browse/CRM-12464

14 files changed:
CRM/Contact/BAO/Contact.php
CRM/Contact/Form/Edit/CommunicationPreferences.php
CRM/Contact/Form/Inline/CommunicationPreferences.php
CRM/Contact/Form/Search/Criteria.php
CRM/Core/BAO/UFGroup.php
CRM/Core/I18n.php
CRM/Core/I18n/PseudoConstant.php
CRM/Core/OptionGroup.php
CRM/Core/PseudoConstant.php
CRM/Logging/Differ.php
CRM/Profile/Selector/Listings.php
CRM/Utils/PseudoConstant.php
tests/phpunit/CRM/Core/PseudoConstantTest.php
xml/schema/Contact/Contact.xml

index b6aedf1fc272301d1747622770bb8f2cf0853418..7d927fba2507daebde8eee3e76562539fd5c2702 100644 (file)
@@ -2273,8 +2273,7 @@ AND       civicrm_openid.is_primary = 1";
 
       // get preferred languages
       if (!empty($contact->preferred_language)) {
-        $languages = CRM_Core_PseudoConstant::languages();
-        $values['preferred_language'] = CRM_Utils_Array::value($contact->preferred_language, $languages);
+        $values['preferred_language'] = CRM_Core_PseudoConstant::getValue('CRM_Contact_DAO_Contact', 'preferred_language', $contact->preferred_language);
       }
 
       // Calculating Year difference
index 259ea81bdd054f0575e9aaeaf1d0c089f71b0ecc..8d6f4ffe472f0d6e5b74236748d73dce70b558fd 100644 (file)
@@ -83,7 +83,7 @@ class CRM_Contact_Form_Edit_CommunicationPreferences {
       ts('Preferred Language'),
       array(
         '' => ts('- select -')) +
-      CRM_Core_PseudoConstant::languages()
+      CRM_Contact_BAO_Contact::buildOptions('preferred_language')
     );
 
     if (!empty($privacyOptions)) {
@@ -162,8 +162,7 @@ class CRM_Contact_Form_Edit_CommunicationPreferences {
   static function setDefaultValues(&$form, &$defaults) {
 
     if (!empty($defaults['preferred_language'])) {
-      $languages = array_flip(CRM_Core_PseudoConstant::languages());
-      $defaults['preferred_language'] = $languages[$defaults['preferred_language']];
+      $defaults['preferred_language'] = CRM_Core_PseudoConstant::getKey('CRM_Contact_DAO_Contact', 'preferred_language', $defaults['preferred_language']);
     }
 
     // CRM-7119: set preferred_language to default if unset
index 58bc83b341ea1fbd7a0be3488bd8f39fdf11529d..9fc3ef70b4668e2abc0f17845e05baa16629ce54 100644 (file)
@@ -60,8 +60,7 @@ class CRM_Contact_Form_Inline_CommunicationPreferences extends CRM_Contact_Form_
     $defaults = parent::setDefaultValues();
 
     if (!empty($defaults['preferred_language'])) {
-      $languages = array_flip(CRM_Core_PseudoConstant::languages());
-      $defaults['preferred_language'] = $languages[$defaults['preferred_language']];
+      $defaults['preferred_language'] = CRM_Core_PseudoConstant::getKey('CRM_Contact_DAO_Contact', 'preferred_language', $defaults['preferred_language']);
     }
 
     // CRM-7119: set preferred_language to default if unset
index ac7f0e312ade7860298432d3cb8766708ea40592..8af5ba00260879dcb336c918b35529f7f0ea096d 100644 (file)
@@ -254,8 +254,7 @@ class CRM_Contact_Form_Search_Criteria {
     $form->addGroup($commPreff, 'preferred_communication_method', ts('Preferred Communication Method'));
 
     //CRM-6138 Preferred Language
-    $langPreff = CRM_Core_PseudoConstant::languages();
-    $form->add('select', 'preferred_language', ts('Preferred Language'), array('' => ts('- any -')) + $langPreff);
+    $form->add('select', 'preferred_language', ts('Preferred Language'), array('' => ts('- any -')) + CRM_Contact_BAO_Contact::buildOptions('preferred_language'));
 
     // Phone search
     $form->addElement('text', 'phone_numeric', ts('Phone Number'), CRM_Core_DAO::getAttribute('CRM_Core_DAO_Phone', 'phone'));
index f7e93f1ea5ed359e00ea8af9157f6749c8841308..f998b898a2af03b8f22b649e30e04e07bf24c025 100644 (file)
@@ -981,9 +981,8 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
           $values[$index] = implode(',', $compref);
         }
         elseif ($name === 'preferred_language') {
-          $languages      = CRM_Core_PseudoConstant::languages();
           $params[$index] = $details->$name;
-          $values[$index] = $languages[$details->$name];
+          $values[$index] = CRM_Core_PseudoConstant::getValue('CRM_Contact_DAO_Contact', 'preferred_language', $details->$name);
         }
         elseif ($name == 'group') {
           $groups = CRM_Contact_BAO_GroupContact::getContactGroup($cid, 'Added', NULL, FALSE, TRUE);
@@ -1929,7 +1928,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
       $form->add('select', $name, $title, CRM_Core_SelectValues::pmf());
     }
     elseif ($fieldName === 'preferred_language') {
-      $form->add('select', $name, $title, array('' => ts('- select -')) + CRM_Core_PseudoConstant::languages());
+      $form->add('select', $name, $title, array('' => ts('- select -')) + CRM_Contact_BAO_Contact::buildOptions('preferred_language'));
     }
     elseif ($fieldName == 'external_identifier') {
       $form->add('text', $name, $title, $attributes, $required);
index 889d88ae4591981608e4f44a29dd7c8815a1116a..d71c916bd74de31fd15345f413af075ca9f4e30e 100644 (file)
@@ -106,7 +106,7 @@ class CRM_Core_I18n {
     static $enabled = NULL;
 
     if (!$all) {
-      $all = CRM_Core_I18n_PseudoConstant::languages();
+      $all = CRM_Contact_BAO_Contact::buildOptions('preferred_language');
 
       // check which ones are available; add them to $all if not there already
       $config = CRM_Core_Config::singleton();
index 985b23021a5714f10d9bc2048c82d8606d0be6e6..b96c2bc5ee29b1b96834ffd2acb852082f0d783e 100644 (file)
  *
  */
 class CRM_Core_I18n_PseudoConstant {
-  static function &languages() {
-    static $languages = NULL;
-    if ($languages === NULL) {
-      $rows = array();
-      CRM_Core_OptionValue::getValues(array('name' => 'languages'), $rows, 'weight', TRUE);
-
-      $languages = array();
-      foreach ($rows as $row) {
-        $languages[$row['name']] = $row['label'];
-      }
-    }
-    return $languages;
-  }
 
   static function longForShort($short) {
     $longForShortMapping = self::longForShortMapping();
index 08bf0844dbdb2f5025a9911d0a80a924b5e6b203..6f4fd7faf9762528286d057e1665c99722e0bacd 100644 (file)
@@ -100,22 +100,25 @@ class CRM_Core_OptionGroup {
   static function &values(
     $name, $flip = FALSE, $grouping = FALSE,
     $localize = FALSE, $condition = NULL,
-    $labelColumnName = 'label', $onlyActive = TRUE, $fresh = FALSE
+    $labelColumnName = 'label', $onlyActive = TRUE, $fresh = FALSE, $keyColumnName = 'value'
   ) {
-    $cacheKey = self::createCacheKey($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive);
+    $cacheKey = self::createCacheKey($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive, $keyColumnName);
 
-    if (array_key_exists($cacheKey, self::$_cache) && !$fresh) {
-      return self::$_cache[$cacheKey];
-    }
-
-    $cache = CRM_Utils_Cache::singleton();
-    $var = $cache->get($cacheKey);
-    if ($var && !$fresh) {
-      return $var;
+    if (!$fresh) {
+      // Fetch from static var
+      if (array_key_exists($cacheKey, self::$_cache)) {
+        return self::$_cache[$cacheKey];
+      }
+      // Fetch from main cache
+      $cache = CRM_Utils_Cache::singleton();
+      $var = $cache->get($cacheKey);
+      if ($var) {
+        return $var;
+      }
     }
 
     $query = "
-SELECT  v.{$labelColumnName} as {$labelColumnName} ,v.value as value, v.grouping as grouping
+SELECT  v.{$labelColumnName} as {$labelColumnName} ,v.{$keyColumnName} as value, v.grouping as grouping
 FROM   civicrm_option_value v,
        civicrm_option_group g
 WHERE  v.option_group_id = g.id
@@ -133,7 +136,7 @@ WHERE  v.option_group_id = g.id
       $query .= $condition;
     }
 
-    $query .= "  ORDER BY v.weight";
+    $query .= " ORDER BY v.weight";
 
     $p = array(1 => array($name, 'String'));
     $dao = CRM_Core_DAO::executeQuery($query, $p);
@@ -160,15 +163,15 @@ WHERE  v.option_group_id = g.id
    * @param $labelColumnName
    * @param $onlyActive
    */
-  protected static function flushValues($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive) {
-    $cacheKey = self::createCacheKey($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive);
+  protected static function flushValues($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive, $keyColumnName = 'value') {
+    $cacheKey = self::createCacheKey($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive, $keyColumnName);
     $cache = CRM_Utils_Cache::singleton();
     $cache->delete($cacheKey);
     unset(self::$_cache[$cacheKey]);
   }
 
-  protected static function createCacheKey($name, $flip, $grouping, $localize, $condition, $labelColumnName, $onlyActive) {
-    $cacheKey = "CRM_OG_{$name}_{$flip}_{$grouping}_{$localize}_{$condition}_{$labelColumnName}_{$onlyActive}";
+  protected static function createCacheKey() {
+    $cacheKey = "CRM_OG_" . serialize(func_get_args());
     return $cacheKey;
   }
 
index 82e834fd724075778935b8ccb9b1064352540504..e6c87c75bc63a373a6dd3b3f8e84f2f20e47b7f2 100644 (file)
@@ -260,7 +260,8 @@ class CRM_Core_PseudoConstant {
           $params['condition'],
           $params['labelColumn'] ? $params['labelColumn'] : 'label',
           $params['onlyActive'],
-          $params['fresh']
+          $params['fresh'],
+          $params['keyColumn'] ? $params['keyColumn'] : 'value'
         );
       }
 
@@ -1592,26 +1593,6 @@ WHERE  id = %1
     return self::$greetingDefaults;
   }
 
-  /**
-   * Get all the Languages from database.
-   *
-   * @access public
-   * @static
-   *
-   * @return array self::languages - array reference of all languages
-   *
-   */
-  public static function &languages() {
-    return CRM_Core_I18n_PseudoConstant::languages();
-  }
-
-  /**
-   * Alias of above
-   */
-  public static function &preferredLanguage() {
-    return CRM_Core_I18n_PseudoConstant::languages();
-  }
-
   /**
    * Get all extensions
    *
index c98637ceea9f8271f237909c8c30618adcc73792..81d73200fd40c8f7598dbc53e906c999525f2a9d 100644 (file)
@@ -229,6 +229,7 @@ WHERE log_conn_id = %1 AND
       if (in_array($table, array_keys($daos))) {
         // FIXME: these should be populated with pseudo constants as they
         // were at the time of logging rather than their current values
+        // FIXME: Use *_BAO:buildOptions() method rather than pseudoconstants & fetch programmatically
         $values[$table] = array(
           'contribution_page_id' => CRM_Contribute_PseudoConstant::contributionPage(),
           'contribution_status_id' => CRM_Contribute_PseudoConstant::contributionStatus(),
@@ -238,12 +239,12 @@ WHERE log_conn_id = %1 AND
           'location_type_id' => CRM_Core_PseudoConstant::get('CRM_Core_DAO_Address', 'location_type_id'),
           'payment_instrument_id' => CRM_Contribute_PseudoConstant::paymentInstrument(),
           'phone_type_id' => CRM_Core_PseudoConstant::get('CRM_Core_DAO_Phone', 'phone_type_id'),
-          'preferred_communication_method' => CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'preferred_communication_method'),
-          'preferred_language' => CRM_Core_PseudoConstant::languages(),
-          'prefix_id' => CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'prefix_id'),
+          'preferred_communication_method' => CRM_Contact_BAO_Contact::buildOptions('preferred_communication_method'),
+          'preferred_language' => CRM_Contact_BAO_Contact::buildOptions('preferred_language'),
+          'prefix_id' => CRM_Contact_BAO_Contact::buildOptions('prefix_id'),
           'provider_id' => CRM_Core_PseudoConstant::get('CRM_Core_DAO_IM', 'provider_id'),
           'state_province_id' => CRM_Core_PseudoConstant::stateProvince(),
-          'suffix_id' => CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'suffix_id'),
+          'suffix_id' => CRM_Contact_BAO_Contact::buildOptions('suffix_id'),
           'website_type_id' => CRM_Core_PseudoConstant::get('CRM_Core_DAO_Website', 'website_type_id'),
           'activity_type_id' => CRM_Core_PseudoConstant::activityType(TRUE, TRUE, FALSE, 'label', TRUE),
           'case_type_id' => CRM_Case_PseudoConstant::caseType('label', FALSE),
index 4c3018f42342e6e1a414519827939a19cfff9b38..2d3aacbea154b4a7414796d9970d39312f78a882 100644 (file)
@@ -568,9 +568,6 @@ class CRM_Profile_Selector_Listings extends CRM_Core_Selector_Base implements CR
     // we need to determine of overlay profile should be shown
     $showProfileOverlay = CRM_Core_BAO_UFGroup::showOverlayProfile();
 
-    $imProviders  = CRM_Core_PseudoConstant::get('CRM_Core_DAO_IM', 'provider_id');
-    $websiteTypes = CRM_Core_PseudoConstant::get('CRM_Core_DAO_Website', 'website_type_id');
-    $languages    = CRM_Core_PseudoConstant::languages();
     while ($result->fetch()) {
       if (isset($result->country)) {
         // the query returns the untranslated country name
@@ -606,7 +603,7 @@ class CRM_Profile_Selector_Listings extends CRM_Core_Selector_Base implements CR
         ) {
           $url      = CRM_Utils_System::fixURL($result->$name);
           $typeId   = substr($name, 0, -4) . "-website_type_id";
-          $typeName = $websiteTypes[$result->$typeId];
+          $typeName = CRM_Core_PseudoConstant::getValue('CRM_Core_DAO_Website', 'website_type_id', $result->$typeId);
           if ($typeName) {
             $row[] = "<a href=\"$url\">{$result->$name} (${typeName})</a>";
           }
@@ -615,7 +612,7 @@ class CRM_Profile_Selector_Listings extends CRM_Core_Selector_Base implements CR
           }
         }
         elseif ($name == 'preferred_language') {
-          $row[] = $languages[$result->$name];
+          $row[] = CRM_Core_PseudoConstant::getValue('CRM_Contact_DAO_Contact', 'preferred_language', $result->$name);
         }
         elseif ($multipleSelectFields &&
           array_key_exists($name, $multipleSelectFields)
@@ -642,7 +639,7 @@ class CRM_Profile_Selector_Listings extends CRM_Core_Selector_Base implements CR
         elseif (strpos($name, '-im')) {
           if (!empty($result->$name)) {
             $providerId   = $name . "-provider_id";
-            $providerName = $imProviders[$result->$providerId];
+            $providerName = CRM_Core_PseudoConstant::getValue('CRM_Core_DAO_IM', 'provider_id', $result->$providerId);
             $row[]        = $result->$name . " ({$providerName})";
           }
           else {
index d32454646beb47ee453cf0997ca69a260ce61ac0..92efe7e0d4b80ea17d2bd035d51f88192eab002a 100644 (file)
@@ -37,7 +37,6 @@ class CRM_Utils_PseudoConstant {
     'CRM_Event_PseudoConstant',
     'CRM_Contribute_PseudoConstant',
     'CRM_Member_PseudoConstant',
-    'CRM_Grant_PseudoConstant',
   );
 
   /**
index e0a035a61e9c1156a4aa279c75ce01b249e8cf66..eab4917fa43db4f0fcfb8c7aba92526658aa655e 100644 (file)
@@ -422,6 +422,11 @@ class CRM_Core_PseudoConstantTest extends CiviUnitTestCase {
           'sample' => 'Team',
           'exclude' => 'Individual',
         ),
+        array(
+          'fieldName' => 'preferred_language',
+          'sample' => array('en_US' => 'English (United States)'),
+          'max' => 250,
+        ),
       ),
       'CRM_Batch_DAO_Batch' => array(
         array(
@@ -497,7 +502,16 @@ class CRM_Core_PseudoConstantTest extends CiviUnitTestCase {
         $this->assertNotEmpty($optionValues, $message);
 
         // Ensure sample value is contained in the returned optionValues.
-        $this->assertContains($field['sample'], $optionValues, $message);
+        if (!is_array($field['sample'])) {
+          $this->assertContains($field['sample'], $optionValues, $message);
+        }
+        // If sample is an array, we check keys and values
+        else {
+          foreach ($field['sample'] as $key => $value) {
+            $this->assertArrayHasKey($key, $optionValues, $message);
+            $this->assertEquals(CRM_Utils_Array::value($key, $optionValues), $value, $message);
+          }
+        }
 
         // Ensure exclude value is not contained in the optionValues
         if (!empty($field['exclude'])) {
@@ -523,7 +537,7 @@ class CRM_Core_PseudoConstantTest extends CiviUnitTestCase {
       3 => 'Organization',
     );
     // By default this should return an array keyed by name
-    $result = CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'contact_type');
+    $result = CRM_Contact_DAO_Contact::buildOptions('contact_type');
     $this->assertEquals($byName, $result);
     // But we can also fetch by ID
     $result = CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', 'contact_type', array('keyColumn' => 'id', 'labelColumn' => 'name'));
index 4ab58b1cbd27cb7e9ceebf494455f26aad2c0768..6c90dc3b9866f35b77f17413d8890a7ca17525e0 100644 (file)
       <comment>Which language is preferred for communication. FK to languages in civicrm_option_value.</comment>
       <headerPattern>/^lang/i</headerPattern>
       <import>true</import>
+      <pseudoconstant>
+        <optionGroupName>languages</optionGroupName>
+        <keyColumn>name</keyColumn>
+      </pseudoconstant>
       <add>3.2</add>
   </field>
   <field>