CRM-14501 add contact to cache key to deal with inconsistent permissioning
authorEileen McNaughton <eileen@fuzion.co.nz>
Tue, 22 Apr 2014 00:02:30 +0000 (12:02 +1200)
committerEileen McNaughton <eileen@fuzion.co.nz>
Tue, 22 Apr 2014 00:38:16 +0000 (12:38 +1200)
CRM/Contact/BAO/Contact.php
CRM/Core/Session.php
api/v3/utils.php

index 82f9f74d4823256cd986c4f6f000f7a9715d7a59..3d54cde959363b677ea8f1ca2ca45375ef98eac5 100644 (file)
@@ -1298,6 +1298,10 @@ WHERE id={$id}; ";
     $cacheKeyString .= $export ? '_1' : '_0';
     $cacheKeyString .= $status ? '_1' : '_0';
     $cacheKeyString .= $search ? '_1' : '_0';
+    //CRM-14501 it turns out that the impact of permissioning here is sometimes inconsistent. The field that
+    //calculates custom fields takes into account the logged in user & caches that for all users
+    //as an interim fix we will cache the fields by contact
+    $cacheKeyString .= '_' . CRM_Core_Session::getLoggedInContactID();
 
     if (!self::$_exportableFields || !CRM_Utils_Array::value($cacheKeyString, self::$_exportableFields)) {
       if (!self::$_exportableFields) {
index 7390bd19599e979cc134add6cf76176417837659..92d1f97b1f51014068c70a8e6b558263a6cf2fdc 100644 (file)
@@ -541,6 +541,18 @@ class CRM_Core_Session {
     self::$_managedNames = NULL;
   }
 
+  /**
+   * Retrieve contact id of the logged in user
+   * @return integer | NULL contact ID of logged in user
+   */
+  static function getLoggedInContactID() {
+    $session = CRM_Core_Session::singleton();
+    if (!is_numeric($session->get('userID'))) {
+      return NULL;
+    }
+    return $session->get('userID');
+  }
+
   function isEmpty() {
     // check if session is empty, if so we dont cache
     // stuff that we can get away with
index 2312c043aab84480b3e6a1c62b2228a03d4d6782..ec2759c80c020ed4b31208467346e6d6b8dab6f6 100644 (file)
@@ -1636,12 +1636,9 @@ function _civicrm_api3_validate_integer(&$params, &$fieldName, &$fieldInfo, $ent
 function  _civicrm_api3_resolve_contactID($contactIdExpr) {
   //if value = 'user_contact_id' replace value with logged in user id
   if ($contactIdExpr == "user_contact_id") {
-    $session = &CRM_Core_Session::singleton();
-    if (!is_numeric($session->get('userID'))) {
-      return NULL;
-    }
-    return $session->get('userID');
-  } elseif (preg_match('/^@user:(.*)$/', $contactIdExpr, $matches)) {
+    return CRM_Core_Session::getLoggedInContactID();
+  }
+  elseif (preg_match('/^@user:(.*)$/', $contactIdExpr, $matches)) {
     $config = CRM_Core_Config::singleton();
 
     $ufID = $config->userSystem->getUfId($matches[1]);