Contao-Camp 2024
Ergebnis 1 bis 22 von 22

Thema: Teaser automatisch erstellen

  1. #1
    Contao-Nutzer
    Registriert seit
    23.10.2017.
    Beiträge
    114

    Standard Teaser automatisch erstellen

    Hallo,

    ich bin auf der Suche nach einer Möglichkeit, von News den Teasertext automatisch zu erstellen, sofern keiner angegeben ist.

    Dabei bin ich schon auf folgenden Eintrag gestoßen:
    PHP-Code:
    <div class="comments">

      <?php foreach ($this->tbody as $class=>$row): ?>
        <div class="<?php echo $class?>">
          <?php foreach ($row as $col): ?>
            <div class="body <?php echo $col['class']; ?>"><?php echo $col['content']; ?>
            <?php if ($this->teaser): ?>
              <p class="teaser"><?php echo $this->teaser?></p>
            <?php else: ?>
              <p class="teaser"><?php echo \String::substr($this->text,50); ?></p>
            <?php endif; ?>
            <?php if ($this->text): ?>
              <p class="more"><?php echo $this->more?></p>
            <?php endif; ?>
            </div>          
          <?php endforeach; ?>
        </div>
      <?php endforeach; ?>
      
    </div>
    Der Beitrag war von 2015, würde es denn trotzdem noch funktionieren? Wo müsste der Code eingefügt werden?

    Gruß

    Tefracky

  2. #2
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Irgendein news-Template, z.B. news_latest oder news_simple. Das bißchen Code an der richtigen Stelle würde reichen, um die ersten 50 Zeichen von Weiterlesen-Text anzuzeigen (wenn es einen gibt). Verwende dabei besser auch die StringUtil-Klasse statt String, sonst bekommst Du Probleme ab PHP 7:
    PHP-Code:
    <?= \StringUtil::substr($this->text,50?>
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  3. #3
    Wandelndes Contao-Lexikon Avatar von tab
    Registriert seit
    22.10.2013.
    Beiträge
    10.075
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Und verwende auch lieber substrHtml, sonst könnte es dir passieren, dass HTML-Fehler entstehen, weil irgendwelche geöffneten Tags nicht geschlossen werden.
    Edit: Nee, kann wohl nicht passieren, da ja die Tags bei substr entfernt werden. Also nur substrHtml, falls du eventuelle Tags in deinen Teaser übernehmen willst.
    Geändert von tab (26.01.2018 um 15:50 Uhr)

  4. #4
    Contao-Nutzer
    Registriert seit
    23.10.2017.
    Beiträge
    114

    Standard

    Vielen Dank für die Antworten! Ich habe die news_latest.html5 angepasst, aber es funktioniert noch nicht so richtig. Hier noch einmal der vollständige Code der news_latest.html5

    PHP-Code:
    <div class="comments">

      <?php foreach ($this->tbody as $class=>$row): ?>
        <div class="<?php echo $class?>">
          <?php foreach ($row as $col): ?>
            <div class="body <?php echo $col['class']; ?>"><?php echo $col['content']; ?>
            <?php if ($this->teaser): ?>
              <p class="teaser"><?php echo $this->teaser?></p>
            <?php else: ?>
              <p class="teaser"><?php echo \StringUtil::substr($this->text,50); ?></p>
            <?php endif; ?>
            <?php if ($this->text): ?>
              <p class="more"><?php echo $this->more?></p>
            <?php endif; ?>
            </div>          
          <?php endforeach; ?>
        </div>
      <?php endforeach; ?>
      
    </div>

    <div class="layout_latest arc_<?= $this->archive->id ?> block<?= $this->class ?>" itemscope itemtype="http://schema.org/Article">

      <?php if ($this->hasMetaFields): ?>
        <p class="info"><time datetime="<?= $this->datetime ?>" itemprop="datePublished"><?= $this->date ?></time> <?= $this->author ?> <?= $this->commentCount ?></p>
      <?php endif; ?>

      <?php if ($this->addImage): ?>
        <?php $this->insert('image'$this->arrData); ?>
      <?php endif; ?>

      <h2 itemprop="name"><?= $this->linkHeadline ?></h2>

      <div class="ce_text block" itemprop="description">
        <?= $this->teaser ?>
      </div>

      <?php if ($this->hasText || $this->hasTeaser): ?>
        <p class="more"><?= $this->more ?></p>
      <?php endif; ?>

    </div>

  5. #5
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    Abgesehen davon, daß das Template ziemlich weit vom Original abweicht (oder hat es sich drastisch geändert in der 4.5?) - warum gibst Du $this->teaser zweimal aus? Und was funktioniert nicht richtig?
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  6. #6
    Contao-Nutzer
    Registriert seit
    23.10.2017.
    Beiträge
    114

    Standard

    Ich habe das Template erst frisch erstellt und die obere Hälfte hinzugefügt. Ich kenne mich leider mit PHP nur schlecht aus, deshalb weiß ich nicht, wo der Fehler ist. "Es passiert nichts" bedeutet, dass kein Teaser erstellt wird.

  7. #7
    Contao-Fan
    Registriert seit
    10.08.2011.
    Ort
    Berlin
    Beiträge
    828

    Standard

    Nimm Dir doch nochmal das Original Template vor und baue dann ein was Du möchtest:
    PHP-Code:
    <div class="layout_latest arc_<?= $this->archive->id ?> block<?= $this->class ?>" itemscope itemtype="http://schema.org/Article">

      <?php if ($this->hasMetaFields): ?>
        <p class="info"><time datetime="<?= $this->datetime ?>" itemprop="datePublished"><?= $this->date ?></time> <?= $this->author ?> <?= $this->commentCount ?></p>
      <?php endif; ?>

      <?php if ($this->addImage): ?>
        <?php $this->insert('image'$this->arrData); ?>
      <?php endif; ?>

      <h2 itemprop="name"><?= $this->linkHeadline ?></h2>

      <div class="ce_text block" itemprop="description">
                <?php if ($this->teaser): ?>
              <?php echo \StringUtil::substrHtml($this->teaser,50); ?>
            <?php else: ?>
              <?php echo \StringUtil::substrHtml($this->text,50); ?>
            <?php endif; ?>
      </div>

      <?php if ($this->hasText || $this->hasTeaser): ?>
        <p class="more"><?= $this->more ?></p>
      <?php endif; ?>
    Das sollte doch klappen oder?

    Es wird im Grunde nur
    PHP-Code:
    <?= $this->teaser ?>
    durch
    PHP-Code:
                     <?php if ($this->teaser): ?>
              <?php echo \StringUtil::substrHtml($this->teaser,50); ?>
            <?php else: ?>
              <?php echo \StringUtil::substrHtml($this->text,50); ?>
            <?php endif; ?>
    ersetzt.
    Geändert von Bennie (29.01.2018 um 15:35 Uhr)

  8. #8
    Contao-Fan Avatar von Nightwing
    Registriert seit
    29.05.2013.
    Beiträge
    436

    Standard

    Zitat Zitat von Bennie Beitrag anzeigen
    Es wird im Grunde nur
    PHP-Code:
    <?= $this->teaser ?>
    durch
    PHP-Code:
    <?php if ($this->teaser): ?>
              <?php echo \StringUtil::substrHtml($this->teaser,50); ?>
            <?php else: ?>
              <?php echo \StringUtil::substrHtml($this->text,50); ?>
            <?php endif; ?>
    ersetzt.
    Hi Bennie, wie füge ich jetzt in gleicher Zeile zu dem aggeschnittenen Text noch ein "..." ein?
    Ich denke, selbigen Code kann man auch beim Template event_teaser benutzen?

    ToM

  9. #9
    Administrator Avatar von xchs
    Registriert seit
    19.06.2009.
    Beiträge
    14.553
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Wenn Du \StringUtil::substr($this->text,50) verwendest, sollte auch eine Ellipse automatisch mit dabei sein.
    Contao Community Administrator

    [Unterstützungsmöglichkeiten]

  10. #10
    Contao-Fan Avatar von Nightwing
    Registriert seit
    29.05.2013.
    Beiträge
    436

    Standard

    Hi xchs,

    leider nein, der Text hört einfach so auf...
    Wenn ich das punkt punkt punkt dranpappe, erscheint es nach einem Zeilenumbruch:

    Im Template:
    HTML-Code:
          <div class="ce_text block" itemprop="description">
            <?php if ($this->teaser): ?>
              <?php echo \StringUtil::substrHtml($this->teaser,70).'&hellip;'; ?>
            <?php else: ?>
              <?php echo \StringUtil::substrHtml($this->text,70).'&hellip;'; ?>
            <?php endif; ?>        
          </div>
    Quellcode:
    HTML-Code:
    <div class="ce_text block" itemprop="description">
    <div class="ce_text block"> <p>Unser traditionelles Osterbiersuchen war wieder einmal ein voller</p></div>&hellip;
    </div>
    Sprich: das &hellip; sollte natürlich innerhalb des divs erscheinen...

    Gegebenheit: kein Teaser, nur Text
    Hast Du mir da eine fixe Idee?

    Bei Contao 2.11.17 hatte ich es so gelöst, aber ich denke, die Funktion ist mittlerweile etwas veraltet?!
    HTML-Code:
          <div class="ce_text block" itemprop="description">
            <? $text= $this->text;
              if (strlen($text) >= 120){
                echo strip_tags(substr($text, 0, strpos($text," ",120)))."[nbsp]&hellip;"; 
              } else {
                echo $text;
              }
            ?>
          </div>
    ToM

    Tante Edith sagt: Mit der bisherigen alten Funktion hatte ich eh ein Problem, wenn ein Link, Bild o.ä. kam, das es den Text früher gecroppt hatte... Von daher bin ich dankbar für eine neue Idee ;-)
    Geändert von Nightwing (03.05.2019 um 23:00 Uhr)

  11. #11
    Administrator Avatar von xchs
    Registriert seit
    19.06.2009.
    Beiträge
    14.553
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Nightwing Beitrag anzeigen
    leider nein, der Text hört einfach so auf...
    Du hast ja auch anstelle von substr() die Methode substrHtml() verwendet (siehe meinen letzten Post).
    Contao Community Administrator

    [Unterstützungsmöglichkeiten]

  12. #12
    Contao-Fan Avatar von Nightwing
    Registriert seit
    29.05.2013.
    Beiträge
    436

    Standard

    *facepalm* Natürlich, das habe ich übersehen... 1000 Dank Dir!

    Die Frage, mit der ich mich nur noch beschäftige: wie mache ich selbiges im Template event_teaser?

    ToM

  13. #13
    Administrator Avatar von xchs
    Registriert seit
    19.06.2009.
    Beiträge
    14.553
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Im Prinzip genau gleich, also anstelle von <?= $this->teaser ?>
    PHP-Code:
    <?php if ($this->teaser): ?> 
      <?= \StringUtil::substr($this->teaser,70); ?> 
    <?php else: ?> 
      <?= \StringUtil::substr($this->details,70); ?> 
    <?php endif; ?>
    Contao Community Administrator

    [Unterstützungsmöglichkeiten]

  14. #14
    Contao-Fan Avatar von Nightwing
    Registriert seit
    29.05.2013.
    Beiträge
    436

    Standard

    Das dachte ich anfangs auch, aber tut nicht. Ob es wohl daran liegt, das ich das Template schon mit dem Accordeon Effekt (Code Template mit Akkordeon) versehen habe?
    Beispiel hier (Version von mir vom Link zuvor): click me softly

    Deine Funktion stört es nicht, wenn ein Bild oder Link im Text erscheint, gefällt mir!

    ToM

  15. #15
    Administrator Avatar von xchs
    Registriert seit
    19.06.2009.
    Beiträge
    14.553
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Könntest Du bitte den aktuellen Code Deines angepassten Templates hier posten?
    Contao Community Administrator

    [Unterstützungsmöglichkeiten]

  16. #16
    Contao-Fan Avatar von Nightwing
    Registriert seit
    29.05.2013.
    Beiträge
    436

    Standard

    Sehr gern, sorry war nur verlinkt:

    event_teaser_accordion:
    HTML-Code:
    <div class="toggler">
      <?php if ($this->header): ?>
        <div class="header<?= $this->classHeader ?>">
          <h2 itemprop="name"><?= $this->title ?></h2>
        <!--  <?php if ($this->firstDay): ?><span class="day"><?= $this->firstDay ?>, </span><?php endif; ?><span class="date"><?= $this->firstDate ?></span>  -->
        </div>
      <?php endif; ?>
    </div>
    <div class="event layout_teaser<?= $this->classList ?>" itemscope itemtype="http://schema.org/Event">
      <div class="accordion">
        <!--    <?php if ($this->hasDetails): ?>
          <h2 itemprop="name"><a href="<?= $this->href ?>" title="<?= $this->title ?> (<?php if ($this->day) echo $this->day . ', '; ?><?= $this->date ?><?php if ($this->time) echo ' ' . $this->time; ?>)"<?= $this->target ?> itemprop="url"><?= $this->link ?></a></h2>
        <?php else: ?>
          <h2 itemprop="name"><?= $this->title ?></h2>
        <?php endif; ?>    -->
        <p class="info"><time datetime="<?= $this->datetime ?>" itemprop="startDate"><?= $this->date ?><?php if ($this->time) echo ' ' . $this->time; ?></time></p>
          <?php if ($this->location): ?>
            <p class="location" itemprop="location" itemscope itemtype="http://schema.org/Place">
              <span itemprop="name"><?= $this->location ?></span>
              <?php if ($this->address): ?>
                (<span itemprop="address" itemscope itemtype="http://schema.org/PostalAddress"><?= $this->address ?></span>)
              <?php endif; ?>
            </p>
          <?php endif; ?>
          <div class="ce_details block" itemprop="description">
            <?php if (!$this->addBefore): ?>
              <?
              $details= $this->details;
              if (strlen($details) >= 120){
                echo strip_tags(substr($details, 0, strpos($details," ",120)))."[nbsp]&hellip;"; 
                } else {
                echo $details;
              }
              ?>    
            <?php endif; ?>
            <?php if ($this->addImage): ?>
              <?php $this->insert('image', $this->arrData); ?>
            <?php endif; ?>
            <?php if ($this->addBefore): ?>
              <?
              $details= $this->details;
              if (strlen($details) >= 120){
                echo strip_tags(substr($details, 0, strpos($details," ",120)))."[nbsp]&hellip;"; 
                } else {
                echo $details;
              }
              ?>    
            <?php endif; ?>
          </div>
        <?php if ($this->hasDetails): ?>
          <p class="more"><a href="<?= $this->href ?>" title="<?= $this->readMore ?>"<?= $this->target ?> itemprop="url"><?= $this->more ?><span class="invisible"> <?= $this->link ?></span></a></p>
        <?php endif; ?>
      </div>
    </div>
    Darin enthalten meine alte Funktion, wie bei den News...

    ToM

  17. #17
    Administrator Avatar von xchs
    Registriert seit
    19.06.2009.
    Beiträge
    14.553
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Nein, ich meinte nicht Dein altes Template, sondern das aktuelle. Du hattest ja oben geschrieben, dass es mit meinem Code "nicht tut". Das hätte ich mir gerne im Template angesehen.
    Contao Community Administrator

    [Unterstützungsmöglichkeiten]

  18. #18
    Contao-Fan Avatar von Nightwing
    Registriert seit
    29.05.2013.
    Beiträge
    436

    Standard

    Ah okay...

    event_teaser_accordion aktuell:
    HTML-Code:
    <div class="toggler">
      <?php if ($this->header): ?>
        <div class="header<?= $this->classHeader ?>">
          <h2 itemprop="name"><?= $this->title ?></h2>
        <!--  <?php if ($this->firstDay): ?><span class="day"><?= $this->firstDay ?>, </span><?php endif; ?><span class="date"><?= $this->firstDate ?></span>  -->
        </div>
      <?php endif; ?>
    </div>
    <div class="event layout_teaser<?= $this->classList ?>" itemscope itemtype="http://schema.org/Event">
      <div class="accordion">
        <!--    <?php if ($this->hasDetails): ?>
          <h2 itemprop="name"><a href="<?= $this->href ?>" title="<?= $this->title ?> (<?php if ($this->day) echo $this->day . ', '; ?><?= $this->date ?><?php if ($this->time) echo ' ' . $this->time; ?>)"<?= $this->target ?> itemprop="url"><?= $this->link ?></a></h2>
        <?php else: ?>
          <h2 itemprop="name"><?= $this->title ?></h2>
        <?php endif; ?>    -->
        <p class="info"><time datetime="<?= $this->datetime ?>" itemprop="startDate"><?= $this->date ?><?php if ($this->time) echo ' ' . $this->time; ?></time></p>
          <?php if ($this->location): ?>
            <p class="location" itemprop="location" itemscope itemtype="http://schema.org/Place">
              <span itemprop="name"><?= $this->location ?></span>
              <?php if ($this->address): ?>
                (<span itemprop="address" itemscope itemtype="http://schema.org/PostalAddress"><?= $this->address ?></span>)
              <?php endif; ?>
            </p>
          <?php endif; ?>
          <div class="ce_details block" itemprop="description">
            <?php if (!$this->addBefore): ?>
              <?php if ($this->teaser): ?>
                <?php echo \StringUtil::substr($this->teaser,70); ?>
              <?php else: ?>
                <?php echo \StringUtil::substr($this->text,70); ?>
              <?php endif; ?>        
            <?php endif; ?>
            <?php if ($this->addImage): ?>
              <?php $this->insert('image', $this->arrData); ?>
            <?php endif; ?>
            <?php if ($this->addBefore): ?>
              <?php if ($this->teaser): ?>
                <?php echo \StringUtil::substr($this->teaser,70); ?>
              <?php else: ?>
                <?php echo \StringUtil::substr($this->text,70); ?>
              <?php endif; ?>        
            <?php endif; ?>
          </div>
        <?php if ($this->hasDetails): ?>
          <p class="more"><a href="<?= $this->href ?>" title="<?= $this->readMore ?>"<?= $this->target ?> itemprop="url"><?= $this->more ?><span class="invisible"> <?= $this->link ?></span></a></p>
        <?php endif; ?>
      </div>
    </div>
    Es erscheint kein Text mehr: klick

    ToM

    PS: Ich denke, das hat was damit zu tun, das es im alten Template mit $details funktioniert?

  19. #19
    Administrator Avatar von xchs
    Registriert seit
    19.06.2009.
    Beiträge
    14.553
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Du hast nicht den Code von mir übernommen. Anstelle von
    PHP-Code:
    <?= \StringUtil::substr($this->details,70); ?>
    hast Du
    PHP-Code:
    <?= \StringUtil::substr($this->text,70); ?>
    verwendet.

    Wobei $this->details aber wahrscheinlich auch nicht ganz das gewünschte Ergebnis liefert.
    Contao Community Administrator

    [Unterstützungsmöglichkeiten]

  20. #20
    Contao-Fan Avatar von Nightwing
    Registriert seit
    29.05.2013.
    Beiträge
    436

    Standard

    Das zweite Mal überlesen... Noch einmal, bekommst n Bier von mir. Ist ja langsam peinlich
    Ja, so tut es, dankeschön!
    Wieso sollte die Variable $details nicht das gewünschte bringen?
    In meinem Fall tut es, wie oben schon: kein Teaser, nur Text.
    Mir persönlich würde das reichen, aber die Frage wäre der Vollständigkeit halber für den Threadersteller.

    ToM

  21. #21
    Administrator Avatar von xchs
    Registriert seit
    19.06.2009.
    Beiträge
    14.553
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Nightwing Beitrag anzeigen
    Wieso sollte die Variable $details nicht das gewünschte bringen?
    Weil $this->details eben alle Eventdetails ausgibt (Überschrift, Eventtext usw.). Für den Teaser möchte man aber vielleicht nur den gekürzten Eventtext ausgeben.

    Aber wenn es in Deinem Fall funktioniert, dann passt es ja.

    Nachtrag: Okay, in Deinem Fall passt es deshalb, weil substr() das alles wegfiltert.
    Contao Community Administrator

    [Unterstützungsmöglichkeiten]

  22. #22
    Contao-Fan Avatar von Nightwing
    Registriert seit
    29.05.2013.
    Beiträge
    436

    Standard

    Danke für die Erklärung und Deine Hilfe, spät nachts
    Angenehme Nachtruhe wünsche ich.

    ToM

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
  •