From 6a1c88d389270258766b20bfcbbfe27899fb1797 Mon Sep 17 00:00:00 2001 From: Jaap Jansma <jaap.jansma@civicoop.org> Date: Thu, 11 Mar 2021 20:05:02 +0100 Subject: [PATCH] Fix for #85 DB Error: no such field when using Tab on contact summary with contributions --- CHANGELOG.md | 1 + .../DataProcessorContactSummaryTab.php | 23 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cfb0acb..4ebe4e29 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 ce7ffcd9..06ef872e 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; + } + } -- GitLab