In diesem kurzen Tutorial wird erklärt, wie man in der eigenen Extension ein Frontend-Plugin Custom Feld hinzufügt. Dies kann man z.B. für Filter oder andere Parameter nutzen, die im Frontend genutzt werden können. Dieses Tutorial fügt eine Select-Box mit verschiedenen Filtern hinzu.
1. Anpassungen im TCA
Zuerst muss die tt_content.php in Configuration/TCA/Overrides angepasst werden. In diesem beispiel wird ein Feld für eine FilterID hinzugefügt, um zwischen verschiedenen Obstarten zu sortieren:
<?php
defined('TYPO3') || die();
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'meineExt',
'meineExtPlugin',
'meineExtTitle'
);
// Füge das neue Feld "filterid" zur TCA von tt_content hinzu
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('tt_content', [
'tx_meineext_filterid' => [
'exclude' => 1,
'label' => 'Filter ID',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['Nichts ausgeben', 0],
['Bananenarten', '122888'],
['Kirscharten', '126619'],
['Apfelarten', '126779'],
],
],
],
]);
// Füge das Feld "filterid" zu dem spezifischen Plugin hinzu:
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['meineExt_meineExtPlugin'] = 'tx_meineext_filterid';
2. Datenbankfelder hinzufügen
Damit die Änderungen auch gespeichert werden können, muss nun in der Tabelle tt_content ein neues Feld hinzugefügt werden. Dies machen wir über die ext_tables.sql:
//Vorhandene Tabellenänderungen
...
CREATE TABLE tt_content (
tx_meineext_filterid int(11) DEFAULT '0' NOT NULL
);
Wenn wir jetzt im TYPO3 Backend unter Admin-Tools -> Maintenance einmal den Systemcache leeren und den Autoload Dumpen, sollte bei der Datenbanküberprüfung die Anpassung in tt_content zu sehen sein. Sie sollte auch bereits angehakt sein. Jetzt kann die Aktualisierung durchgeführt werden.
3. Frontend Controller anpassen
Zum Schluss können wir nun via cObjectData im Controller und in der gewünschten Action mit der hinzugefügten Filterfunktion arbeiten:
/**
* action list
*
* @return \Psr\Http\Message\ResponseInterface
*/
public function listAction(): \Psr\Http\Message\ResponseInterface
{
$data = $this->configurationManager->getContentObject()->data;
if($data['tx_meineext_filterid'] == 0) {
$products = $this->productRepository->findAll();
$this->view->assign('products', $products);
}
else {
$products = $this->productRepository->findByProductid($data['tx_meineext_filterid']);
}
$this->view->assign('products', $products);
return $this->htmlResponse();
}