Catalog mit cfs_maps - Hook für Suchergebnisse

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Erdpferd
    Contao-Nutzer
    • 28.01.2011
    • 113

    #1

    Catalog mit cfs_maps - Hook für Suchergebnisse

    Hallo,

    ich versuche gerade, die cs-mpas Erweiterung mit dem Catalog zusammen laufen zu lassen. Das funktioniert soweit auch ganz gut. nur an einer Stelle hänge ich:

    Mittels Hook wird eine sql-Anweisung an cfs_maps übergeben, um gefilterte Listen auch gefiltert auf der Karte anzuzeigen. Das funktioniert bei einer Filterung z.B. nach der Katagorie auch hervorragend mit:

    PHP-Code:
     return 'category ='.$kategorie; 
    
    Wenn die Suche via Suchbegriff aber verwendet wird weiß ich nicht, wie ich an die Parameter herankomme.

    Ein Gedanke ist:

    PHP-Code:
    class CFSMapsFiltered extends System
    {
        public function onCfsMapsSqlCondition($tabName, $mapId, $mapDataObj, $objModule)
        {
            if ($tabName == 'cat_meinKatalog')
            {                
                $suche = $this->Input->get('search');    
                
                if (strlen($suche)){            
                    return  '?????????';
                }
            }        
        }
    } 
    
    Die Fragezeichen müssten die sql-Anweisung sein, mit der ich die entsprechenden Einträge aus der Datenbank übergeben kann. Oder funktioniert es mit $this->Input->get('search') gar nicht, sondern eventuell anders?

    Für einen hilfreichen Tipp wäre ich überaus dankbar.

    Viele Grüße,
    Marcel
  • Erdpferd
    Contao-Nutzer
    • 28.01.2011
    • 113

    #2
    Ich bin jetzt ein wenig weiter. Mein Problem ist jetzt, dass ich nicht weiß ob und wie man ein array von einem Modul in das andere übergeben kann. Gibt es dafür eine Möglichkeit.

    Anstelle von

    PHP-Code:
    $suche = $this->Input->get('search'); 
    
    will ich ein Array mit den benötigten Daten abrufen. Dieses muss aus dem Catalog irgendwie übergeben werden. Eine schlichte $GLOBALS tut es irgendwie nicht.

    Viele Grüße,
    Marcel

    Kommentar

    • Erdpferd
      Contao-Nutzer
      • 28.01.2011
      • 113

      #3
      geschafft

      Nach langem Suchen und probieren ist es endlich geschafft. Leider etwas dreckig, da ich direkt in den Catalog gehen musste und die globale Variable zu erzeugen. Gibt es eine schönere Möglichkeit, um an Daten innerhalb eines Moduls zu kommen, ohne sich direkt an dem Code zu schaffen zu machen?

      Die Lösung ist, dass die SQL-Abfrage nicht selber erzeugt wird, sondern aus dem Katalog übernommen. Eine eigene Nachbildung war mir zu aufwendig und zu komplex. Aus dem Catalog heraus wird eine globale Variable beschrieben, die im Hook ausgewertet werden kann. Dabei unbedingt die Reihenfolge der Module im Artikel beachten!

      Kommentar

      • Mikki
        Contao-Nutzer
        • 04.05.2010
        • 19

        #4
        cfs_Maps Karten aus Catalog Filter Ergebnis

        Hallo!

        Ich habe auch das Problem, dass ich gerne cfs_Maps Karten aus dem Catalog Filter Ergebnis erstellen möchte.

        Hier mein Thread dazu, ist evtl. falsch plaziert, sorry:



        Nun habe ich gesehen, dass du schon eine Lösung hast?

        Super! Kannst du mir die Schritte bis zur Lösung schildern? Anhand deiner Postings komme ich leider nicht weiter...


        DANKE!

        Kommentar

        • Erdpferd
          Contao-Nutzer
          • 28.01.2011
          • 113

          #5
          So wie ich das verstehe scheint dein Problem zu sein, die Catalogeinträge in der Karte anzeigen zu lassen. Ich habe das so gelöst:

          Für die Listenansicht und die Detailansicht sind zwei verschiedene Karten angelegt worden. Bei haben den Lokationstyp Tabelle und dort die Tabelle des Catalog ausgewählt.

          Um die gefilterte Anzeige zu bekommen musst du ein kleines Modul erstellen. In der config kannst du den Hook der CFS-Maps aufgreifen:

          PHP-Code:
          $GLOBALS['TL_HOOKS']['cfsMapsSqlCondition'][] = array('CFSMapsFiltered', 'onCfsMapsSqlCondition'); 
          
          In der Datei CFSMapsFiltered steht bei mir folgendes:

          PHP-Code:
          <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
          
          class CFSMapsFiltered extends System
          {
              public function onCfsMapsSqlCondition($tabName, $mapId, $mapDataObj, $objModule)
              {
                  if ($tabName == 'TABELLENNAME')
                  {                            
                      $filteredId = implode(',',$GLOBALS['myCatalog']['myMapId']);
                      if($filteredId != "")
                      {            
                          $sqlBack = "id IN (".$filteredId.")";
                      }
                      else
                      {    
                              $sqlBack = "";//must be empty for the detail-site    
                      }
                      return $sqlBack;
                      
                  }        
              }
          }
          ?>
          Sinn der Sache ist, die SQL-Anweisung, die bei den CFS-Maps verarbeitet wird von der gefilterten Liste zu bekommen. Es ist eine einfache Liste aller angezeigten ID's.

          Die globale Variablen habe ich in der Datei ModuleCataogList.php erzeugt (das ist nicht sauber und Updatesicher). Das "//Run Query" und der Datenbankaufruf sind original aus der Datei (die Zeile weiß ich leider nicht, da ich noch weitere Änderungen vorgenommen habe). Darunter kommen meine Änderungen:

          PHP-Code:
          // Run Query
                      $objCatalogStmt = $this->Database->prepare("SELECT ".implode(',',$this->systemColumns).",".implode(',',$arrQuery).", (SELECT name FROM tl_catalog_types WHERE tl_catalog_types.id=".$this->strTable.".pid) AS catalog_name, (SELECT jumpTo FROM tl_catalog_types WHERE tl_catalog_types.id=".$this->strTable.".pid) AS parentJumpTo FROM ".$this->strTable." WHERE pid=?".$strWhere.(strlen($strOrder) ? " ORDER BY ".$strOrder : ""));         
          
          /////////////// für CFS MAPS                        
          // gleiche Abfrage nur ohne LIMIT und auf die ID beschränkt - übergabe an die cfsMaps    
          $myStmt = $this->Database->prepare("SELECT id FROM ".$this->strTable." WHERE pid=?".$strWhere.(strlen($strOrder) ? " ORDER BY ".$strOrder : "")); 
          $myTotal = $myStmt->execute($params);
          
          $myIdData = array();
          while ($myTotal->next())
          {
               array_push($myIdData,$myTotal->id);  
          } 
          // das Array wird global gespeichert und von cfs_maps via Hook ausgelesen
          $GLOBALS['myCatalog']['myMapId'] = $myIdData;
          
          ... 
          
          Der Teil muss somit an der entsprechende Stelle eingefügt werden.

          Ich hoffe ich konnte weiterhelfen.

          Viele Grüße

          EDIT: Den Detaileintrag kann man einfach mit Hilfe des Hakens "Nur aktuellen Eintrag anzeigen" im Kartenprofil anzeigen.
          Zuletzt geändert von Erdpferd; 15.08.2012, 17:42.

          Kommentar

          • Mikki
            Contao-Nutzer
            • 04.05.2010
            • 19

            #6
            Danke für deine prompte Antwort!

            Ich habe zwischenzeitlich und nach langem Stöbern einen alternativen Weg gefunden, ohne cfs_maps:



            Das erschien mir als einfacher, weil man im Prinzip nur ein Template anpassen muss.

            Und falls man auf seiner Karte dann mehrere anhand des Katalog-Suchergebnisses personalisierte Marker will, hilft dieser Link weiter:

            http://stackoverflow.com/questions/3...marker-example

            Kommentar

            • Erdpferd
              Contao-Nutzer
              • 28.01.2011
              • 113

              #7
              Das scheint in der tat einfacher zu sein. Leider war Google-Mpas für meine Variante wegen der Kosten ab 25.000 Aufrufe/Monat keine Alternative.

              Kommentar

              Lädt...