Pass cachekey around more & criteria less
authoreileen <emcnaughton@wikimedia.org>
Tue, 5 Jun 2018 05:27:50 +0000 (17:27 +1200)
committereileen <emcnaughton@wikimedia.org>
Tue, 12 Jun 2018 03:56:46 +0000 (15:56 +1200)
It turned out the toggleDuplicates was not working when criteria was set as the validation rule didn't work.

Passing around cacheKey
is easier to validate and we know the cache willbe created at the point of toggle. Use cacheKey instead
in url

CRM/Contact/Page/AJAX.php
CRM/Contact/Page/DedupeFind.php
CRM/Dedupe/Merger.php
templates/CRM/Contact/Page/DedupeFind.tpl

index 937a63904f49f8ca4b5f03f4f3393c9578104290..af6fdae49853fc22f060a285d716c802aef7dbea 100644 (file)
@@ -1017,13 +1017,9 @@ LIMIT {$offset}, {$rowCount}
    * Mark dupe pairs as selected from un-selected state or vice-versa, in dupe cache table.
    */
   public static function toggleDedupeSelect() {
-    $rgid = CRM_Utils_Type::escape($_REQUEST['rgid'], 'Integer');
-    $gid  = CRM_Utils_Type::escape($_REQUEST['gid'], 'Integer');
     $pnid = $_REQUEST['pnid'];
     $isSelected = CRM_Utils_Type::escape($_REQUEST['is_selected'], 'Boolean');
-    $criteria = CRM_Utils_Request::retrieve('criteria', 'Json', $null, FALSE, '{}');
-
-    $cacheKeyString = CRM_Dedupe_Merger::getMergeCacheKeyString($rgid, $gid, json_decode($criteria, TRUE));
+    $cacheKeyString = CRM_Utils_Request::retrieve('cacheKey', 'Alphanumeric', $null, FALSE);
 
     $params = array(
       1 => array($isSelected, 'Boolean'),
index 287f30ef11fbd24b72d92ab5601619dd250c11ff..a6cc014b3d45a8e6431902883c41dad49ca1ff1b 100644 (file)
@@ -111,6 +111,8 @@ class CRM_Contact_Page_DedupeFind extends CRM_Core_Page_Basic {
     $this->assign('urlQuery', CRM_Utils_System::makeQueryString($urlQry));
     $this->assign('isSelected', $this->isSelected());
     $criteria = json_decode($criteria, TRUE);
+    $cacheKeyString = CRM_Dedupe_Merger::getMergeCacheKeyString($rgid, $gid, $criteria);
+    $this->assign('cacheKey', $cacheKeyString);
 
     if ($context == 'search') {
       $context = 'search';
@@ -120,7 +122,7 @@ class CRM_Contact_Page_DedupeFind extends CRM_Core_Page_Basic {
     if ($action & CRM_Core_Action::RENEW) {
       // empty cache
       if ($rgid) {
-        CRM_Core_BAO_PrevNextCache::deleteItem(NULL, CRM_Dedupe_Merger::getMergeCacheKeyString($rgid, $gid, $criteria));
+        CRM_Core_BAO_PrevNextCache::deleteItem(NULL, $cacheKeyString);
       }
       $urlQry['action'] = 'update';
       CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/contact/dedupefind', $urlQry));
@@ -171,9 +173,6 @@ class CRM_Contact_Page_DedupeFind extends CRM_Core_Page_Basic {
 
       $this->assign('sourceUrl', CRM_Utils_System::url('civicrm/ajax/dedupefind', $urlQry, FALSE, NULL, FALSE));
 
-      //reload from cache table
-      $cacheKeyString = CRM_Dedupe_Merger::getMergeCacheKeyString($rgid, $gid, $criteria);
-
       $stats = CRM_Dedupe_Merger::getMergeStats($cacheKeyString);
       if ($stats) {
         $message = CRM_Dedupe_Merger::getMergeStatsMsg($stats);
index e57e83d6373cb4857758c7ca64df61041ae1a9d4..1c444e836b8a386569c1b279cf6fdf93b5542f91 100644 (file)
@@ -2035,7 +2035,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
    */
   public static function getMergeCacheKeyString($rule_group_id, $group_id, $criteria = array(), $checkPermissions = TRUE) {
     $contactType = CRM_Dedupe_BAO_RuleGroup::getContactTypeForRuleGroup($rule_group_id);
-    $cacheKeyString = "merge {$contactType}";
+    $cacheKeyString = "merge_{$contactType}";
     $cacheKeyString .= $rule_group_id ? "_{$rule_group_id}" : '_0';
     $cacheKeyString .= $group_id ? "_{$group_id}" : '_0';
     $cacheKeyString .= !empty($criteria) ? md5(serialize($criteria)) : '_0';
index d5ac0f2fbabfd4163c348d44a68e1cc3f98ee217..afdfe3cc7a16d3dcf50e027d35f690ea8576266a 100644 (file)
       var is_selected = CRM.$('.crm-dedupe-select-all').prop('checked') ? 1 : 0;
     }
 
-    var criteria = {/literal}'{$criteria|escape}'{literal};
-    criteria  = criteria.length > 0 ? criteria : 0;
+    var cacheKey = {/literal}'{$cacheKey|escape}'{literal};
 
     var dataUrl = {/literal}"{crmURL p='civicrm/ajax/toggleDedupeSelect' h=0 q='snippet=4'}"{literal};
     var rgid = {/literal}"{$rgid}"{literal};
     rgid = rgid.length > 0 ? rgid : 0;
     gid  = gid.length > 0 ? gid : 0;
 
-    CRM.$.post(dataUrl, {pnid: id, rgid: rgid, gid: gid, is_selected: is_selected, criteria : criteria}, function (data) {
+    CRM.$.post(dataUrl, {pnid: id, rgid: rgid, gid: gid, is_selected: is_selected, cacheKey : cacheKey}, function (data) {
       // nothing to do for now
     }, 'json');
   }