Skip to content

Commit

Permalink
[BUGFIX] Fix value resolution in SOLR_RELATION
Browse files Browse the repository at this point in the history
This commit fixes issues with the resolution of values in SOLR_RELATION,
fixed is the resolution of:
- foreignLabelFields (2nd level+)
- multiple values in m:n relations
- nested m:n relations
- nested multi values

Additionally the missing stdWrap functionality on values from mm
relations is added.

Integration tests are added to ensure the right behaviour of
SOLR_RELATION.

Resolves: #3152
Resolves: #3408
  • Loading branch information
dkd-friedrich authored and dkd-kaehm committed Feb 3, 2023
1 parent ed3ce05 commit 6773efe
Show file tree
Hide file tree
Showing 8 changed files with 1,013 additions and 39 deletions.
58 changes: 38 additions & 20 deletions Classes/ContentObject/Relation.php
Original file line number Diff line number Diff line change
Expand Up @@ -191,28 +191,31 @@ protected function getRelatedItemsFromMMTable(string $localTableName, int $local
return $relatedItems;
}

$contentObject = GeneralUtility::makeInstance(ContentObjectRenderer::class);
$relatedRecords = $this->getRelatedRecords($foreignTableName, ...$selectUids);
foreach ($relatedRecords as $record) {
$contentObject->start($record, $foreignTableName);

if (isset($foreignTableTca['columns'][$foreignTableLabelField]['config']['foreign_table'])
&& !empty($this->configuration['enableRecursiveValueResolution'])
) {
$this->configuration['localField'] = $foreignTableLabelField;
if (strpos($this->configuration['foreignLabelField'], '.') !== false) {
$foreignTableLabelFieldArr = explode('.', $this->configuration['foreignLabelField']);
unset($foreignTableLabelFieldArr[0]);
$this->configuration['foreignLabelField'] = implode('.', $foreignTableLabelFieldArr);
} else {
unset($this->configuration['foreignLabelField']);
}

$this->configuration['localField'] = $foreignTableLabelField;

$contentObject = GeneralUtility::makeInstance(ContentObjectRenderer::class);
$contentObject->start($record, $foreignTableName);

return $this->getRelatedItems($contentObject);
$relatedItems = array_merge($relatedItems, $this->getRelatedItems($contentObject));
continue;
}
if ($this->getLanguageUid() > 0) {
$record = $this->frontendOverlayService->getOverlay($foreignTableName, $record);
}
$relatedItems[] = $record[$foreignTableLabelField];

$relatedItems[] = $contentObject->stdWrap($record[$foreignTableLabelField] ?? '', $this->configuration) ?? '';
}

return $relatedItems;
Expand Down Expand Up @@ -266,31 +269,43 @@ protected function getRelatedItemsFromForeignTable(
$foreignTableName = $localFieldTca['config']['foreign_table'];
$foreignTableTca = $this->tcaService->getTableConfiguration($foreignTableName);
$foreignTableLabelField = $this->resolveForeignTableLabelField($foreignTableTca);
$localField = $this->configuration['localField'];

/** @var $relationHandler RelationHandler */
$relationHandler = GeneralUtility::makeInstance(RelationHandler::class);
if (!empty($localFieldTca['config']['MM'] ?? '')) {
$relationHandler->start(
'',
$foreignTableName,
$localFieldTca['config']['MM'],
$localRecordUid,
$localTableName,
$localFieldTca['config']
);
} else {
$itemList = $parentContentObject->data[$localField] ?? '';
$relationHandler->start($itemList, $foreignTableName, '', $localRecordUid, $localTableName, $localFieldTca['config']);
}

$itemList = $parentContentObject->data[$this->configuration['localField']] ?? '';

$relationHandler->start($itemList, $foreignTableName, '', $localRecordUid, $localTableName, $localFieldTca['config']);
$selectUids = $relationHandler->tableArray[$foreignTableName];

if (!is_array($selectUids) || count($selectUids) <= 0) {
return $relatedItems;
}

$relatedRecords = $this->getRelatedRecords($foreignTableName, ...$selectUids);

foreach ($relatedRecords as $relatedRecord) {
$resolveRelatedValue = $this->resolveRelatedValue(
$resolveRelatedValues = $this->resolveRelatedValue(
$relatedRecord,
$foreignTableTca,
$foreignTableLabelField,
$parentContentObject,
$foreignTableName
);
if (!empty($resolveRelatedValue) || !$this->configuration['removeEmptyValues']) {
$relatedItems[] = $resolveRelatedValue;

foreach ($resolveRelatedValues as $resolveRelatedValue) {
if (!empty($resolveRelatedValue) || !$this->configuration['removeEmptyValues']) {
$relatedItems[] = $resolveRelatedValue;
}
}
}

Expand All @@ -307,7 +322,7 @@ protected function getRelatedItemsFromForeignTable(
* @param ContentObjectRenderer $parentContentObject cObject
* @param string $foreignTableName Related record table name
*
* @return string
* @return array
*
* @throws AspectNotFoundException
* @throws DBALException
Expand All @@ -318,12 +333,12 @@ protected function resolveRelatedValue(
string $foreignTableLabelField,
ContentObjectRenderer $parentContentObject,
string $foreignTableName = ''
): string {
): array {
if ($this->getLanguageUid() > 0 && !empty($foreignTableName)) {
$relatedRecord = $this->frontendOverlayService->getOverlay($foreignTableName, $relatedRecord);
}

$value = $relatedRecord[$foreignTableLabelField];
$values = [$relatedRecord[$foreignTableLabelField]];

if (
!empty($foreignTableName)
Expand Down Expand Up @@ -354,14 +369,17 @@ protected function resolveRelatedValue(
$foreignTableTca['columns'][$foreignTableLabelField],
$parentContentObject
);
$value = array_pop($relatedItemsFromForeignTable);
$values = $relatedItemsFromForeignTable;

// restore
$this->configuration = $backupConfiguration;
$parentContentObject->data = $backupRecord;
}
foreach ($values as &$value) {
$value = $parentContentObject->stdWrap($value, $this->configuration) ?? '';
}

return $parentContentObject->stdWrap($value, $this->configuration) ?? '';
return $values;
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
<?php

return [
'ctrl' => [
'title' => 'tx_fakeextension_domain_model_bar',
'label' => 'title',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'cruser_id' => 'cruser_id',
'versioningWS' => true,
'origUid' => 't3_origuid',
'editlock' => 'editlock',
'languageField' => 'sys_language_uid',
'transOrigPointerField' => 'l10n_parent',
'transOrigDiffSourceField' => 'l10n_diffsource',
'sortby' => 'sorting',
'delete' => 'deleted',
'enablecolumns' => [
'disabled' => 'hidden',
'starttime' => 'starttime',
'endtime' => 'endtime',
],
'searchFields' => 'uid',
],
'columns' => [
'sys_language_uid' => [
'exclude' => 1,
'label' => 'sys_language_uid',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'special' => 'languages',
'items' => [
[
'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.allLanguages',
-1,
'flags-multiple',
],
],
'default' => 0,
],
],
'l10n_parent' => [
'displayCond' => 'FIELD:sys_language_uid:>:0',
'label' => 'l10n_parent',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['', 0],
],
'foreign_table' => 'tx_fakeextension_domain_model_foo',
'foreign_table_where' => 'AND tx_fakeextension_domain_model_foo.pid=###CURRENT_PID### AND tx_fakeextension_domain_model_foo.sys_language_uid IN (-1,0)',
],
],
'l10n_diffsource' => [
'config' => [
'type' => 'passthrough',
'default' => '',
],
],
'hidden' => [
'exclude' => 1,
'label' => 'hidden',
'config' => [
'type' => 'check',
'default' => 0,
],
],
'cruser_id' => [
'label' => 'cruser_id',
'config' => [
'type' => 'passthrough',
],
],
'pid' => [
'label' => 'pid',
'config' => [
'type' => 'passthrough',
],
],
'crdate' => [
'label' => 'crdate',
'config' => [
'type' => 'passthrough',
],
],
'tstamp' => [
'label' => 'tstamp',
'config' => [
'type' => 'passthrough',
],
],
'sorting' => [
'label' => 'sorting',
'config' => [
'type' => 'passthrough',
],
],
'starttime' => [
'exclude' => 1,
'label' => 'starttime',
'config' => [
'type' => 'input',
'size' => 8,
'eval' => 'datetime',
'default' => 0,
'renderType' => 'inputDateTime',
['behaviour' => ['allowLanguageSynchronization' => true]],
],
],
'endtime' => [
'exclude' => 1,
'label' => 'endtime',
'config' => [
'type' => 'input',
'size' => 8,
'eval' => 'datetime',
'default' => 0,
'renderType' => 'inputDateTime',
['behaviour' => ['allowLanguageSynchronization' => true]],
],
],
'title' => [
'exclude' => 0,
'l10n_mode' => 'prefixLangTitle',
'label' => 'title',
'config' => [
'type' => 'input',
'size' => 60,
'eval' => 'required',
],
],
'main_category' => [
'exclude' => 0,
'label' => 'main_category',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'foreign_table' => 'sys_category',
'foreign_table_where' => ' AND (sys_category.sys_language_uid = 0 OR sys_category.l10n_parent = 0)',
'size' => 1,
'minitems' => 0,
'maxitems' => 1,
['behaviour' => ['allowLanguageSynchronization' => true]],
],
],
'inline_relation_parent' => [
'config' => [
'type' => 'passthrough',
],
],
'mm_assignments' => [
'exclude' => 0,
'label' => 'mm_assignments',
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'foreign_table' => 'tx_fakeextension_domain_model_foo',
'MM' => 'tx_fakeextension_foo_bar_mm',
'MM_opposite_field' => 'mm_assignments',
'foreign_table_where' => 'AND (tx_fakeextension_domain_model_foo.sys_language_uid = 0 OR tx_fakeextension_domain_model_foo.l10n_parent = 0)',
'size' => 10,
],
],
],
'types' => [
'0' => [
'showitem' => 'l10n_parent, l10n_diffsource,title,main_category,mm_assignments',
],
],
];
Loading

0 comments on commit 6773efe

Please sign in to comment.