Ergebnis 1 bis 9 von 9

Thema: [Gelöst] Sucheinstellungen - Filter - MatchAny

  1. #1
    Contao-Urgestein Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    1.507
    Partner-ID
    6122

    Standard [Gelöst] Sucheinstellungen - Filter - MatchAny

    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
    Angehängte Dateien Angehängte Dateien
    Geändert von Franko (12.02.2015 um 18:24 Uhr)
    Freelancer, Digital Design Enthusiast, Contao Aficionado and Tutorial Junkie @MoinFranko - Carpe diem ...

  2. #2
    Contao-Urgestein Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    1.507
    Partner-ID
    6122

    Standard

    Hm,
    habe mich wohl schon mit den Sucheinstellungen vertan.
    Wenn ich hier die Option "Einzelnes Eingabefeld" mit mehreren durchsuchbaren Feldern [vorname] und [nachname] angebe passiert folgendes:

    Wenn ich jetzt im einzelnen Suchfeld "Frank" eingebe erhalte ich als Ergebnis alle Vorkommen mit Frank - OK
    Bei Eingabe "Frank Fischer" erhalte ich gar nichts obwohl ein Datensatz mit Vorname=Frank und Nachname=Fischer vorhanden ist

    Ich hätte gerne eine ODER Suche - also als Ergebnis alle Vorkommen von "Frank" oder "Fischer" aus den angegebenen Suchfeldern... ???

    Wenn ich versuche dies über die "Bedingung" zu setzen:

    vorname={{'input::vorname'}} or nachname={{'input::nachname'}} und ich die Get-Parameter dann übergebe: xyz.htm?vorname=Frank&nachname=fischer
    geht es zwar ...

    ... aber ich erhalte dann keine Anzeige ohne Übergabeparameter. Kann man das in der Bedingung irgendwie abfangen?

    Frank
    Geändert von Franko (12.02.2015 um 18:09 Uhr)
    Freelancer, Digital Design Enthusiast, Contao Aficionado and Tutorial Junkie @MoinFranko - Carpe diem ...

  3. #3
    Contao-Urgestein Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    1.507
    Partner-ID
    6122

    Standard

    Eine Bedingung für ein Feld habe ich jetzt so gesetzt:

    Code:
    anfrageart LIKE '%{{input::s1}}%'
    Hierdurch erhalte ich alle Daten (ungefiltert) aufgelistet sofern keine Übergabeparameter vorhanden sind. Diese Übergabeparameter werden im Template über eine Select-Auswahl manuell generiert.
    Der Übergabeparameter sieht dann so aus:

    Code:
    xyz.html?s1=abc
    Bleibt nur die Frage mit dem einzeiligen Suchfeld. Habe hier jetzt nur ein Suchfeld [XYZ] ausgewählt - ist eine Textarea mit z.B. dem Inhalt "Hallo hier soll gesucht werden".

    - Suche nach "hallo" (...&search=anfrage&for=hallo) - OK
    - Such nach "hallo hier" (...&search=anfrage&for=hallo+hier) - Fehlanzeige - Kein Ergebnis

    Grundsätzlich würde für dieses Beispiel zwar "...&search=anfrage&for=hallo&for=hier" zwar dann ein Ergebnis bringen - aber naja.

    Funktionieren würde es auch mit einer Übergabe ala

    Code:
    ...&search=anfrage&for=hallo%hier
    anstatt
    Code:
    ...&search=anfrage&for=hallo+hier
    Nur wie kann ich das von efg generierte + entfernen/austauschen? ...

    Für neue Anregungen dankbar
    Frank
    Geändert von Franko (12.02.2015 um 18:09 Uhr)
    Freelancer, Digital Design Enthusiast, Contao Aficionado and Tutorial Junkie @MoinFranko - Carpe diem ...

  4. #4
    Contao-Urgestein Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    1.507
    Partner-ID
    6122

    Standard

    Also aktuell: In den Sucheinstellungen habe ich den Typ "Einzelnes Eingabefeld" und unter "Durchsuchbare Felder" nur ein Feld markiert [anfrage].

    Das Feld beinhaltet zum Test Inhalte der Form:
    Mein Problem habe ich seit 2015
    und
    In 2015 fing mein Problem an
    Sucheingaben:
    2015 = Beide werden aufgelistet
    Problem = Beide werden aufgelistet

    Problem 2015 = Kein Ergebnis

    Ich habe jetzt in der "ModuleFormdataListing.php" folgendes geändert:
    Code:
    ...
    switch ($strSearchFormType)
    {
    case 'singlefield':
    ...
    
    //$varKeyword = array_fill(0, count($arrConds), '%' . \Input::get('for') . '%');
                  
    $varKeyword = array_fill(0, count($arrConds), '%' . preg_replace('/\s+/', '%', \Input::get('for')) . '%');
    
    ...
    Jetzt erhalte ich zumindest bei der Sucheingabe nach "Problem 2015" eine einzige Ausgabe:
    Mein Problem habe ich seit 2015
    Was muß ich noch ändern, damit die Query unabhängig von der Reihenfolge der Eingabe alle Datensätze findet in denen entweder wie in diesem Beispiel "Problem" oder "2015" enthalten sind ...

    Danke
    Frank
    Geändert von Franko (12.02.2015 um 18:10 Uhr)
    Freelancer, Digital Design Enthusiast, Contao Aficionado and Tutorial Junkie @MoinFranko - Carpe diem ...

  5. #5
    Contao-Urgestein Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    1.507
    Partner-ID
    6122

    Standard

    Update:
    In den Sucheinstellungen habe ich den Typ "Einzelnes Eingabefeld" und unter "Durchsuchbare Felder" nur ein Feld markiert. Folgende Änderungen habe ich in "ModuleFormdataListing.php" vorgenommen (s. Anlage):

    PHP-Code:
    case 'singlefield':
      if (
    strlen(\Input::get('search')) && strlen(\Input::get('for')))   {

      
    // Search Input to array          
      
    $arrayUnscharfTemp explode('--'preg_replace('/\s+/''--'trim(\Input::get('for'))));

      ...

      else
      {
        
    //$arrConds[] = '(SELECT value FROM tl_formdata_details WHERE ff_name="' . $field . '" AND pid=f.id ) LIKE ?';              
                            
        // Query for every single Search-Input
        
    foreach($arrayUnscharfTemp as $val) {                  
          
    $arrConds[] = '(SELECT value FROM tl_formdata_details WHERE ff_name="' $field '" AND pid=f.id ) LIKE ?';
        }

      ...

      if (!empty(
    $arrConds))
      {
        
    $strWhere .= (strlen($strWhere) ? " AND " " WHERE ") . '(' implode(" OR "$arrConds) . ')';

        
    //$varKeyword = array_fill(0, count($arrConds), '%' . \Input::get('for') . '%');
     
        // Query condition for every single Search-Input
        
    foreach($arrayUnscharfTemp as $key=>$value ) {
          
    $arrayUnscharfTemp[$key] = '%' $value '%';
        }

      
    $varKeyword $arrayUnscharfTemp;   
    }

      ... 
    Jetzt funktioniert die Suche ala matchAny auch - also Suche nach "Frank Kerstin Karst Heinz" listet mir alle Vorkommen auf. Allerdings solange ich nur ein einziges Feld in den durchsuchbaren Feldern angebe.

    Wähle ich hier mehr als ein Feld aus erhalte ich
    PHP Fatal error: Uncaught exception 'Exception' with message 'Too few arguments to build the query string'
    Das kann nichts mit der Angabe in https://community.contao.org/de/show...gliche-Ursache zu tun haben.

    Ich kann verschiedene Felder wählen und es klappt mit allen - nur eben immer nur mit einem ...

    Evtl. habt Ihr noch Ideen
    Danke
    Frank
    Geändert von Franko (12.02.2015 um 18:10 Uhr)
    Freelancer, Digital Design Enthusiast, Contao Aficionado and Tutorial Junkie @MoinFranko - Carpe diem ...

  6. #6
    Contao-Fan Avatar von Infidel
    Registriert seit
    25.05.2012.
    Ort
    Hattingen an der Ruhr
    Beiträge
    537

    Standard

    Hallo Suchprofi,

    gibt es auch eine Möglichkeit, dass eine Seite nur EIN Mal im Suchergebnis auftaucht, auch wenn das Wort dort mehrmals vertreten ist?

    LG Fidel

  7. #7
    Contao-Urgestein Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    1.507
    Partner-ID
    6122

    Standard

    Zitat Zitat von Infidel Beitrag anzeigen
    Hallo Suchprofi,

    gibt es auch eine Möglichkeit, dass eine Seite nur EIN Mal im Suchergebnis auftaucht, auch wenn das Wort dort mehrmals vertreten ist?

    LG Fidel
    Hallo,
    ich verstehe nicht was Du mit "Seite" meinst. Wenn Du die Ausgabe der Suche an sich immer nur auf ein Ergebnis reduzieren möchtest hilft Dir eventuell dieser Beitrag:
    https://community.contao.org/de/show...mular-ausgeben
    Freelancer, Digital Design Enthusiast, Contao Aficionado and Tutorial Junkie @MoinFranko - Carpe diem ...

  8. #8
    Contao-Fan Avatar von Infidel
    Registriert seit
    25.05.2012.
    Ort
    Hattingen an der Ruhr
    Beiträge
    537

    Standard

    Frank,

    danke für deine Antwort. Ich möchte, dass in den Suchergebnissen z.B. zu "Pflege" eine Seite, auf der 5x das Wort Pflege vorkommt, nur ein Mal gelistet wird.

    LG Fidel

  9. #9
    Contao-Urgestein Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    1.507
    Partner-ID
    6122

    Standard

    Hallo,
    wir reden hier über die Erweiterung EFG und dessen Modul "Auflistung Formular-Daten"
    Wenn Du hier unter "Sortierung" z.B. "date desc LIMIT 1" wird nur ein einziger Ergebnissatz mit dem neuesten Datum ausgegeben.
    Die normale Suchfunktion ( also Modul "Suchmaschiene" ) bietet hierzu keine weiteren Eingrenzungen ...

    Frank
    Freelancer, Digital Design Enthusiast, Contao Aficionado and Tutorial Junkie @MoinFranko - Carpe diem ...

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •