}
if (!empty($this->_permissionWhereClause) && empty($this->_displayRelationshipType)) {
+ if (!empty($this->_permissionFromClause)) {
+ $from .= " $this->_permissionFromClause";
+ }
if (empty($where)) {
$where = "WHERE $this->_permissionWhereClause";
}
}
self::filterCountryFromValuesIfStateExists($formValues);
+ CRM_Core_BAO_CustomValue::fixCustomFieldValue($formValues);
foreach ($formValues as $id => $values) {
if (self::isAlreadyProcessedForQueryFormat($values)) {
$this->_params[$id][1]
);
$this->_qill[0][] = ts("%1 %2 %3", [
- 1 => $field['title'],
+ 1 => $field['title'] ?? '',
2 => $qillop,
3 => $qillVal,
]);
public function tag(&$values) {
list($name, $op, $value, $grouping, $wildcard) = $values;
- list($qillop, $qillVal) = self::buildQillForFieldValue('CRM_Core_DAO_EntityTag', "tag_id", $value, $op, ['onlyActive' => FALSE]);
// API/Search Builder format array(operator => array(values))
if (is_array($value)) {
if (in_array(key($value), CRM_Core_DAO::acceptedSQLOperators(), TRUE)) {
}
}
+ if (strpos($op, 'NULL') || strpos($op, 'EMPTY')) {
+ $value = NULL;
+ }
+
+ $tagTree = CRM_Core_BAO_Tag::getChildTags();
+ foreach ((array) $value as $tagID) {
+ if (!empty($tagTree[$tagID])) {
+ $value = array_unique(array_merge($value, $tagTree[$tagID]));
+ }
+ }
+
+ list($qillop, $qillVal) = self::buildQillForFieldValue('CRM_Core_DAO_EntityTag', "tag_id", $value, $op, ['onlyActive' => FALSE]);
+
// implode array, then remove all spaces
$value = str_replace(' ', '', implode(',', (array) $value));
if (!empty($value)) {
$options = $query->_options;
if (!empty($query->_permissionWhereClause)) {
+ if (!empty($query->_permissionFromClause) && !stripos($from, 'aclContactCache')) {
+ $from .= " $query->_permissionFromClause";
+ }
if (empty($where)) {
$where = "WHERE $query->_permissionWhereClause";
}
*/
public function generatePermissionClause($onlyDeleted = FALSE, $count = FALSE) {
if (!$this->_skipPermission) {
- $this->_permissionWhereClause = CRM_ACL_API::whereClause(
- CRM_Core_Permission::VIEW,
- $this->_tables,
- $this->_whereTables,
- NULL,
- $onlyDeleted,
- $this->_skipDeleteClause
- );
+ $permissionClauses = CRM_Contact_BAO_Contact_Permission::cacheClause();
+ $this->_permissionWhereClause = $permissionClauses[1];
+ $this->_permissionFromClause = $permissionClauses[0];
- // regenerate fromClause since permission might have added tables
- if ($this->_permissionWhereClause) {
- //fix for row count in qill (in contribute/membership find)
- if (!$count) {
- $this->_useDistinct = TRUE;
+ if (CRM_Core_Permission::check('access deleted contacts')) {
+ if (!$onlyDeleted) {
+ $this->_permissionWhereClause = str_replace('( 1 )', '(contact_a.is_deleted = 0)', $this->_permissionWhereClause);
+ }
+ else {
+ if ($this->_permissionWhereClause === '( 1 )') {
+ $this->_permissionWhereClause = str_replace('( 1 )', '(contact_a.is_deleted)', $this->_permissionWhereClause);
+ }
+ else {
+ $this->_permissionWhereClause .= " AND (contact_a.is_deleted) ";
+ }
+ }
+ }
+
+ if (isset($this->_tables['civicrm_activity'])) {
+ $bao = new CRM_Activity_BAO_Activity();
+ $clauses = $subclauses = [];
+ foreach ((array) $bao->addSelectWhereClause() as $field => $vals) {
+ if ($vals && $field !== 'id') {
+ $clauses[] = $bao->tableName() . ".$field " . $vals;
+ }
+ elseif ($vals) {
+ $subclauses[] = "$field " . implode(" AND $field ", (array) $vals);
+ }
+ }
+ if ($subclauses) {
+ $clauses[] = $bao->tableName() . '.`id` IN (SELECT `id` FROM `' . $bao->tableName() . '` WHERE ' . implode(' AND ', $subclauses) . ')';
+ }
+ if (!empty($clauses) && $this->_permissionWhereClause) {
+ $this->_permissionWhereClause .= ' AND (' . implode(' AND ', $clauses) . ')';
+ }
+ elseif (!empty($clauses)) {
+ $this->_permissionWhereClause .= '(' . implode(' AND ', $clauses) . ')';
}
- //CRM-15231
- $this->_fromClause = self::fromClause($this->_tables, NULL, NULL, $this->_primaryLocation, $this->_mode);
- $this->_simpleFromClause = self::fromClause($this->_whereTables, NULL, NULL, $this->_primaryLocation, $this->_mode);
- // note : this modifies _fromClause and _simpleFromClause
- $this->includePseudoFieldsJoin($this->_sort);
}
}
else {
*/
public function summaryContribution($context = NULL) {
list($innerselect, $from, $where, $having) = $this->query(TRUE);
+ if (!empty($this->_permissionFromClause) && !stripos($from, 'aclContactCache')) {
+ $from .= " $this->_permissionFromClause";
+ }
if ($this->_permissionWhereClause) {
$where .= " AND " . $this->_permissionWhereClause;
}
$from = str_replace("INNER JOIN", "LEFT JOIN", $from);
$from .= $qcache['from'];
$where = $qcache['where'];
+ if (!empty($this->_permissionFromClause) && !stripos($from, 'aclContactCache')) {
+ $from .= " $this->_permissionFromClause";
+ }
if (!empty($this->_permissionWhereClause)) {
$where .= "AND $this->_permissionWhereClause";
}
if (empty($fieldSpec['bao'])) {
continue;
}
- $sortedOptions = $fieldSpec['bao']::buildOptions($fieldSpec['name'], NULL, [
- 'orderColumn' => CRM_Utils_Array::value('labelColumn', $pseudoConstantMetadata, 'label'),
- ]);
+ $sortedOptions = $fieldSpec['bao']::buildOptions($fieldSpec['name']);
+ natcasesort($sortedOptions);
$fieldIDsInOrder = implode(',', array_keys($sortedOptions));
// Pretty sure this validation ALSO happens in the order clause & this can't be reached but...
// this might give some early warning.