Поработав еще, я разобрался с рабочим решением, используя userFunc
, чтобы перезаписать возвращаемый результат MenuProcessor
.Но мое внутреннее чувство говорит, что это не очень красивое решение, скорее как обходной путь, я думаю, что должен быть лучший способ, чем этот.Не стесняйтесь улучшать или высказать свое мнение:
page.10 {
dataProcessing {
110 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
110 {
special = userfunction
special {
userFunc = Vendor\Extension\ContentMenu->process
table = tt_content
pidInList = 9 # Page where the content comes from, uid possible
titleField = header
}
as = contentmenu
}
}
}
И:
class ContentMenu {
/**
* @var \TYPO3\CMS\Frontend\ContentObject\ContentDataProcessor
*/
protected $contentDataProcessor;
/**
* @var \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer
*/
public $cObj;
public function __construct() {
$this->contentDataProcessor = GeneralUtility::makeInstance(ContentDataProcessor::class);
}
public function process(string $content, array $config) {
if(empty($content)) {
$content = [];
}
$titleField = $this->cObj->stdWrapValue('titleField', $config, 'header');
$tableName = $this->cObj->stdWrapValue('table', $config, 'tt_content');
$records = $this->cObj->getRecords($tableName, $config);
$processedRecordVariables = [];
foreach($records as $key => $record) {
/** @var ContentObjectRenderer $recordContentObjectRenderer */
$recordContentObjectRenderer = GeneralUtility::makeInstance(ContentObjectRenderer::class);
$recordContentObjectRenderer->start($record, $tableName);
$processedRecordVariables[$key] = ['data' => $record];
$processedRecordVariables[$key] = $this->contentDataProcessor->process($recordContentObjectRenderer, $config, $processedRecordVariables[$key]);
$content[] = [
'uid' => $record['uid'],
'title' => $record[$titleField],
// TODO: improve by using slug:
'_OVERRIDE_HREF' => 'index.php?id='.$record['pid'].'#c'.$record['uid']
];
}
return $content;
}
}