diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cfb0acbc1d951107c86bdc8bb088462f5dcbad9..4ebe4e2941225ce3de72b7a6caae4872ac406953 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Version 1.34 (not yet released) * Fixed issue with filtering on state/province custom fields. +* Fix for #85 DB Error: no such field when using "Tab on contact summary" with contributions # Version 1.33 diff --git a/CRM/Contact/DataProcessorContactSummaryTab.php b/CRM/Contact/DataProcessorContactSummaryTab.php index ce7ffcd9c252d94d760a60705c2b1edabae6a6d1..06ef872eea7e4b802e657e0ef897431cb779a506 100644 --- a/CRM/Contact/DataProcessorContactSummaryTab.php +++ b/CRM/Contact/DataProcessorContactSummaryTab.php @@ -4,6 +4,8 @@ * @license AGPL-3.0 */ +use Civi\DataProcessor\DataFlow\CombinedDataFlow\CombinedSqlDataFlow; +use Civi\DataProcessor\DataFlow\SqlTableDataFlow; use CRM_Dataprocessor_ExtensionUtil as E; use Civi\DataProcessor\Output\UIFormOutputInterface; use Civi\DataProcessor\ProcessorType\AbstractProcessorType; @@ -320,7 +322,7 @@ class CRM_Contact_DataProcessorContactSummaryTab implements UIFormOutputInterfac * @throws \Civi\DataProcessor\Exception\FieldNotFoundException */ public static function alterDataProcessor($contact_id, $output, AbstractProcessorType $dataProcessorClass) { - list($datasource_name, $field_name) = explode('::', $output['configuration']['contact_id_field'], 2); + [$datasource_name, $field_name] = explode('::', $output['configuration']['contact_id_field'], 2); $dataSource = $dataProcessorClass->getDataSourceByName($datasource_name); if (!$dataSource) { throw new \Civi\DataProcessor\Exception\DataSourceNotFoundException(E::ts("Requires data source '%1' which could not be found. Did you rename or deleted the data source?", array(1=>$datasource_name))); @@ -340,7 +342,8 @@ class CRM_Contact_DataProcessorContactSummaryTab implements UIFormOutputInterfac $fieldSpecification->alias = 'contact_summary_tab_contact_id'; $dataFlow = $dataSource->ensureField($fieldSpecification); if ($dataFlow && $dataFlow instanceof SqlDataFlow) { - $whereClause = new SimpleWhereClause($dataFlow->getName(), $fieldSpecification->name, '=', $contact_id, $fieldSpecification->type); + $tableAlias = self::getTableAlias($dataFlow); + $whereClause = new SimpleWhereClause($tableAlias, $fieldSpecification->name, '=', $contact_id, $fieldSpecification->type); $dataFlow->addWhereClause($whereClause); } elseif ($dataFlow && $dataFlow instanceof InMemoryDataFlow) { $filterClass = new SimpleFilter($fieldSpecification->name, '=', $contact_id); @@ -349,4 +352,20 @@ class CRM_Contact_DataProcessorContactSummaryTab implements UIFormOutputInterfac return $dataProcessorClass; } + /** + * Returns the table alias of a sql data flow. + * + * @param \Civi\DataProcessor\DataFlow\SqlDataFlow $dataFlow + * @return string|null + */ + protected static function getTableAlias(SqlDataFlow $dataFlow) { + $tableAlias = $dataFlow->getName(); + if ($dataFlow instanceof SqlTableDataFlow) { + $tableAlias = $dataFlow->getTableAlias(); + } elseif ($dataFlow instanceof CombinedSqlDataFlow) { + $tableAlias = $dataFlow->getPrimaryTableAlias(); + } + return $tableAlias; + } + }