Bei manchen Projekten wäre es nützlich, die Suche der Listenansicht zu verbessern, um zum Beispiel nach Produkten in einer bestimmten Kategorie zu suchen. Oder auch Daten einer Relation (Verbindung zum Beispiel Product->Categories.title) zu durchsuchen - aktuell ist dies nicht möglich.
Über die TCA wird definiert, welche Felder durchsucht werden können. Ein Beispiel hierfür ist:
'ctrl' => array(
'title' => 'Produkt',
....
'searchFields' => 'title,code,description,sku,description',
....
),
Ein durchsuchen von zum Beispiel 'category.title' ist damit leider nicht möglich. Der Benutzer möchte nach "Kategorie:Werkzeuge" suchen, und dann sollen alle Elemente geliefert werden, welche eine Verbindung (über das Feld 'category') zu dieser Kategorie besitzen.
Damit man so ein Suchverhalten umsetzen kann, gibt es einen Hook, mit welchem man das Suchquery anpassen kann - den modifyQuery-Hook. Dieser muss zuerst in der ext_localconf.php registriert werden:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS'][\TYPO3\CMS\Recordlist\RecordList\DatabaseRecordList::class]['modifyQuery'][131313131] = \Varioous\VaSite\Hooks\DataHandler::class;
Dieser Hook wird nun natürlich bei allen Listview-Queries aufgerufen - daher muss zuerst auf die zu durchsuchende Tabelle und das Modul (in welchem sich der Benutzer aktuell befindet) überprüft werden. Anschließend wird überprüft, ob der Benutzer nach einer bestimmten Kategorie sucht. Ist dies der Fall, wird das Query dahingehend angepasst, dass zuerst die Kategorie gesucht wird und anschließend werden alle Elemente geliefert, die mit dieser Kategorie verbunden sind.
public function modifyQuery(
array $parameters,
string $table,
int $pageId,
array $additionalConstraints,
array $fieldList,
QueryBuilder $queryBuilder
) {
// check if we want to modify the query -> check for table, route, module
if (!is_null(GeneralUtility::_GP('route')) && GeneralUtility::_GP('route') == '/module/web/list'
&& !is_null(GeneralUtility::_GP('id')) && GeneralUtility::_GP('id') == '37'
&& !is_null(GeneralUtility::_GP('search_field'))
&& !is_null(GeneralUtility::_GP('table')) && GeneralUtility::_GP('table') == 'tx_vasite_domain_model_product') {
//get search query
$searchField = strtolower(GeneralUtility::_GP(('search_field')));
//check if search query contains marker "kategorie:"
if (!empty($searchField) && strpos($searchField, 'kategorie:') !== false) {
$categoryToSearch = trim(str_replace('kategorie:', '', $searchField));
//search if we have a matching cagegory
$categoryToSearchResult = $this->categoryRepository->findByTitle($categoryToSearch);
if (!empty($categoryToSearchResult) && $categoryToSearchResult->count() == 1) {
/** @var Category $categoryToSearchObject */
$categoryToSearchObject = $categoryToSearchResult->getFirst();
$queryBuilder->resetQueryPart('where');
//search for elements that have a relation to this category
$queryBuilder->andWhere($queryBuilder->expr()->in('category', [$categoryToSearchObject->getUid()]));
}
}
}
}
Hier eine Beispielsuche aus dem TYPO3-Backend:
Aus der Reihe TYPO3 Tipps und Tricks
-
UriBuilder im Backend-Context - Links im Backend-Context erstellen
-
Seite programmatisch erstellen / Create Page Programmatically
-
Microsoft SQL Server (MSSQL) und TYPO3 in einem Docker-Container
-
Manueller/Programmatischer Login in Controller-Action (TYPO3 9)
Weitere interessante Beiträge zum Thema TYPO3 findest du hier.
Weitere Beiträge aus der Reihe TYPO3 Tipps und Tricks
-
TYPO3 11 - Custom Backend Module mit List-Module
-
Suche in der Listenansicht verbessern (im TYPO3-Backend)
-
UriBuilder im Backend-Context - Links im Backend-Context erstellen
-
Seite programmatisch erstellen / Create Page Programmatically
-
Microsoft SQL Server (MSSQL) und TYPO3 in einem Docker-Container
-
Manueller/Programmatischer Login in Controller-Action (TYPO3 9)
Weitere interessante Beiträge zum Thema TYPO3 findest du hier.
Wir entwickeln digitale Lösungen mit Leidenschaft
Warum wir das tun? Weil die Verwirklichung Ihrer Vision unser größter Anspruch und die schönste Anerkennung ist. Deshalb nehmen wir uns gerne ausreichend Zeit für die Realisierung Ihres digitalen Projekts.
Kontaktieren Sie uns, wir sind gerne für Ihre Fragen da: