Contao-Camp 2024
Ergebnis 1 bis 25 von 25

Thema: Eigenes ContentElement nach Anleitung in Doku funktioniert nicht

  1. #1
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard Eigenes ContentElement nach Anleitung in Doku funktioniert nicht

    Hallo zusammen,

    erstmal allseits ein gutes neues Jahr

    Ich habe heute mal versucht nach der neuen Doku unter https://docs.contao.org/dev/framework/content-elements/ ein eigene Content Element zu definieren. Das klappt aber leider nicht.

    In der o.g. Doku wird es so beschrieben, als ob das Erstellen eines Content-Elements lediglich über den Eintrag in der dca/tl_content definiert werden kann bzw. der Rest eben über die Annotation in der Controller Klasse. Wenn ich das nach Anleitung umsetze, kann ich das Element im Backend aber nicht auswählen. Das Element sollte ja eigentlich in der Kategorie "texts" sichtbar sein. Da ist aber nichts drin.

    Wenn ich jetzt "alt hergebracht" in der config/config.php das Element registriere, dann sehe ich es in der Auswahl der Elementliste. Wenn das Element auswähle und danach den Dialog speicher, dann erhalte ich eine entsprechende Fehlermeldung:

    Code:
    Attempted to call an undefined method named "generate" of class "App\Controller\ContentElement\MyContentElementController".
    Also irgendwie scheint Contao da die "alte" Funktion generate zu suchen. Ich bringe jetzt also wohl ein paar Dinge durcheinander Hat mir da jemand eine Hilfestellung?

    Vielen Dank schon mal im Voraus...
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

  2. #2
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Den neuen Weg mit der alten Methode wird nicht funktionieren. Ein MP3-Player spielt auch keine Kassetten ab. :-)

    Ohne deinen Code zu kennen und zu sehen, tippe ich zuerst auf den Cache, der nicht erneut aufgebaut wurde. Unter Contao 4.8 habe ich oft auch unter der DEV-Umgebung einen aggressives Cachingverhalten erlebt. Oder du hast etwas übersehen. ;-)

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

    Standard

    Bzgl. Development und Cache: in der dev Umgebung ("Debug-Modus"), ist es grundsätzlich so, dass bei Änderungen bestehender Dateien der Cache nicht gelöscht werden muss. Kommt jedoch eine neue Datei hinzu dessen Inhalt einem Cache bekannt sein muss (bspw. DCA, Symfony Config, Class mit Annotation), dann muss der Cache gelöscht werden.

    Außerdem muss man natürlich darauf achten dass man in der lokalen Entwicklungsumgebung die composer update/install Operation ohne -o/--optimize-autoload durchgeführt hatte.

  4. #4
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Guten Morgen zusammen,

    also am Cache kann es fast nicht liegen, weil ich eigentlich so wie von Spooky empfohlen bei neu dazu gekommenen Dateien den Cache lösche bevor ich es ausprobiere.

    Der Spruch mit dem MP-3 passt Wobei ich es ja extra nach der "neuen" Methode machen will, aber das Gefühl habe, irgendwas falsch zu machen und dadurch in die alte Methoden abzurutschen.

    Können wir vielleicht zunächst folgendes klären: Muss ich mein eigenes Content-Element oder Frontend-Modul nach wie vor in contao/config/config.php registrieren? In der Doku lese ich unter https://docs.contao.org/dev/framewor...ments/#example, dass allein mit den Einsatz von

    PHP-Code:
    // contao/dca/tl_content.php
    $GLOBALS['TL_DCA']['tl_content']['palettes']['my_content_element'] = 
        
    '{type_legend},type;{text_legend},text'

    der Backend-User das neue Content-Element auswählen kann. Also so versteh ich es zumindest Ist dem so, oder muss ich sehr wohl das Element erst registrieren:

    PHP-Code:
    // contao/config/config.php
    $GLOBALS['TL_CTE']['ms_elements'] = array#
    (
        
    'my_content_element' => 'App\Controller\ContentElement\MyContentElementController',
    ); 
    Hier noch mein Controller:

    PHP-Code:

    // src/Controller/ContentElement/MyContentElementController.php
    namespace App\Controller\ContentElement;

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

    /**
     * @ContentElement(category="texts")
     */
    class MyContentElementController extends AbstractContentElementController
    {
        protected function 
    getResponse(Template $templateContentModel $modelRequest $request): ?Response
        
    {
            
    $template->text $model->text;

            return 
    $template->getResponse();
        }

    Mach ich da irgendwas grundlegend falsch oder vermisch ich da irgendwo alt und neu? Danke euch für Hinweise...
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Nein, sonst wäre das ja in der Doku erwähnt

  6. #6
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Nein, sonst wäre das ja in der Doku erwähnt
    Okay, hatte ich vermutet - aber sicher ist sicher

    Verständnisfrage: Mit der Annotation im Controller lege ich fest, in welcher Kategorie der Content-Element ich mein Element dann im Backend sehe - richtig ?

    PHP-Code:
    /**
     * @ContentElement(category="texts")
     */
    class MyContentElementController extends AbstractContentElementController

    Mit dem Eintrag in der tl_content lege ich fest, welche Pallete ich sehe - richtig?

    PHP-Code:
    // contao/dca/tl_content.php
    $GLOBALS['TL_DCA']['tl_content']['palettes']['my_content_element'] =
        
    '{type_legend},type;{text_legend},text'

    Und über die Namens-Konventionen
    Code:
    ['my_content_element']
    und
    Code:
    class MyContentElementController
    findet die Verbindung zwischen tl_content und dem Controller statt - richtig?

    Also müsste ich so wie hier geschrieben, eigentlich im Backend > Inhaltselemente diese neue Element in der Kategorie "Text" sehen - richtig?

    Wenn das alles so stimmt, dann müsste ich wohl doch irgendein Cache-Thema haben.... ne Idee für ein Debugging?
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Ist der Service auch geladen?

  8. #8
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Autowiring ist aktiv, von daher dachte ich, sollt der Service geladen sein?

    Code:
    # config/services.yml
    services:
      _defaults:
        autowire: true
        autoconfigure: true
        public: false
    
      App\:
        resource: ../src
        exclude: ../src/{Entity,Migrations,Resources,Tests}
    Welchen Service müsste ich denn über vendor/bin/contao-console debug:container sehen?
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Den Service namens App\Controller\ContentElement\MyContentElementController, unter der Annahme, dass sich die MyContentElementController.php im Ordner src/Controller/ContentElement und somit im Namespace App\Controller\ContentElement befindet. Was ist das Ergebnis von
    Code:
    vendor/bin/contao-console debug:container MyContentElementController --env=dev
    ?

  10. #10
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Der Service wurde nicht gefunden.

    Aber ich habe wohl den Fehler gefunden. Die services.yml wurde nicht geladen. Ich habe nun im Ordner config die config.yml angelegt und dort die services.yml importiert:

    Code:
    # config/config.yml
    imports:
      - { resource: services.yml }
    Jetzt wird das eigene Content Element im Backend gelistet, ich kann es auswählen und es wird auch im Frontend angezeigt.

    Ist dieses Verhalten, also dass die services.yml im Verzeichnis config nicht automatisch geladen wird, standard? Oder beruht das auch auf einer vielleicht unzureichenden Konfiguration meinerseits?
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    In Contao 4.8 ist das normal, ja. In Contao 4.9 musst du das nicht mehr machen: https://github.com/contao/contao/pull/810

  12. #12
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Okay... vielen Dank für die Info und danke generell für die Hilfe hier

    Jetzt wurschtel ich mal weiter - nach dem "neuen" System
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

  13. #13
    Contao-Nutzer Avatar von JanMalte
    Registriert seit
    01.07.2009.
    Ort
    Mannheim
    Beiträge
    46

    Frage undefined method named "generate"

    Mir ist leider immer noch nicht ganz klar, wie ich nach der neuen Variante ein FrontendModule entwickeln kann/muss.
    ich erhalte immer den Fehler: Attempted to call an undefined method named "generate" of class "App\Controller\FrontendModule\ExhibitorListContro ller

    Laut der Doku sollte das doch aber genau so funktionieren, oder?
    https://docs.contao.org/dev/framewor...t-end-modules/

    PHP-Code:
    <?php
    namespace App\Controller\FrontendModule;

    use 
    Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController;
    use 
    Contao\CoreBundle\ServiceAnnotation\FrontendModule;
    use 
    Contao\ModuleModel;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;

    /**
     * @FrontendModule(
     *     "exhibitor_list",
     *     category="miscellaneous",
     *     template="mod_exhibitor_list",
     * )
     */
    class ExhibitorListController extends AbstractFrontendModuleController
    {
        protected function 
    getResponse(Template $templateModuleModel $modelRequest $request): ?Response
        
    {
            return 
    $template->getResponse();
        }
    }
    Geändert von JanMalte (20.03.2020 um 11:42 Uhr) Grund: Titel angepasst

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

    Standard

    In Contao 4.9 ja. Bist du im Debug-Modus?

  15. #15
    Contao-Nutzer Avatar von JanMalte
    Registriert seit
    01.07.2009.
    Ort
    Mannheim
    Beiträge
    46

    Standard

    Ich habe derzeit Contao 4.8.8 installiert und nutze den PHP eigenen Webserver mit APP_ENV=dev
    Funktioniert das erst ab 4.9? Ist das der Debug Modus, oder muss ich den nochmal explizit irgendwie aktivieren?

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

    Standard

    Funktioniert auch in 4.8. Poste den kompletten Stack Trace.

  17. #17
    Contao-Nutzer Avatar von JanMalte
    Registriert seit
    01.07.2009.
    Ort
    Mannheim
    Beiträge
    46

    Standard

    Ich habe das Module in den Themes angelegt und als Module Include Element in einem Artikel eingebunden

    Stack Trace

    Code:
    Symfony\Component\Debug\Exception\UndefinedMethodException:
    Attempted to call an undefined method named "generate" of class "App\Controller\FrontendModule\ExhibitorListController".
    
      at vendor/contao/core-bundle/src/Resources/contao/elements/ContentModule.php:77
      at Contao\ContentModule->generate()
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:545)
      at Contao\Controller::getContentElement()
         (vendor/contao/core-bundle/src/Resources/contao/modules/ModuleArticle.php:192)
      at Contao\ModuleArticle->compile()
         (vendor/contao/core-bundle/src/Resources/contao/modules/Module.php:209)
      at Contao\Module->generate()
         (vendor/contao/core-bundle/src/Resources/contao/modules/ModuleArticle.php:74)
      at Contao\ModuleArticle->generate()
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:485)
      at Contao\Controller::getArticle()
         (vendor/contao/core-bundle/src/Resources/contao/library/Contao/Controller.php:347)
      at Contao\Controller::getFrontendModule()
         (vendor/contao/core-bundle/src/Resources/contao/pages/PageRegular.php:168)
      at Contao\PageRegular->prepare()
         (vendor/contao/core-bundle/src/Resources/contao/pages/PageRegular.php:48)
      at Contao\PageRegular->getResponse()
         (vendor/contao/core-bundle/src/Resources/contao/controllers/FrontendIndex.php:346)
      at Contao\FrontendIndex->renderPage()
         (vendor/symfony/http-kernel/HttpKernel.php:151)
      at Symfony\Component\HttpKernel\HttpKernel->handleRaw()
         (vendor/symfony/http-kernel/HttpKernel.php:68)
      at Symfony\Component\HttpKernel\HttpKernel->handle()
         (vendor/symfony/http-kernel/Kernel.php:198)
      at Symfony\Component\HttpKernel\Kernel->handle()
         (web/index.php:31)
      at include_once('/home/maltegerth/Projects/k20001_contao4/src/web/index.php')
         (web/router_dev.php:8)
    router_dev.php
    PHP-Code:
    <?php
    if (php_sapi_name() == 'cli-server') {
        
    $info parse_url($_SERVER['REQUEST_URI']);
        
    $filePath urldecode($info['path']);
        if (
    file_exists("./$filePath")) {
            return 
    false;
        }
        include_once 
    'index.php';
    }
    Ohne eine Registrierung des FrontendModules über die config.php steht der Modultyp aber auch nicht zur Verfügung, sodass ich es entgegen der Anleitung registrieren musste
    PHP-Code:
    $GLOBALS['FE_MOD']['exhibitors'] =[
        
    'exhibitor_list'     => 'App\Controller\FrontendModule\ExhibitorListController'
    ]; 
    Geändert von JanMalte (20.03.2020 um 12:10 Uhr)

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

    Standard

    Zitat Zitat von JanMalte Beitrag anzeigen
    Ohne eine Registrierung des FrontendModules über die config.php steht der Modultyp aber auch nicht zur Verfügung, sodass ich es entgegen der Anleitung registrieren musste
    PHP-Code:
    $GLOBALS['FE_MOD']['exhibitors'] =[
        
    'exhibitor_list'     => 'App\Controller\FrontendModule\ExhibitorListController'
    ]; 
    Das ist falsch, du darfst entweder nur die alte Methode verwenden oder nur die neue Methode. Wenn du beides mischst, kommt es zu diesem Fehler.

  19. #19
    Contao-Fan
    Registriert seit
    29.06.2016.
    Beiträge
    502

    Standard

    Auch ich möchte ein Conten-Element anlegen und halte mich (soweit es geht) an diese Anleitung hier:
    https://docs.contao.org/dev/framework/content-elements/


    Das hab ich somit bisher:

    app/Resources/contao/dca/tl_content.php
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_content']['palettes']['my_content_element'] = '
    {type_legend},type;
    {text_legend),text,url;
    '


    src/Controller/ContentElement/MyContentElementController.php
    PHP-Code:
    namespace App\Controller\ContentElement;

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

    /**
     * @ContentElement(category="texts")
     */
    class MyContentElementController extends AbstractContentElementController
    {
        protected function 
    getResponse(Template $templateContentModel $modelRequest $request): ?Response
        
    {
            
    $template->text $model->text;
            
    $template->url $model->url;
            
            return 
    $template->getResponse();
        }


    templates/ce_my_content_element.html5
    PHP-Code:
    <div class="my-content-element">    
        <?= $this->text?>
    </div>

    app/config/services.yml
    PHP-Code:
    services:
        
    App\Controller\ContentElement\MyContentElementController:
            
    tags:
                -
                    
    namecontao.content_element
                    category
    texts 

    app/config/config.yml
    PHP-Code:
    imports:
      - { 
    resourceservices.yml 

    Resultat:
    Das Front- und Backend ist nicht mehr erreichbar (HTTP ERROR 500).

    Zur Info: Die Pfadangaben bei den obigen Snippets beziehen sich immer auf das Contao Root-Verzeichnis.

    Was ist hier falsch?

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

    Standard

    Du hast "app/" in deinem Pfad. Welche Contao Version ist das? Du brauchst Contao 4.9

  21. #21
    Contao-Fan
    Registriert seit
    29.06.2016.
    Beiträge
    502

    Standard

    Ich hab die Version 4.9.3 in Verwendung.

    Durch ein "composer install" im Terminal konnte ich nun das Backend wieder erreichen.
    Nun bekomme ich jedoch eine Contao-Fehlermeldung sobald ich in die Artikel-Bearbeitung gehe:
    Code:
    Internal Server Error
    Was ist das Problem?
    Attempted to load class "MyContentElementController" from namespace "App\Controller\ContentElement". Did you forget a "use" statement for another namespace?

  22. #22
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.942

    Standard Eigenes ContentElement nach Anleitung in Doku funktioniert nicht

    autoload Abschnitt in der composer.json hinzugefügt?

    Edit: „Autokorrektur-Typo“ beseitigt
    Geändert von fiedsch (14.06.2020 um 19:34 Uhr)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  23. #23
    Contao-Fan
    Registriert seit
    29.06.2016.
    Beiträge
    502

    Standard

    Ich nehme an du meinst die "composer.json".

    So sieht dort der Autoload-Abschnitt bei mir aus:
    Code:
        "autoload": {
            "psr-4": { "AppBundle\\": "src/AppBundle/" },
            "classmap": ["app/ContaoManagerPlugin.php"]
        },

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

    Standard

    Deine Autoload Definition stimmt nicht mit deinem Code überein. Warum hast du das so definiert? Brauchst du das AppBundle? Brauchst du ein Contao Manager Plugin?

  25. #25
    Contao-Fan
    Registriert seit
    29.06.2016.
    Beiträge
    502

    Standard

    Alles klar, vielen Dank für den Hinweis.

    Hab nun das hier in die composer.json eingefügt:
    Code:
        "autoload": {
            "psr-4": {
                "App\\": "src/"
            }
        }
    Nun klappt es.

    Die autoload-Angaben zuvor waren Relikte aus vorhergehenden Versuchen die ich übersehen hatte

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
  •