Ankündigung

Einklappen
Keine Ankündigung bisher.

Eigenes CustomURL Modul zur anzeige der Subkategorien der Artikel

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Eigenes CustomURL Modul zur anzeige der Subkategorien der Artikel

    Hallo!

    Ich hätte eine Frage, und zwar bin ich aktuell dabei ein Modul zu schreiben, das es mir ermöglicht, im URL-Pfad die Subkategorie des bestimmten artikels anzuzeigen anstelle des Page Alias / der Page-ID

    Beispiel:
    Vorher: www.beispiel.de/de/produkt-54/alias.html
    Nachher: www.beispiel.de/de/subkategorie1/alias.html

    Hier mal die CustomURLs.php die ich dafür geschrieben habe:

    PHP-Code:
    <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');

    class 
    CustomURLs extends Frontend
    {
      
    /**
       * @var Database;
      */
      
    protected $Database;
      
    /**
       * @param array $arrRow
       * @param string $strParams
       * @param string $strUrl
       * @return string
       */
      
    public function hookGenerateFrontendUrl($arrRow$strParams$strUrl)
      {

        if (
    preg_match('/produkt-([^/]+).([^/]+).html'$arrFragments[0], $arrMatch))
        {
          switch(
    $arrMatch[1]){
            case 
    76:
            
    $dbname "db1";
            break;
            case 
    74:
            
    $dbname "db2";
            break;
          }
          
    $this->import('Database');
          
    // Datenbankaufruf : ID - Unterkategorie
          // Den id aus der db laden für die subkategorie
          
    $objCategory $this->Database
          
    ->prepare("SELECT tl_pct_customelement_tags.id FROM tl_pct_customelement_tags
            LEFT JOIN 
    $dbname
            ON 
    $dbname.id = tl_pct_customelement_tags.id
            WHERE 
    $dbname.produktalias=?")
          ->
    execute($arrMatch[2]);
          if (
    $objCategory->next())
          {
            switch(
    $objCategory){
              case 
    3:
              
    $subkategorie "unterkategorie-1";
              break;
              case 
    4:
              
    $subkategorie "unterkategorie-2";
              break;
              case 
    5:
              
    $subkategorie "unterkategorie-3";
              break;
              case 
    6:
              
    $subkategorie "unterkategorie-4";
              break;
            }
              
    // Die URL umschreiben
            
    $strUrl str_replace('produkt-'.$arrMatch[1].'/'$subkategorie'/'$strUrl);
          }
          return 
    $strUrl;
        }

      }
      
    /**
       * @param array $arrFragments
       * @return array
       */
      
    public function hookGetPageIdFromUrl($arrFragments)
      {
        if (   
    $GLOBALS['objPage']->id == 76 || $GLOBALS['objPage']->id == 74 && preg_match('([^/]+).([^/]+).html'$arrFragments[0], $arrMatch))// Page IDs = aufrufpages der produkte
        
    {
          switch(
    $arrMatch[1]){
            case  
    "unterkategorie-1":
            
    $pageid 74;
            break;
            case  
    "unterkategorie-2":
            
    $pageid 74;
            break;
            case 
    "unterkategorie-3":
            
    $pageid 76;
            break;
            case 
    "unterkategorie-4":
            
    $pageid 76;
            break;
          }
          
    $tmp explode('.'$this->replaceInsertTags("{{link_url::".$pageid."}}"));
          
    $link $tmp[0];
          
    $arrFragments[0] = $link;
          
    $arrFragments[1] = 'items';
          
    $arrFragments[2] = $matches[2];
          
        }
        return 
    array_unique($arrFragments);
      }
    }
    Und hier noch die Configs.php:

    PHP-Code:
    <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
     
    /**
     * Hooks
     */
    $GLOBALS['TL_HOOKS']['generateFrontendUrl'][] = array('CustomURLs''hookGenerateFrontendUrl');
    $GLOBALS['TL_HOOKS']['getPageIdFromUrl'][]    = array('CustomURLs''hookGetPageIdFromUrl');

    Ist das überhaupt so möglich mit den Customcatalog Artikeln?
    Wenn ja, was mache ich falsch?

    danke schonmal für die Antworten.

    Schöne Grüße

    Chris

  • #2
    Viel zu aufwendig, denke ich.
    Die Subkategorie ist ein Feld im Eintrag, richtig? Daher braucht's kein preg_matching für die url Fragmente, sondern du saugst dir direkt die jeweilige Subkategorie aus dem aktuellen Eintrag und vergleichst (Referenz-Array erstellen) mit der Seiten-ID. -> damit braucht's kein preg_matching der Url.


    PHP-Code:
    $strLanguage $GLOBALS['TL_LANGUAGE']; // nur nötig für Mehrsprachigkeit hier

    $objCC = \CustomCatalog::findByTableName('myTable');

    // aktueller Detaileintrag
    $objEntry $objCC->findPublishedItemByIdOrAlias(\Input::get($GLOBALS['PCT_CUSTOMCATALOG']['urlItemsParameter']),$strLanguage);
    echo 
    $objEntry->id;

    // detail-url
    $intJumpTo 10// weiterleitungsseiten-id
    $strDetailsHref $objCC->generateDetailsUrl($objEntry,$intJumpTo); 

    Beschreib mal in einfachen Worten was genau du vorhast. So richtig ergibt sich mir das nicht.

    Was Contao allgemein nicht kann, unabhängig von CC oder anderen Modulen, ist Psydo-Seiten erstellen. Der auto_items Parameter radiert den GET-Parameter aus, ok. Dieser wird intern zwischengespeichert. Was aber nicht geht ist eine reale Seite vorgauckeln. Sprich: Existiert im System keine Seite mit dem alias "subkategorie1" und dies ist kein GET-Parameter, wird Contao mit 404 quittieren. Da hilft auch kein htaccess und mod_rewriting.
    => aus diesem Grund ist es nicht möglich per url-rewriting Detaileinträge ohne Alias der Detailseite zu generieren, ausser der Leser liegt auf der Startseite.

    Anders wäre es wenn subkateogrie1 ein Filter-Url-Fragment wäre, dann fehle nur der Filterwert. Beispiel:

    ...de/de?subkategorie1=WERT&items=ALIAS

    ordnerähnlich:
    ...de/de/subkategorie1/WERT/ALIAS.html

    (dies ist aber nicht der Fall)
    http://www.premium-contao-themes.com

    Kommentar


    • #3
      Danke für die Antworte schonmal! Das hilft schonmal weiter.

      Das Preg_matching hab ich aus dem Beispiel der Contaowiki genommen, da ich selbst noch nicht sonderlich viel Erfahrung mit Contao insgesamt hatte bisher.

      Das Problem das ich lösen muss ist etwas schwer zu erklären, ich versuche es mal so einfach wie möglich zu erklären:

      Ich habe hier mehrere Tabellen, in denen Artikel eingepspeichert sind. Jede Tabelle ist eine Hauptkategorie der Artikel, in der sich die dazugehörigen Artikel sammeln.

      Tabelle 1 = Hauptkategorie 1
      Tabelle 2 = Hauptkategorie 2
      ...

      Jede Hauptkategorie hat in der Seitenstruktur eine eigene Seite, in welcher mithilfe des Alias der Artikel zur Anzeige ausgelesen wird. Die URL der Seiten sieht also wie folgt aus

      platzhalter.de/produkt_hauptkategorie1/artikelalias.html

      Jeder Artikel hat desweiteren noch eine Unterkategorie zugewiesen, welche das ganze weiter unterteilt. Das Ziel ist es, das im URL nicht die Hauptkategorie angezeigt wird sondern die jeweilige Unterkategorie des aufgerufenen Artikels.

      platzhalter.de/unterkategorie1/artikelalias.html
      platzhalter.de/unterkategorie2/artikelalias.html

      Dies soll für alle Seiten zur Anzeige der Unterkategorie eingeführt werden.

      Meine Überlegung war es, mit einen CustomURL Modul zu überprüfen, ob eine der Artikelseiten aufgerufen wurde. Ist dies der Fall soll die für die Seite richtige Datenbank ausgewählt werden und die ID für die Subkategorie ausgelesen werden, um mit dieser dann die entsprechende URL generieren zu können, die für den Artikel zutreffend ist.

      Nachdem ich nun aber deine Antwort gelesen habe, denke ich, das dies garnicht möglich ist. Das würde erklären warum bei meinen ersten tests das Modul mich immer zur Startseite geführt hatte.

      Kommentar


      • #4
        platzhalter.de/unterkategorie1/artikelalias.html
        platzhalter.de/unterkategorie2/artikelalias.html

        Genau das geht nicht, ausser mit realen versteckten Seiten.
        Wenn Du das nicht all zu dynamisch brauchst, arbeite mit dynamischen Weiterleitungen im Template. Lege die versteckten Seiten in der Seitenstruktur an, merke dir die Ids und leite im Template, je nach gesetzter Kategorie einfach auf die jeweilige Seite.

        Hier habe ich ein kleines Template als Vorlage mit Weiterleitungs-Urls je Sprache. Das ist genau der Ansatz:

        http://forum.premium-contao-themes.c...ink-je-sprache

        --
        So würde ich es bauen: Das ganze geht, denke ich, out of the box.

        Hast du das mal einfach mit der Seitenstruktur gebaut? Also deine Kategorien einfach per Seitenstruktur. Damit schlägst du alle Fliegen tot.

        Attribut: Seitenauswahl
        Filter: Seitenauswahl (setze die Einstellungen wie du es brauchst)

        Neues Seitenlayout mit Liste und Leser in der Hauptspalte.

        Im Liste Modul, keine Weiterleitungsseite angeben (damit wird CC die aktuelle Seite nutzen) und das Filterset mit dem Seitenauswahl Filter reinhängen nicht vergessen.

        Jetzt baust du deine Seitenstruktur nach deinen Verschachtelungen auf und gibst der Wurzelseite das Seitenlayout.

        Jetzt baut sich die Liste entsprechend gefiltert auf allen Seiten auf.
        Bei Klick auf Weiterlesen, bist du automatisch in der Kategorie / aktuellen Seite.
        -> das entspräche deinem Url-Wunsch

        ps. Die Liste ausblenden, wenn der Leser aktiv ist geht direkt im Liste Template:

        if(\Input::get($GLOBALS['PCT_CUSTOMCATALOG']['urlItemsParameter']))
        {
        return '';
        }
        Zuletzt geändert von Tim; 08.06.2016, 09:16.
        http://www.premium-contao-themes.com

        Kommentar


        • #5
          Das klingt doch nach genau dem was ich gesucht habe

          Also, ich hab leider mit Contao selbst noch wenig erfahrung, darum frag ich nochmal um alles zu verstehen.

          Aktuell gibt es diese Seitenstruktur schon im sinne von:

          Seite: Hauptkategorie
          Unterseite Subkategorie1
          Unterseite Subkategorie2
          Unterseite Subkategorie3
          Unterseite Produktseite

          Auf den Seiten selbst wird die Liste der dazugehörigen Artikel anzeigt, Desweiteren eine Filterfunktion für die Artikel.

          Wenn ich die Weiterleitungsseite rausnehme und der Seite das Seitenlayout zuweise. sieht es wie folgt aus:

          beispiel.de/hauptkategorie.html ruft die liste und Filterfunktion auf.

          die Links leiten auf

          beispiel.de/hauptkategorie/alias.html weiter.

          Aktuell sieht es dann so aus, das die Liste und Filterfunktion immer noch angezeigt wird, am ende aber die Anzeige des Artikels zu sehen ist.

          Jetzt muss ich also den zugehörigen Templates nurnoch dieses IF geben, damit sie ausgeblendet werden, sobald ein Artikel mit alias aufgerufen wird?





          Kommentar


          • #6
            Jetzt muss ich also den zugehörigen Templates nurnoch dieses IF geben, damit sie ausgeblendet werden, sobald ein Artikel mit alias aufgerufen wird?
            Ganz genau. Nur dem Liste Template, ganz oben: Du willst die Liste nicht auf der Detailseite.

            PHP-Code:
            if(\Input::get($GLOBALS['PCT_CUSTOMCATALOG']['urlItemsParameter']))
            {
            return 
            '';

            http://www.premium-contao-themes.com

            Kommentar


            • #7
              Es funktioniert fast genau so, wie ich es möchte

              Das einzige Problem das ich noch habe ist, das Beim aufruf eines Artikels nun die Filterfunktion in der linken spalte bleibt, die muss dann eigentlich weg.
              Desweiteren soll eine Rechte Spalte auftauchen in der ein Modul eingebunden ist, welches die Ansprechpartner anzeigt für den Artikel.

              Wie sorge ich dafür, das er, jenachdem ob es ein Artikelaufruf oder die Listenansicht ist, er die dementsprechenden Module ladet?

              Kommentar


              • #8
                Wie sorge ich dafür, das er, jenachdem ob es ein Artikelaufruf oder die Listenansicht ist, er die dementsprechenden Module ladet?
                Das wird nicht leicht. Es sollte über den getPageLayout Hook gehen, indem Du einfach ein anderes Seitenlayout in diesem Moment übergibst.
                https://docs.contao.org/books/api/ex...ageLayout.html

                Sonst fällt nur quasi nur ausblenden via CSS ein oder tricksen mit Inserttags.
                http://www.premium-contao-themes.com

                Kommentar


                • #9
                  So, entschulde die späte antwort

                  Im prinzip läuft bis auf das Template wechseln alles. Nur verstehe ich das getPageLayout Hook nicht ganz, wie genau übergebe ich dort denn das Template? wohin muss ich es übergeben?

                  Kommentar


                  • #10
                    Den Hook musst du einfach testen und schauen wie der funzt. Der ist neu seit 3.1 und ich selbst habe ihn noch nicht verwendet. Such im Contao Core den Hook raus und schaue was der macht.
                    Sonst fallen mir nur noch meine oben genannten Alternativen ein.
                    http://www.premium-contao-themes.com

                    Kommentar


                    • #11
                      Fast geschafft, eine letzte Sache noch dann sollte alles passen.
                      Wie genau überprüfe ich in einen Modul ob ein Alias mitgegeben wurde?
                      \Input::get($GLOBALS['PCT_CUSTOMCATALOG']['urlItemsParameter'])
                      Das hier scheint ja im Modul scheinbar nicht zu funktionieren, so wie es im Template funktioniert

                      Kommentar


                      • #12
                        Zitat von Chris Beitrag anzeigen
                        Fast geschafft, eine letzte Sache noch dann sollte alles passen.
                        Wie genau überprüfe ich in einen Modul ob ein Alias mitgegeben wurde?
                        \Input::get($GLOBALS['PCT_CUSTOMCATALOG']['urlItemsParameter'])
                        Das hier scheint ja im Modul scheinbar nicht zu funktionieren, so wie es im Template funktioniert
                        Überall wo du direkt in den Code eingreifen kannst, geht das.
                        http://www.premium-contao-themes.com

                        Kommentar


                        • #13
                          Im Template funktioniert \Input::get($GLOBALS['PCT_CUSTOMCATALOG']['urlItemsParameter']) einwandfrei, wenn ich aber genau die gleiche if abfrage im Modul einbinde, gibt er mir nichts aus

                          Ich hab testweise mal $GLOBALS['test'] =\Input::get($GLOBALS['PCT_CUSTOMCATALOG']['urlItemsParameter']); gemacht, um zu sehen, was aus heraus kommt, im Template gibt er mir dann als ausgabe dafür ein 0 aus.

                          Kommentar


                          • #14
                            Naja, du musst schon Ladereihenfolgen beachten. Läd dein Modul vor pct_customelements_pct_customcatalog (ohne autoload.ini, entspricht es dem Ordnernamen), existiert die Variable nicht mal! autoload.ini !

                            CC nutzt standardmäßig "items" als GET Parameter.
                            http://www.premium-contao-themes.com

                            Kommentar


                            • #15
                              Da liegt das Problem, ich hab noch nicht mit der Autoload ini so gearbeitet.

                              Autoload.ini
                              PHP-Code:
                              ;;
                              ; List 
                              modules which are required to be loaded beforehand
                              ;;
                              requires[] = "core"
                              requires[] = "pct_customelements_plugin_customcatalog"
                              ;;
                              Configure what you want the autoload creator to register
                              ;;
                              register_namespaces true
                              register_classes    
                              true
                              register_templates  
                              true

                              ;;
                              Override the default configuration for certain sub directories
                              ;;
                              [
                              vendor/*]
                              register_namespaces = false
                              register_classes    = false
                              register_templates  = false 
                              Ist das so richtig oder fehlt mir noch was? Denn selbst so gibt er mir mit deim Input::get nichts aus :/

                              Kommentar

                              Lädt...
                              X