Kurzform von Blog Beiträgen

ezPublish hat standardmäßig eine Contentklasse für Blogbeiträge. Die Blogbeiträge bestehen nur aus der Überschrift und dem eigentlichen Freitext (neben einigen Metadaten). Eine Kurzfassung des Beitrag, z.B. zum Anteasern in Übersichten, ist nicht vorgesehen. Diese ist aber mit etwas CSS leicht erstellt.

Als mögliche Lösungen stehen mehrere Wege zur Auswahl. Zum einen kann man das Template für den Ansicht "line" überschreiben:

{* Blog post - Line view *}
<div class="content-view-line">
  <div class="class-blog-post float-break">

    <div class="attribute-header">
        <h1><a href={$node.url_alias|ezurl}>{$node.data_map.title.content|wash}</a></h1>
    </div>

    <div class="attribute-byline">
        <p class="date">{$node.data_map.publication_date.content.timestamp|l10n(
shortdatetime)}</p>
        <p class="author">{$node.object.owner.name|wash}</p>
    </div>

    <div class="attribute-body float-break">
      {foreach $node.data_map.body.data_text
          |explode('&amp;nbsp;')|implode(' ')
          |explode('<paragraph') as $p
         offset 1}
       {let $text = ""}
        {foreach $p|explode('<') as $p1}
         {set $text = $text|concat($p1|explode('>').1)}
        {/foreach}
        {if $text|count_words|gt(1)}
         {$text|trim(' [.]')|simplify()|shorten(160)
               |explode(' ')|reverse|remove(0,1)|reverse|implode(' ')
               |concat('&nbsp;<a href=',$node.url_alias|ezurl,'>&hellip;</a>')}
         {break}
        {/if}
       {/let}
      {/foreach}
    </div>

  </div>
</div>

Der Trick besteht darin, das XML direkt zu parsen. Zuerst zerlegt man den Text anhand der Absatzeinleitungen "<paragraph", und schneidet sich den Text durch geschicktes Aneinanderreihen jeweils bis zu den der Tagzeichen '<' und '>' zusammen.

Nach jedem Absatz kürzt man auf 160 Zeichen und geht bis zur nächsten Wortstelle (rückwärts nach einem Leerzeichen suchen) zurück. Dann noch der "weiter" Link dran und fertig.

Diese Variante hat den Vorteil, daß die Webseite gleich richtig erstellt und damit browserunabhängig korrekt dargestellt wird. Da der Textanschnitt eine feste Länge hat, ist er praktisch überall konsistent einsetzbar. Nachteilig ist, daß der Abschnitt ohne Rücksicht auf die inhaltlichen Aussagen stattfindet.

Anderseits kann man das ganze auch in CSS allein lösen:

.content-view-line .class-blog-post .attribute-body > * {
  display: none;
}
.content-view-line .class-blog-post .attribute-body > *:first-child {
  display: block;
}

Man blendet also alle Kindelemente des Textkörpers aus und nur das erste Element wieder ein. Typischerweise ist das der erste Absatz. Für Suchmaschinen und nicht CSS verarbeitende Browser erscheint dagegen der volle Text.

Ein dritter Ansatz besteht darin, eine anderen XML Renderer zu schreiben, oder die Templates, die der vorhandene Renderer verwendet, zu überschreiben. So könnte man in "datatype/view/ezxmltags/paragraph.tpl" einen mitlaufenden Ansatzzähler auswerten. Aber dies scheint mir aktuell zu kompliziert.

Post a comment

Related content