* @param int $id2
* @param string $cacheKey
* @param array $conflicts
+ * @param string $mode
*
* @return bool
* @throws CRM_Core_Exception
*/
- public static function markConflict($id1, $id2, $cacheKey, $conflicts) {
+ public static function markConflict($id1, $id2, $cacheKey, $conflicts, $mode) {
if (empty($cacheKey) || empty($conflicts)) {
return FALSE;
}
];
$pncFind = CRM_Core_DAO::executeQuery($sql, $params);
+ $conflictTexts = [];
+
+ foreach ($conflicts as $entity => $entityConflicts) {
+ if ($entity === 'contact') {
+ foreach ($entityConflicts as $conflict) {
+ $conflictTexts[] = "{$conflict['title']}: '{$conflict[$id1]}' vs. '{$conflict[$id2]}'";
+ }
+ }
+ else {
+ foreach ($entityConflicts as $locationConflict) {
+ if (!is_array($locationConflict)) {
+ continue;
+ }
+ $displayField = CRM_Dedupe_Merger::getLocationBlockInfo()[$entity]['displayField'];
+ $conflictTexts[] = "{$locationConflict['title']}: '{$locationConflict[$displayField][$id1]}' vs. '{$locationConflict[$displayField][$id2]}'";
+ }
+ }
+ }
+ $conflictString = implode(', ', $conflictTexts);
+
while ($pncFind->fetch()) {
$data = $pncFind->data;
if (!empty($data)) {
$data = CRM_Core_DAO::unSerializeField($data, CRM_Core_DAO::SERIALIZE_PHP);
- $data['conflicts'] = implode(",", array_values($conflicts));
+ $data['conflicts'] = $conflictString;
+ $data[$mode]['conflicts'] = $conflicts;
$pncUp = new CRM_Core_DAO_PrevNextCache();
$pncUp->id = $pncFind->id;
}
/**
- * @param $values
+ * @param string $sqlValues string of SQLValues to insert
+ * @return array
*/
- public static function setItem($values) {
- $insert = "INSERT INTO civicrm_prevnext_cache ( entity_table, entity_id1, entity_id2, cachekey, data ) VALUES \n";
- $query = $insert . implode(",\n ", $values);
+ public static function convertSetItemValues($sqlValues) {
+ $closingBrace = strpos($sqlValues, ')') - strlen($sqlValues);
+ $valueArray = array_map('trim', explode(', ', substr($sqlValues, strpos($sqlValues, '(') + 1, $closingBrace - 1)));
+ foreach ($valueArray as $key => &$value) {
+ // remove any quotes from values.
+ if (substr($value, 0, 1) == "'") {
+ $valueArray[$key] = substr($value, 1, -1);
+ }
+ }
+ return $valueArray;
+ }
- //dump the dedupe matches in the prevnext_cache table
- CRM_Core_DAO::executeQuery($query);
+ /**
+ * @param array|string $entity_table
+ * @param int $entity_id1
+ * @param int $entity_id2
+ * @param string $cacheKey
+ * @param string $data
+ */
+ public static function setItem($entity_table = NULL, $entity_id1 = NULL, $entity_id2 = NULL, $cacheKey = NULL, $data = NULL) {
+ // If entity table is an array we are passing in an older format where this function only had 1 param $values. We put a deprecation warning.
+ if (!empty($entity_table) && is_array($entity_table)) {
+ Civi::log()->warning('Deprecated code path. Values should not be set this is going away in the future in favour of specific function params for each column.', array('civi.tag' => 'deprecated'));
+ foreach ($values as $value) {
+ $valueArray = self::convertSetItemValues($value);
+ self::setItem($valueArray[0], $valueArray[1], $valueArray[2], $valueArray[3], $valueArray[4]);
+ }
+ }
+ else {
+ CRM_Core_DAO::executeQuery("INSERT INTO civicrm_prevnext_cache (entity_table, entity_id1, entity_id2, cacheKey, data) VALUES
+ (%1, %2, %3, %4, '{$data}')", [
+ 1 => [$entity_table, 'String'],
+ 2 => [$entity_id1, 'Integer'],
+ 3 => [$entity_id2, 'Integer'],
+ 4 => [$cacheKey, 'String'],
+ ]);
+ }
}
/**
AND c.created_date < date_sub( NOW( ), INTERVAL %2 day )
";
$params = [
- 1 => [CRM_Core_BAO_Cache::cleanKey('CiviCRM Search PrevNextCache'), 'String'],
+ 1 => [CRM_Utils_Cache::cleanKey('CiviCRM Search PrevNextCache'), 'String'],
2 => [$cacheTimeIntervalDays, 'Integer'],
];
CRM_Core_DAO::executeQuery($sql, $params);