Extbase / Fluid: ViewHelper für tt_content Elemente mit Namespaces

Hier mal wieder ein hilfreiches Snippet bzw. ein Extbase / Fluid Viewhelper für Zwischendurch. Es handelt sich dabei um einen ViewHelper zur Ausgabe von tt_content Datensätzen innerhalb eines Fluid Templates.

Die Viewhelper an sich ist keine neue Erfindung und wenn ich mich recht entsinne, basiert er auf dem ViewHelper von Motions-Media. Allerdings ist der ViewHelper dort noch ohne die wunderschönen Namespaces, wie sie in Extension ab TYPO3 Version 6.x nunmal empfohlen bzw. vorgeschrieben sind.

Daher hier nun die aktualisierte Variante mit Namespaces:

Der ViewHelper an sich einzufügen zum Beispiel unter typo3conf/ext/ExtensionXY/Classes/ViewHelpers/ContentViewHelper.php

<?php
namespace TYPO3\ExtensionXY\ViewHelpers;

/**
 * ViewHelper zur Rückgabe eines geparsten tt_content Elementes
 */

class ContentViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
{
    /**
     * Parse content element
     *
     * @param    int           UID des Content Element
     * @return   string        Geparstes Content Element
     */
    public function render($uid)
    {
        $conf = array( // config
            'tables' => 'tt_content',
            'source' => $uid,
            'dontCheckPid' => 1
        );
        return $this->objectManager->get('TYPO3\CMS\Frontend\ContentObject\RecordsContentObject')->render($conf);
    }
}

?>

Und so lässt sich dann im Fluid Template auf den ViewHelper zugreifen:

  1. Im Kopfbereich des Templates den ViewHelper initialisieren mit
    {namespace m=TYPO3\ExtensionXY\ViewHelpers}
  2. Danach kann mit
    <m:Content uid="{inhalt.uid}" />

    Die UID eines tt_content Datensatzes übergeben werden, der ausgegeben werden soll.

Unbedingt daran denken Pfade und Namespaces anzupassen bei euch 😉

12 Kommentare

  • Nettes Beispiel. Die »injectConfigurationManager«-Funktion kann man sich mittlerweile aber sparen. Einfach die »@inject«-Annotation verwenden 🙂

  • >Und so lässt sich dann im Fluid Template auf den ViewHelper zugreifen:
    > Im Kopfbereich des Templates den ViewHelper initialisieren mit
    > {namespace m=TYPO3\ExtensionXY\ViewHelpers}
    > Danach kann mit
    >
    > Die UID eines tt_content Datensatzes übergeben werden, der ausgegeben werden soll.

    AAHA!
    Aber wo, in welchem Pfad, in welcher Datei kommet das hinein?
    extBuilder kann tt_content ja nicht, es muß alles per Hand passieren, aber wo?

  • Einfach nur krank

  • Typo3 7.6 – Funktioniert nicht!

    return $this->cObj->RECORDS($conf); > keine Ausgabe!

    return „TEST“; > Ausgabe „TEST“

  • Hallo Hans,
    probier mal das return $this->cObj… etc. durch folgende Zeile zu ersetzen:

    return $this->objectManager->get('TYPO3\CMS\Frontend\ContentObject\RecordsContentObject')->render($conf);
    
    • Danke für die schnelle Antwort 🙂 Aber leider funktioniert das auch nicht 🙁
      Eigentlich will ich nur in „form“ das „data“ Array wie im „fluid_styled_content“ vorhanden haben.
      Also, wenn data Array nicht vorhanden, dann Viewhelper aufrufen und das aktuelle tt_content Element zurück geben. Das kann doch nicht so schwer sein?

      Brauche für das die Daten.

  • Nachtrag …
    ##f:layout name=“HeaderContentFooter“ /##

    • Hallo Hans,
      bist Du sicher, dass Du dem ViewHelper eine korrekte UID übergibst? Zeig mal dein Fluid Aufruf dazu.

      • #xm:Content uid=“25″ /#

        Auch zum Test als Zahl geschrieben: ’source‘ => 25,

        Das Array erhalte ich mit diesem Aufruf: $this->templateVariableContainer->add(‚xmData‘, $testArray);

        Mit #f:debug>{_all}templateVariableContainer->add(‚xmData‘, $this->objectManager->get(‚TYPO3\CMS\Frontend\ContentObject\RecordsContentObject‘)->render($conf));

        Seit 10 Jahren mache ich Typo3, aber das hier ist unterirdisch …

        • Ich habe den überarbeiteten ViewHelper unter TYPO3 7.6 jetzt mal ausprobiert und erhalte problemlos ein gewünschtes ContentObject anhand der UID. Der komplette ViewHelper:

          <?php
          namespace DENK\AN\DEINEN\NAMESPACE;
          
          /**
           * ViewHelper zur Rückgabe eines geparsten tt_content Elementes
           */
          
          class ContentViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
          {
              /**
               * Parse content element
               *
               * @param    int           UID des Content Element
               * @return   string        Geparstes Content Element
               */
              public function render($uid)
              {
                  $conf = array( // config
                      'tables' => 'tt_content',
                      'source' => $uid,
                      'dontCheckPid' => 1
                  );
                  return $this->objectManager->get('TYPO3\CMS\Frontend\ContentObject\RecordsContentObject')->render($conf);
              }
          }
          
          ?>
          
          • Hallo Paul,
            vielen Dank für deine Bemühungen mit mir … ich komme damit nur nicht weiter.

            Wenn ich mir im Template die Variablen anschaue mit [HTML]{_all}[HTML], dann erhalte ich nicht das data Array. Die Form Extension liefert dieses data Array leider nicht mit aus.

            Daher brauche ich eine einfache Möglichkeit in einem viewhelper den Datensatz des aktuellen Content Elements aus tt_content in ein Array zu speichern, damit ich z.B. {data.uid} im Template verwenden kann.

            Ich finde dazu keinen Hinweis, Quelle oder sonst was …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Highlighting von Codes ist mit den Tags  [ts], [php], [html], [javascript], [xml] oder [code] möglich.