[Frage] Hook für eigene Extension TYPO3-Version: 9.5.23

  • s_reinecke s_reineck...
    Padawan
    0 x
    35 Beiträge
    1 Hilfreiche Beiträge
    02. 12. 2020, 16:01

    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
    [code]$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawItem']['contactperson_person'] =
    \Vendor\Contactperson\Hooks\PageLayoutView\ContactpersonPreviewRenderer::class;
    [/code]

    Dann im Verzeichnis /Classes/Hooks/PageLayoutView/ die Datei ContactpersonPreviewRenderer.php angelegt mit folgendem Inhalt
    [code]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;
    }
    }
    }
    [/code]

    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


  • 1
  • 0 x
    3252 Beiträge
    152 Hilfreiche Beiträge
    03. 12. 2020, 16:36

    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
    [code]$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(); [/code]

    Viele Grüße
    Julian

  • s_reinecke s_reineck...
    Padawan
    0 x
    35 Beiträge
    1 Hilfreiche Beiträge
    04. 12. 2020, 11:10

    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. ;-)

  • 1