ContentTeaser.php updatesicher überschreiben

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Arno
    Contao-Fan
    • 11.12.2009
    • 290

    #1

    ContentTeaser.php updatesicher überschreiben

    Ich habe gerade eine kleine Erweiterung für mich gebaut, die es mir ermöglicht im Backend ein Bild inklusive Alternativtext für einen Teaser einzubauen. Funktioniert auch alles wunderbar.
    Um die Ausgabe im Frontend zu steuern, musste ich allerdings die Datei 'ContentTeaser.php' im Verzeichnis 'system/modules/frontend/' ändern.
    Nun bin ich mir nicht sicher, bzw. ich bin sogar ziemlich sicher, dass das nicht updatesicher ist. Kann ich irgendwie eine alternative 'ContentTeaser.php' in meine Erweiterung integrieren, die dann die Standardversion im Frontend-Modul überschreibt?

    Lieben Dank.
  • christian.barkowsky
    Contao-Fan
    • 22.06.2009
    • 388

    #2
    hallo,

    genau sowas habe ich auch schon gebaut. leider ist es nicht update sicher.
    am besten wäre an der stelle ein neuer hook für die teaser.
    Gruß

    Christian
    Plenta.io - Digitale Lösungen. // Contao Premium-Partner

    Kommentar

    • Arno
      Contao-Fan
      • 11.12.2009
      • 290

      #3
      Danke für die schnelle Antwort.

      Ok, ich bin ziemlich am Anfang mit Typolight und habe jetzt die Sache mit den Hooks in der Anleitung gelesen. Die generelle Funktionalität hat sich mir erschlossen, aber zum laufen habe ich das nicht bekommen.
      Ich habe mir die Liste der zur Verfügung stehenden Hooks angesehen und gedacht, dass ich entweder mit 'outputFrontendTemplate' oder 'parseFrontendTemplate' was werden sollte. Ich habe die Vorgaben entsprechend angepasst.

      'config.php' im Verzeichnis 'config' meiner Erweiterung:
      PHP-Code:
      <?php $GLOBALS['TL_HOOKS']['parseFrontendTemplate'][] = array('ContentTeaser', 'parseFrontendTemplate');
      ?>
      'ContentTeaser.php' im root meiner Erweiterung:
      PHP-Code:
      <?php
      
      public function parseFrontendTemplate($strContent, $strTemplate)
      {
          if ($strTemplate == 'ContentTeaser')
          {
              class ContentTeaser extends ContentElement
      {
      
          /**
           * Template
           * @var string
           */
          protected $strTemplate = 'ce_teaser';
      
      
          /**
           * Generate content element
           */
          protected function compile()
          {
              $objArticle = $this->Database->prepare("SELECT p.id AS id, p.alias AS alias, a.id AS aid, a.title AS title, a.alias AS aalias, a.teaser AS teaser, a.teaser_image AS teaser_image, a.teaser_image_alt AS teaser_image_alt, a.inColumn AS inColumn FROM tl_article a, tl_page p WHERE a.id=? AND a.pid=p.id")
                                           ->limit(1)
                                           ->execute($this->article);
      
              if ($objArticle->numRows < 1)
              {
                  return;
              }
      
              $link = '/articles/';
      
              if ($objArticle->inColumn != 'main')
              {
                  $link .= $objArticle->inColumn . ':';
              }
      
              $link .= (strlen($objArticle->aalias) && !$GLOBALS['TL_CONFIG']['disableAlias']) ? $objArticle->aalias : $objArticle->aid;
              $this->Template->href = $this->generateFrontendUrl($objArticle->row(), $link);
      
              $this->Template->headline = $objArticle->title;
              $this->Template->text = $objArticle->teaser;
              $this->Template->image = $objArticle->teaser_image;
              $this->Template->image_alt = $objArticle->teaser_image_alt;
              $this->Template->more = $GLOBALS['TL_LANG']['MSC']['more'];
          }
      }
      
          }
      
          return $strContent;
      }
      
      ?>
      Das Resultat ist ein weißer Bildschirm. Irgendwelche Ideen?

      Kommentar

      • lindesbs
        AG CMS-Garden
        Contao-Urgestein
        • 05.06.2009
        • 4157

        #4
        System->Einstellungen->Fehlermeldungen einschalten !


        Ich weiss auch nicht, ob man innerhalb der Classenfunktion eine neue Klasse erzeugen kann. Leg die sicherer ausserhalb deiner Funktion.

        PHP-Code:
        array('ContentTeaser', 'parseFrontendTemplate'); 
        
        Es wird er Hook parseFrontendTemplate in der Klasse ContentTeaser aufgerufen. Das geht so nicht.

        Mach ein eigenes Modul, wo du statt ContentTeaser ein ContentTeaserEnheanced z.b. erstellt mit deiner Klassendefinition.
        von Willi Voltz aus PR 500: Henry George sagte einmal: »Kultur ist Zusammenarbeit.«


        Contao-Hosting: begeisterter Uberspace-Nutzer

        Kommentar

        • Arno
          Contao-Fan
          • 11.12.2009
          • 290

          #5
          Ich habs jetzt so hinbekommen:
          In die 'config.php' in meinem Modulverzeichnis habe ich einfach folgenden Code geschrieben:

          PHP-Code:
          <?php
              $GLOBALS['TL_CTE']['includes']['teaser'] = 'ContentTeaser';
              
              class ContentTeaser extends ContentElement
              {
              
                  /**
                   * Template
                   * @var string
                   */
                  protected $strTemplate = 'ce_teaser';
              
              
                  /**
                   * Generate content element
                   */
                  protected function compile()
                  {
                      $objArticle = $this->Database->prepare("SELECT p.id AS id, p.alias AS alias, a.id AS aid, a.title AS title, a.alias AS aalias, a.teaser AS teaser, a.teaser_image AS teaser_image, a.teaser_image_alt AS teaser_image_alt, a.inColumn AS inColumn FROM tl_article a, tl_page p WHERE a.id=? AND a.pid=p.id")
                                                   ->limit(1)
                                                   ->execute($this->article);
              
                      if ($objArticle->numRows < 1)
                      {
                          return;
                      }
              
                      $link = '/articles/';
              
                      if ($objArticle->inColumn != 'main')
                      {
                          $link .= $objArticle->inColumn . ':';
                      }
              
                      $link .= (strlen($objArticle->aalias) && !$GLOBALS['TL_CONFIG']['disableAlias']) ? $objArticle->aalias : $objArticle->aid;
                      $this->Template->href = $this->generateFrontendUrl($objArticle->row(), $link);
              
                      $this->Template->headline = $objArticle->title;
                      $this->Template->text = $objArticle->teaser;
                      $this->Template->image = $objArticle->teaser_image;
                      $this->Template->image_alt = $objArticle->teaser_image_alt;
                      $this->Template->more = $GLOBALS['TL_LANG']['MSC']['more'];
                  }
              }
          
          ?>
          Damit wird der Aufruf aus der 'config.php' des Frontend-Moduls überschrieben und die Ausgabe funktioniert wie gewünscht. Und updatesicher sollte es auch sein, da die config.php ja in meinem Modulverzeichnis liegt.
          Oder habe ich mich da zu früh gefreut und mir jetzt die Katze im Sack eingehandelt?

          Kommentar

          • Christoph
            Gesperrt
            • 08.04.2010
            • 3

            #6
            Stehe gerade vor dem gleichen Problem wie du und muss leider feststellen, dass deine Lösung bei mir nicht funktioniert... sehr schade.

            Hat jemand vielleicht eine Idee?
            Die config.php wo die Klasse drin ist wird auf jeden Fall ausgeführt, dort passieren auch noch andere Dinge.

            Bin sonst nur auf das gestoßen:

            Das ist ja genau das was ich brauche, wurde leider fest für den psishop eingebaut... warum?

            edit:
            Der "getContentElements"-Hook scheint ohne Funktion zu sein :-(
            Zuletzt geändert von Christoph; 08.04.2010, 15:18.

            Kommentar

            • deerwood
              Contao-Fan
              • 24.11.2009
              • 344

              #7
              Hallo Cristoph, Arno, alle,

              Zitat von Christoph Beitrag anzeigen
              Stehe gerade vor dem gleichen Problem wie du und muss leider feststellen, dass deine Lösung bei mir nicht funktioniert... sehr schade.
              Warum funktioniert das denn nicht (Fehlermeldungen anmachen)? Ich weise auch darauf hin, dass der Code von Arno nicht alles sein kann, denn er greift ja in seinem SELECT auf die Felder tl_article.teaser_image und tl_article.teaser_image_alt zu, die es von Hause aus nicht in tl_article gibt. Arno hat uns also mindestens sein config/database.sql nicht gezeigt, aber vermutlich auch noch den Code für die Backend-Erweiterung vorenthalten, um diese Felder durch Redakteure befüllen zu können.

              Zitat von Christoph Beitrag anzeigen
              Bin sonst nur auf das gestoßen:

              Das ist ja genau das was ich brauche, wurde leider fest für den psishop eingebaut... warum?

              edit:
              Der "getContentElements"-Hook scheint ohne Funktion zu sein :-(
              Warum der HOOK psishop spezifisch ist und nicht allgemeingültig ("getContentElements" hätte er gehiessen, aber es gibt ihn nicht) kann ich Dir auch nicht sagen, Leo hat im Ticket ja nur gesagt "nach reiflicher Überlegung".

              Nun scheint der psishop (bzw. hier) ja nach mehr als 1 Jahr immer noch alpha zu sein. Falls Du ihn also nicht einsetzt, könntest Du Dir für Deinen Eigengebrauch ein Dummy-psishop-Modul bauen, das nur die statische Methode Psishop::getProductlisting(ModuleArticle $x) implementiert. In dieser Methode bringst Du den Code aus dem Ticket unter, der den HOOK "getContentElements" aufruft. Dein eigenes Modul kann sich dann in den HOOK reinhängen.

              Du darfst aber dies Dummy-Modul (das ja in system/modules/psishop/* sein muss) NICHT ins ER stellen, jedenfalls nicht unter dem Namen "psishop", das wäre fies und unfair dem psishop Autor gegenüber und würde sogleich wieder rausfliegen.

              LG, Georg

              Kommentar

              • christian.barkowsky
                Contao-Fan
                • 22.06.2009
                • 388

                #8
                http://https://contao.org/issues/889 ... tja ... leider hab ich das aus den augen verloren ... hänge mich mal wieder rein ;-)
                Gruß

                Christian
                Plenta.io - Digitale Lösungen. // Contao Premium-Partner

                Kommentar

                • Christoph
                  Gesperrt
                  • 08.04.2010
                  • 3

                  #9
                  @deerwood:
                  Mit funktioniert nicht meinte ich es wird nicht ausgeführt, keinerlei Fehlermeldungen sonst, es wird einfach nur die original Teaser Klasse genommen.
                  Dass die Sachen die Arno da erweitert hat bei mir nicht greifen ist mir schon klar ;-)

                  Einen Psishop Dummy zu bauen hatte ich auch schon überlegt, aber so richtig schön ist das auch nicht... wahrscheinlich mache ich es aber so. Danke!

                  @christian.barkowsky:
                  Du könntest dort auch einfach leos eigenen Code vorschlagen ;-)


                  -- Update:
                  Wenn man teaser only an hat dann kommt der garnicht bis zu der Psishop-hook-Stelle :-(
                  Das gilt aber auch nur wenn man nicht das Inhaltselement Teaser ändern will sondern den Teaser wenn mehrere Artikel auf einer Seite sind, ich bin also eigentlich falsch in dem thema ;-)
                  Ich müsste die ModuleArticle.php überschreiben :-(
                  Zuletzt geändert von Christoph; 09.04.2010, 12:07.

                  Kommentar

                  • SunBlack
                    Contao-Fan
                    • 19.06.2009
                    • 385

                    #10
                    Warum nutzt ihr nicht die eingebaute Variante, die es seit TL 2.8 gibt? Man muss lediglich im Teaser-Template die Bildausgabe einbauen (standardmäßig nicht im Teaser enthalten, also bei den vollständigen Artikeln/News/...)

                    Kommentar

                    • deerwood
                      Contao-Fan
                      • 24.11.2009
                      • 344

                      #11
                      Hi Christoph,

                      Einen Psishop Dummy zu bauen hatte ich auch schon überlegt, aber so richtig schön ist das auch nicht... wahrscheinlich mache ich es aber so.
                      Machs nicht. Der Hook ist in 2.8.2 rausgeflogen, siehe Ticket 1770.

                      LG, Georg

                      Kommentar

                      Lädt...