*/
public static $_openedPanes = array();
+ /**
+ * For search builder - which custom fields are location-dependent
+ * @var array
+ */
+ public $_locationSpecificCustomFields = array();
+
/**
* The tables which have a dependency on location and/or address
*
CRM_Contact_BAO_Query_Hook::singleton()->alterSearchQuery($this, 'select');
if (!empty($this->_cfIDs)) {
- $this->_customQuery = new CRM_Core_BAO_CustomQuery($this->_cfIDs, TRUE);
+ $this->_customQuery = new CRM_Core_BAO_CustomQuery($this->_cfIDs, TRUE, $this->_locationSpecificCustomFields);
$this->_customQuery->query();
$this->_select = array_merge($this->_select, $this->_customQuery->_select);
$this->_element = array_merge($this->_element, $this->_customQuery->_element);
}
if (!empty($addressCustomFieldIds)) {
- $cfIDs = $addressCustomFieldIds;
- $customQuery = new CRM_Core_BAO_CustomQuery($cfIDs);
+ $customQuery = new CRM_Core_BAO_CustomQuery($addressCustomFieldIds);
foreach ($addressCustomFieldIds as $cfID => $locTypeName) {
foreach ($locTypeName as $name => $dnc) {
+ $this->_locationSpecificCustomFields[$cfID] = array($name, array_search($name, $locationTypes));
$fieldName = "$name-custom_{$cfID}";
$tName = "$name-address-custom-{$cfID}";
$aName = "`$name-address-custom-{$cfID}`";
if ($returnQuery) {
return $query;
}
-
if ($count) {
return CRM_Core_DAO::singleValueQuery($query);
}
}
else {
if (substr($v[0], 0, 7) == 'custom_') {
- $type = $fields[$v[0]]['data_type'];
+ // Get rid of appended location type id
+ list($fieldKey) = explode('-', $v[0]);
+ $type = $fields[$fieldKey]['data_type'];
// hack to handle custom data of type state and country
if (in_array($type, array(
*/
protected $_contactSearch;
+ protected $_locationSpecifiCustomFields;
+
/**
* This stores custom data group types and tables that it extends
*
* @param array $ids the set of custom field ids
*
* @access public
- */ function __construct($ids, $contactSearch = FALSE) {
+ */
+ function __construct($ids, $contactSearch = FALSE, $locationSpecificFields = array()) {
$this->_ids = &$ids;
+ $this->_locationSpecifiCustomFields = $locationSpecificFields;
$this->_select = array();
$this->_element = array();
}
if ($joinTable) {
- $this->_tables[$name] = "\nLEFT JOIN $name ON $name.entity_id = $joinTable.id";
+ $joinClause = 1;
+ $joinTableAlias = $joinTable;
+ // Set location-specific query
+ if (isset($this->_locationSpecifiCustomFields[$id])) {
+ list($locationType, $locationTypeId) = $this->_locationSpecifiCustomFields[$id];
+ $joinTableAlias = "$locationType-address";
+ $joinClause = "\nLEFT JOIN $joinTable `$locationType-address` ON (`$locationType-address`.contact_id = contact_a.id AND `$locationType-address`.location_type_id = $locationTypeId)";
+ }
+ $this->_tables[$name] = "\nLEFT JOIN $name ON $name.entity_id = `$joinTableAlias`.id";
if ($this->_ids[$id]) {
$this->_whereTables[$name] = $this->_tables[$name];
}
if ($joinTable != 'contact_a') {
- $this->_whereTables[$joinTable] = $this->_tables[$joinTable] = 1;
+ $this->_whereTables[$joinTableAlias] = $this->_tables[$joinTableAlias] = $joinClause;
}
elseif ($this->_contactSearch) {
CRM_Contact_BAO_Query::$_openedPanes[ts('Custom Fields')] = TRUE;
* @access public
*/
function where() {
- //CRM_Core_Error::debug( 'fld', $this->_fields );
- //CRM_Core_Error::debug( 'ids', $this->_ids );
-
foreach ($this->_ids as $id => $values) {
// Fixed for Isuue CRM 607