/** * These are stub comments as this function needs more explanation - particularly in terms of how it * relates to $this->searchQuery and why it replicates rather than calles $this->searchQuery. * * This function was originally written as a wrapper for the api query but is called from multiple places * in the core code directly so the name is misleading. This function does not use the searchQuery function * but it is unclear as to whehter that is historical or there is a reason * CRM-11290 led to the permissioning action being extracted from searchQuery & shared with this function * * @param array $params * @param array $returnProperties * @param null $fields * @param string $sort * @param int $offset * @param int $row_count * @param bool $smartGroupCache * ?? update smart group cache?. * @param bool $count * Return count obnly. * @param bool $skipPermissions * Should permissions be ignored or should the logged in user's permissions be applied. * * * @return array */ public static function apiQuery($params = NULL, $returnProperties = NULL, $fields = NULL, $sort = NULL, $offset = 0, $row_count = 25, $smartGroupCache = TRUE, $count = FALSE, $skipPermissions = TRUE) { $query = new CRM_Contact_BAO_Query($params, $returnProperties, NULL, TRUE, FALSE, 1, $skipPermissions, TRUE, $smartGroupCache); //this should add a check for view deleted if permissions are enabled if ($skipPermissions) { $query->_skipDeleteClause = TRUE; } $query->generatePermissionClause(FALSE, $count); // note : this modifies _fromClause and _simpleFromClause $query->includePseudoFieldsJoin($sort); list($select, $from, $where, $having) = $query->query($count); $options = $query->_options; if (!empty($query->_permissionWhereClause)) { if (empty($where)) { $where = "WHERE {$query->_permissionWhereClause}"; } else { $where = "{$where} AND {$query->_permissionWhereClause}"; } } $sql = "{$select} {$from} {$where} {$having}"; // add group by if ($query->_useGroupBy) { $sql .= ' GROUP BY contact_a.id'; } if (!empty($sort)) { $sort = CRM_Utils_Type::escape($sort, 'String'); $sql .= " ORDER BY {$sort} "; } if ($row_count > 0 && $offset >= 0) { $offset = CRM_Utils_Type::escape($offset, 'Int'); $rowCount = CRM_Utils_Type::escape($row_count, 'Int'); $sql .= " LIMIT {$offset}, {$row_count} "; } $dao = CRM_Core_DAO::executeQuery($sql); $values = array(); while ($dao->fetch()) { if ($count) { $noRows = $dao->rowCount; $dao->free(); return array($noRows, NULL); } $val = $query->store($dao); $convertedVals = $query->convertToPseudoNames($dao, TRUE); if (!empty($convertedVals)) { $val = array_replace_recursive($val, $convertedVals); } $values[$dao->contact_id] = $val; } $dao->free(); return array($values, $options); }
function civicrm_api3_contact_getstat ($params) { // mostly copy pasted from contact_get and the functions called by it $options = array(); _civicrm_api3_contact_get_supportanomalies($params, $options); $contacts = _civicrm_api3_get_using_query_object('contact', $params, $options); $options = _civicrm_api3_get_options_from_params($params, TRUE); $inputParams = CRM_Utils_Array::value('input_params', $options, array()); $returnProperties = CRM_Utils_Array::value('return', $options, array()); if(!empty($params['check_permissions'])){ // we will filter query object against getfields $fields = civicrm_api("contact", 'getfields', array('version' => 3, 'action' => 'get')); // we need to add this in as earlier in this function 'id' was unset in favour of $entity_id $fields['values'][$entity . '_id'] = array(); $varsToFilter = array('returnProperties', 'inputParams'); foreach ($varsToFilter as $varToFilter){ if(!is_array($$varToFilter)){ continue; } $$varToFilter = array_intersect_key($$varToFilter, $fields['values']); } } // $options = array_merge($options,$additional_options); $sort = CRM_Utils_Array::value('sort', $options, NULL); $returnSQL = CRM_Utils_Array::value('sql', $options, CRM_Utils_Array::value('options_sql', $options['input_params'])); $smartGroupCache = CRM_Utils_Array::value('smartGroupCache', $params); $newParams = CRM_Contact_BAO_Query::convertFormValues($inputParams); $skipPermissions = CRM_Utils_Array::value('check_permissions', $params)? 0 :1; $query = new CRM_Contact_BAO_Query( $params, $returnProperties, NULL, TRUE, FALSE, 1, $skipPermissions, TRUE, $smartGroupCache ); //this should add a check for view deleted if permissions are enabled if ($skipPermissions){ $query->_skipDeleteClause = TRUE; } $query->generatePermissionClause(FALSE, $count); list($select, $from, $where, $having) = $query->query($count); $options = $query->_options; if(!empty($query->_permissionWhereClause)){ if (empty($where)) { $where = "WHERE $query->_permissionWhereClause"; } else { $where = "$where AND $query->_permissionWhereClause"; } } $sql = "$select $from $where $having"; if (!empty($returnProperties)) { $extra = array(); $sql = "SELECT count(*) AS total,". substr ($sql, 34,10000); //replace select contact_id, by select count(*) $sql .= " GROUP BY ". implode (",",array_keys($returnProperties)) ; } else { $sql = "SELECT count(*) AS total $from $where $having"; $extra = array ("tip"=>"if you need to group by a field, use the return param, eg return=contact_type,gender", "warning"=> "use getcount, getstat without param might be blocked in the future"); if (!empty($sort)) { $sql .= " ORDER BY $sort "; } else { $sql .= " ORDER BY total DESC "; } } if ($returnSQL) { return array("is_error"=>1,"sql"=>$sql,"from"=>$from,"where"=>$where,"having"=>$having); } $dao = CRM_Core_DAO::executeQuery($sql); $values = array(); while ($dao->fetch()) { $values[] = $dao->toArray(); } return civicrm_api3_create_success($values, $params, "contact", "getstat", $dao,$extra); }