Zum Inhalt springen

Hook für eigene Extension

Erstellt am 2. Dezember 2020 · 2 Antworten · letzte Antwort am 4. Dezember 2020

Tags: TYPO3 9, Frage

s_reinecke ·

Hallo,

ich habe eine Extension für Ansprechpartner geschrieben. Jetzt möchte ich, das im Backend bei den Inhaltselementen einer Seite, wo dieses Plugin eingebunden ist, nicht nur der Pluginname, sondern auch der Name des ausgewählten Ansprechpartners steht. Sonst muss man ja immer in das Plugin gehen, um zu sehen, wer da ausgewählt wurde. Die Auswahl geschieht übrigens mittels Flexform.

Dafür habe ich folgenden Hook angelegt:

In der ext_localconf.php

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawItem']['contactperson_person'] =
\Vendor\Contactperson\Hooks\PageLayoutView\ContactpersonPreviewRenderer::class;

Dann im Verzeichnis /Classes/Hooks/PageLayoutView/ die Datei ContactpersonPreviewRenderer.php angelegt mit folgendem Inhalt

namespace Vendor\Contactperson\Hooks\PageLayoutView;

use \TYPO3\CMS\Backend\View\PageLayoutViewDrawItemHookInterface;
use \TYPO3\CMS\Backend\View\PageLayoutView;

class ContactpersonPreviewRenderer implements PageLayoutViewDrawItemHookInterface
{
    public function preProcess(
        PageLayoutView &$parentObject,
        &$drawItem,
        &$headerContent,
        &$itemContent,
        array &$row
    ) {
        if ($row['CType'] === 'list' && $row['list_type'] === 'contactperson_person') {
          
            $itemContent .= '<p>Ansprechpartner</p>';
            // Hier kommt der Fehler:
            $elements = $personsRepository->findByUid($row['pi_flexform']);
            $drawItem = false;
        }
    }
}

Es wird alles richtig ausgegeben, nur an der Stelle wo "Hier kommt der Fehler" steht, kommt dieser Fehler:
Call to a member function findByUid() on null

In $row['pi_flexform'] steht die richtige ID drin, aber irgendwas ist hier noch nicht richtig.

Mein Frage:
Ist das überhaupt der richtige Weg? Geht das evtl. noch einfacher mit TCA oder sonstigem?

Ich bin wie immer für jeden Hinweis dankbar!

Viele Grüße,
Stephan

Julian.​Hofmann ·

Hallo Stephan.

Problem ist das Umfeld, in dem der Hook aufgerufen wird. Dir fehlt das personsRepository. Und das bekommst Du auch nicht ganz so leicht hergezaubert.
Für die einfache Vorschau benötigst Du aber vermutlich weder das Repo, noch das komplette Model/Objekt der Person in Relationen. Daher kannst Du Dir auch eine DB-Abfrage zaubern

        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName);
        /** @var \Doctrine\DBAL\Driver\Statement $statement */
        $statement = $queryBuilder
            ->select('*')
            ->from($tableName)
            ->where(
                $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($row['pi_flexform'], \PDO::PARAM_INT))
            )
            ->execute();
        return $statement->fetch();

Viele Grüße
Julian

s_reinecke ·

Hallo Julian,

vielen Dank, das hat funktioniert!

Ich habe die DB-Abfrage in eine eigene Funktion gepackt und beim preProcess aufgerufen. Ich musste allerdings vorher noch die ID ordentlich aus dem XML-Objekt bekommen, das war eine nervige Try-And-Error Sache. ;-)