Hallo,
ich schreibe dieses aktuelle Update ( mit EFG Version 2.2.1 ) hier an den Anfang.
Eventuell kann ein Moderator meinen unteren Schmarn löschen ...
Aufgabe:
Für die "Sucheinstellungen" mit einem "einzelnen Eingabefeld" bei Auswahl ein oder mehrerer Suchfelder soll die Suche/Filter erweitert werden:
Standardmäßig sucht EFG über alle ausgewählten Suchfelder nach z.B. "Berlin Kreuzberg" und nur nach genau "Berlin Kreuzberg".
Lösung:
Mit den (n. update sicheren ) Änderungen in der "system/modules/efg/modules/ModuleFormdataListing.php" wird über alle Suchfelder nach "%Berlin%" oder "%Kreuzberg%" gesucht.
Ein anderes Beispiel wäre "Heinz Fischer Berlin Kreuz Tempelhof" usw..
Die Datei findet Ihr in der Anlage.
Hierbei ist das EFG Standardverhalten default mäßig aktiv.
Die neue "MatchAny" Suche wird über einen GET-Parameter aktiviert.
Sofern gewünscht dann einfach z.B. im EFG Template "list_fd_simple_default.html5" diesen wie folgt setzen:
Code:
<?php if ($this->searchable): ?>
<!-- indexer::stop -->
<div class="list_search">
...
<input type="hidden" name="q" value="matchany">
Also - evtl. kann es ja jemand brauchen
und evtl. könnt Ihr das ja mal weiter testen ( habe es im Modul mit verschiedenen Optionen probiert ) o. ein Entwickler evtl. nach Optimierungen durchsehen ( bin nicht so der Entwickler ).
Grundsätzlich könnte man dies auch für die anderen beiden Suchtypen "Dropdown und Eingabefeld" u. "Mehrere Eingabefelder" erweitern - habe ich aber so nicht benötigt.
Ach ja - die SQL Query Aufbereitung habe ich von der implementierten Vorgehensweise übernommen - eine EFG Originale sähe z.B. so aus:
Code:
SELECT id,alias,date,
(SELECT value FROM tl_formdata_details WHERE ff_name="gm" AND pid=f.id) AS `gm`,
(SELECT value FROM tl_formdata_details WHERE ff_name="nutzung" AND pid=f.id) AS `nutzung`,
(SELECT value FROM tl_formdata_details WHERE ff_name="vorname" AND pid=f.id) AS `vorname`,
(SELECT value FROM tl_formdata_details WHERE ff_name="nachname" AND pid=f.id) AS `nachname`,
(SELECT value FROM tl_formdata_details WHERE ff_name="email" AND pid=f.id) AS `email`,
(SELECT value FROM tl_formdata_details WHERE ff_name="anfrage" AND pid=f.id) AS `anfrage`,
fd_user,fd_member
FROM tl_formdata f
WHERE
((SELECT value FROM tl_formdata_details WHERE ff_name="vorname" AND pid=f.id ) LIKE '%Berlin Kreuzberg%' OR
(SELECT value FROM tl_formdata_details WHERE ff_name="nachname" AND pid=f.id ) LIKE '%Berlin Kreuzberg%' OR
(SELECT value FROM tl_formdata_details WHERE ff_name="anfrage" AND pid=f.id ) LIKE '%Berlin Kreuzberg%') AND
((SELECT value FROM tl_formdata_details WHERE ff_name="nutzung" AND pid=f.id) ='wobj') AND form='TEST-EFG' ORDER BY CAST(`date` AS DECIMAL(20,5)) desc
Bei der MatchAny Suche subsummiert sich das Ganze mit den einzelnen Select-Abfragen um ein vielfaches.
Ich dachte daher zunächst das eine Abfrage mit Join übersichtlicher und besser wäre ala:
Code:
SELECT DISTINCT F_DATA.id, F_DATA.alias, F_DATA.date,
( SELECT value FROM tl_formdata_details WHERE ff_name="vorname" AND pid = F_DATA.id ) as `vorname`,
( SELECT value FROM tl_formdata_details WHERE ff_name="nachname" AND pid = F_DATA.id ) as `nachname`,
( SELECT value FROM tl_formdata_details WHERE ff_name="email" AND pid = F_DATA.id ) as `email`,
( SELECT value FROM tl_formdata_details WHERE ff_name="anfrage" AND pid = F_DATA.id ) as `anfrage`
FROM tl_formdata AS F_DATA JOIN tl_formdata_details AS F_DATA_DETAIL
ON F_DATA.id = F_DATA_DETAIL.pid
WHERE F_DATA_DETAIL.value LIKE '%Berlin%' OR F_DATA_DETAIL.value LIKE '%Kreuzberg%'
Tatsächlich benötigt diese JOIN ON Version aber um ein vielfaches mehr Zeit - habe es daher wie bisher gelassen ...
Frank
Lesezeichen