diff --git a/CRM/ConstituentsOnly/BAO/ConstituentsOnly.php b/CRM/ConstituentsOnly/BAO/ConstituentsOnly.php new file mode 100644 index 0000000..c410430 --- /dev/null +++ b/CRM/ConstituentsOnly/BAO/ConstituentsOnly.php @@ -0,0 +1,113 @@ + cc.id + AND cc.id IN (SELECT id FROM quick_temp_table_1) + AND cc.do_not_trade = 1 + GROUP BY cc.id + "; + + foreach ($sqls as $sql) { + CRM_Core_DAO::executeQuery($sql); + } + $startPoint = stripos($query, 'from'); + $endPoint = stripos($query, 'union'); + $firstQuery = substr($query, $startPoint, ($endPoint - $startPoint)); + $firstQuery = substr($firstQuery, stripos($firstQuery, 'select')); + $firstQuery = substr($firstQuery, 0, stripos($firstQuery, 'where')); + $firstQuery = str_replace( + 'sort_name, ', + "CONCAT(cc.sort_name, ' (', og_sort_name, ')'), ", + $firstQuery + ); + + $strToReplace = " + UNION + ( + $firstQuery + INNER JOIN quick_temp_table_2 temp ON temp.contact_id = cc.id + ) + ) t + "; + + $replace = 'WHERE (cc.do_not_trade IS NULL OR cc.do_not_trade = 0) AND '; + $query = str_replace('WHERE ', $replace, $query); + $query = str_replace(') t', $strToReplace, $query); + return $query; + } + + /** + * Rebuild search result rows. + * + * @param string $query + * + */ + public static function updateSearchRows($rows) { + $contactIds = array_keys($rows); + $sql = "SELECT MAX(contact_a.id) AS contact_id, cc.id AS og_contact_id + FROM civicrm_contact contact_a + INNER JOIN civicrm_relationship cr + ON (cr.contact_id_a = contact_a.id OR cr.contact_id_b = contact_a.id) + AND contact_a.is_deleted = 0 + AND (contact_a.do_not_trade = 0 OR contact_a.do_not_trade IS NULL) + AND cr.is_active = 1 + INNER JOIN civicrm_contact cc + ON (cr.contact_id_a = cc.id OR cr.contact_id_b = cc.id) + AND contact_a.id <> cc.id + AND cc.id IN (" . implode(',', $contactIds) . ") + AND cc.do_not_trade = 1 + GROUP BY cc.id + "; + $result = CRM_Core_DAO::executeQuery($sql); + $relContactIds = []; + + while ($result->fetch()) { + $relContactIds[$result->og_contact_id] = $result->contact_id; + } + + if (!empty($relContactIds)) { + $formValues = ['contact_id' => $relContactIds]; + $queryParams = CRM_Contact_BAO_Query::convertFormValues($formValues); + $selector = new CRM_Contact_Selector( + '', + $queryParams, + $queryParams + ); + list($select, $from, $where, $having) = $selector->getQuery()->query(); + $newRows = $selector->getRows('', '', '', ''); + foreach ($relContactIds as $ogContactId => $cid) { + if (empty($newRows[$cid])) { + continue; + } + $newRows[$cid]['sort_name'] .= "({$rows[$ogContactId]['sort_name']})"; + $rows[$ogContactId] = $newRows[$cid]; + } + } + return $rows; + } + +} diff --git a/constituentsonly.php b/constituentsonly.php index fd2723a..af753df 100644 --- a/constituentsonly.php +++ b/constituentsonly.php @@ -130,7 +130,7 @@ function constituentsonly_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) */ function constituentsonly_civicrm_queryObjects(&$queryObjects, $type) { if ($type == 'Contact') { - $queryObjects[] = new CRM_ConstituentsOnly_BAO_Query(); + //$queryObjects[] = new CRM_ConstituentsOnly_BAO_Query(); } } @@ -140,8 +140,7 @@ function constituentsonly_civicrm_queryObjects(&$queryObjects, $type) { * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_contactListQuery */ function constituentsonly_civicrm_contactListQuery(&$query, $queryText, $context, $id) { - $replace = 'WHERE (cc.do_not_trade IS NULL OR cc.do_not_trade = 0) AND '; - $query = str_replace('WHERE ', $replace, $query); + $query = CRM_ConstituentsOnly_BAO_ConstituentsOnly::getQuickSearchQuery($query); } /** @@ -158,3 +157,14 @@ function constituentsonly_civicrm_selectWhereClause($entity, &$clauses) { $clauses['do_not_trade'] = ' = 0'; } } + +/** + * Implements hook_civicrm_searchColumns(). + * + * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_searchColumns + */ +function constituentsonly_civicrm_searchColumns($objectName, &$headers, &$rows, &$selector) { + if (in_array($objectName, ['contact']) && !empty($rows)) { + $rows = CRM_ConstituentsOnly_BAO_ConstituentsOnly::updateSearchRows($rows); + } +}