Ergebnis 1 bis 5 von 5

Thema: Autowiring / Content Elemente als Wrapper definieren funktioniert nicht [solved]

  1. #1
    Contao-Nutzer
    Registriert seit
    13.02.2023.
    Beiträge
    15

    Standard Autowiring / Content Elemente als Wrapper definieren funktioniert nicht [solved]

    Hallo zusammen!

    Ich betreue eine Contao Installation die in einem Hauruck Verfahren von der Version 4.1.10 auf die Version 4.13.* geupdatet wurde. Ich vermute dabei sind einige Einstellungen, die nötig sind um Autowiring zu aktivieren, noch nicht vorgenommen worden.

    Meine /config/services.yaml sieht so aus:
    Code:
    services:
      _defaults:
        autowire: true
        autoconfigure: true
        public: false
    
      App\:
        resource: ../src
        exclude: ../src/{Entity,Migrations,Model,Resources,Tests,Widget}
    
      App\Controller\:
        resource: ../src/Controller
        public: true
    Ich habe 3 Controller unter /src/Controller/ liegen:
    PillarElementController.php
    PillarStartController.php
    PillarStopController.php

    Alle sind noch recht leer und haben folgenden Aufbau (Nur der class name unterscheidet sich):
    PHP-Code:
    <?php

    namespace App\Controller;

    use 
    Contao\ContentModel;
    use 
    Contao\CoreBundle\Controller\ContentElement\AbstractContentElementController;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;

    class 
    PillarElementController extends AbstractContentElementController
    {
        protected function 
    getResponse(Template $templateContentModel $modelRequest $request): ?Response
        
    {
            
    $template->model $model;
            return 
    $template->getResponse();
        }
    }
    entsprechende Paletten sind in /contao/dca/tl_content.php definiert ($GLOBALS['TL_DCA']['tl_content']['palettes']['pillar_element'] = ...), Templates wurden unterhalb von /templates/ angelegt (ce_pillar_element.php, ce_pillar_start.php, ce_pillar_stop.php), language Variablen sind gesetzt in /contao/languages/en/default.php (und /de/) und in der Datei /contao/config/config.php wurden die templates als wrapper markiert:
    PHP-Code:
    <?php

    $GLOBALS
    ['TL_WRAPPERS']['start'][] = 'ce_pillar_start';
    $GLOBALS['TL_WRAPPERS']['stop'][] = 'ce_pillar_stop';
    Leider werden die Controller aber gar nicht erkannt. Wenn ich die services.yaml um Einträge nach der Art
    Code:
    ...
      App\Controller\PillarElementController:
        tags:
          - name: contao.content_element
            category: slider
            template: ce_pillar_element
    ergänze, werden die Content Elemente korrekt angezeigt (BE+FE). Aber das markieren als Wrapper klappt dennoch nicht.

    Bei Lösung gerne auch die Stelle wo ich Informationen zum Thema hätte nachlesen können, denn meine Suche blieb erfolglos.

    Besten Dank im Voraus und viele Grüße
    Thomas
    Geändert von samtigall (13.09.2023 um 16:58 Uhr)

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Da du bei deinen Inhaltselementen keinen Type angegeben hast, wird der Type automatisch vom Klassennamen abgeleitet. Der Type des Inhaltselementes PillarElementController lautet bpsw. pillar_element. Diesen Type musst du in der config.php für TL_WRAPPERS nutzen. Oder eben den Type explizit definieren.
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    13.02.2023.
    Beiträge
    15

    Standard

    Wunderbar - vielen Dank!

    PHP-Code:
    <?php

    $GLOBALS
    ['TL_WRAPPERS']['start'][] = 'pillar_start';
    $GLOBALS['TL_WRAPPERS']['stop'][] = 'pillar_stop';
    Damit hat es geklappt. Und Autowiring hat auch wieder funktioniert, nachdem ich zuvor entfernte Attributes wieder eingefügt hab

    PHP-Code:
    ...
    #[AsContentElement(category: 'slider')]
    class PillarElementController extends AbstractContentElementController
    {
    ... 

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Ich persönlich definiere mir immer eine public const im Controller selbst - dann kann man den Type überall bequem referenzieren. Also zB:

    PHP-Code:
    #[AsContentElement(self::TYPE, 'slider', 'ce_pillar_start')]
    class PillarStartController
    {
        final public const 
    TYPE 'pillar_start';

        
    // …

    PHP-Code:
    use App\Controller\ContentElement\PillarStartController;

    $GLOBALS['TL_WRAPPERS']['start'][] = PillarStartController::TYPE
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Nutzer
    Registriert seit
    13.02.2023.
    Beiträge
    15

    Daumen hoch

    Danke für den Hinweis! Ich meine ich hätte das auch irgendwo in der Dev Doku gelesen...

    Ich werde das direkt so als Best Practise mitnehmen!

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
  •