Ergebnis 1 bis 19 von 19

Thema: ContentElement lässt sich nicht registrieren

  1. #1
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard ContentElement lässt sich nicht registrieren

    Hallo zusammen,

    ich verändere gerade eine lokale Erweiterung von mir auf die in der Documentation aufgezeigte Methode.
    Dabei hapert es gerade an den Content Elementen, die im Backend nicht zur Auswahl erscheinen.
    Ich verwende die Version 4.10.x, meine Dateien sehen wie folgt aus:

    \src\Controller\ContentElement\ProductListControll er.php
    PHP-Code:
    <?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;
    use 
    App\Model\ProductModel;

    /**
     * @ContentElement(category="texts")
     */
    class ProductListController extends AbstractContentElementController {

        protected function 
    getResponse(Template $templateContentModel $modelRequest $request): ?Response
        
    {
            
    $template->products $model->products;

            return 
    $template->getResponse();
        }
    }
    \contao\dca\tl_content.php
    PHP-Code:
    <?php
    $GLOBALS
    ['TL_DCA']['tl_content']['palettes']['product_list'] = '{type_legend},type,headline;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID;{invisible_legend:hide},invisible,start,stop';
    Mein Template liegt direkt im \templates Ordner.

    Zusätzlich erstellt habe ich: \config\routing.yml:
    PHP-Code:
    app.controller:
        
    resource: ../src/Controller
        type
    annotation 
    Der Rest meiner Erweiterung (DCA, Backendmodule) wird richtig geladen, jedoch kann ich die Frontend-Module bisher noch nicht auswählen.
    Habe ich hier irgendwo einen offensichtlichen Fehler gemacht?

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

    Standard

    Sieht grundsätzlich korrekt aus. Überprüfe mal mit
    Code:
    vendor/bin/contao-console debug:container ProductListController
    ob der Service richtig registriert und getagged wurde.

  3. #3
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard

    Ich entwickle das ganze aktuell leider über die Managed Edition. Kann ich die Ausgabe irgendwie über den Contao Manager anstoßen?

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

    Standard

    Zitat Zitat von waldo Beitrag anzeigen
    Ich entwickle das ganze aktuell leider über die Managed Edition.
    Wieso "leider"? Das passt doch



    Zitat Zitat von waldo Beitrag anzeigen
    Kann ich die Ausgabe irgendwie über den Contao Manager anstoßen?
    Nein, das geht nur über die Konsole.

    Hast du denn nach deinen Änderungen überhaupt den Symfony Application Cache neu aufbauen lassen?

  5. #5
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard

    Ja, ich habe den Class Loader aktualisiert und den Installer ausgeführt. Zum Testen hatte ich aber auch noch den kompletten Composer Cache geleert.
    Wie könnte ich die Fehlerquelle nun weiter eingrenzen? Auf die Konsole habe ich leider keinen Zugriff.

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

    Standard

    Zitat Zitat von waldo Beitrag anzeigen
    und den Installer ausgeführt.
    Du meinst, du hast die Abhängigkeiten nochmal installieren lassen? Und das ging ohne Fehler durch?

  7. #7
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard

    Genau. Das ging problemlos durch, einen Fehler hatte er hier nicht ausgegeben.

  8. #8
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard

    Habe es nun lösen können. Das Problem waren scheinbar noch alte Dateien aus meiner Ursprünglichen Entwicklung (da ich ja gerade auf die in den Docs beschriebene Variante umbaue).
    Jetzt klappt es aber :-)

  9. #9
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard

    Eine Frage hätte ich da allerdings noch:

    Ich verwende in meinem zum Content Element passenden Template aktuell noch Models. Das ging zuvor problemlos. Nun meckert er jedoch mit
    HTML-Code:
    Attempted to load class "ProductModel" from the global namespace. Did you forget a "use" statement for "App\Model\ProductModel"?
    Selbst wenn ich zu Beginn des Templates
    PHP-Code:
    use App\Model\ProductModel
    einsetze, kommt der gleiche Fehler.
    Wie wäre hier nun die richtige Vorgehensweise um auf mein Model zugreifen zu können?

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

  11. #11
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard

    Ja, ich habe die Klasse erstellt (\src\Model\ProductModel.php)

    PHP-Code:
    <?php

    namespace App\Model;

    use 
    Contao\Model;

        class 
    ProductModel extends Model
        
    {
            protected static 
    $strTable 'tl_products';

            public static function 
    findByArtNo($val, array $opt=array()) {
                
    $t = static::$strTable;
                
    $objDatabase Database::getInstance();

                
    $objResult $objDatabase->prepare("SELECT * FROM $t WHERE artno=?")->execute($val);

                if (
    $objResult->numRows 1) {
                    return 
    null;
                }

                return static::
    createCollectionFromDbResult($objResult$t);
            }

        }
    und das Model dann registriert (\contao\config\config.php):
    PHP-Code:
    <?php

    use App\Model\ProductModel;


    $GLOBALS['TL_MODELS']['tl_products'] = ProductModel::class;
    EDIT:

    Bisher habe ich im Template das Model so verwendet:
    PHP-Code:
    \ProductModel:findBy... 
    ist das so richtig?
    Habe des Testweise gerade mal ohne " \ ", also
    PHP-Code:
    ProductModel:findBy... 
    ausprobiert.
    Da meckert er dann mit
    HTML-Code:
    Attempted to load class "Database" from namespace "App\Model". Did you forget a "use" statement for another namespace?
    Setze ich jedoch ein zusätzliches
    HTML-Code:
    use App\Model
    in meine ProductModel.php, dann meckert der Composer Installer:
    HTML-Code:
    Cannot use App\Model as Model because the name is already in use in /var/www/.../src/Model/ProductModel.php on line 6
    Wie wäre denn nun die richtige Verwendung ?
    Geändert von waldo (26.08.2020 um 08:16 Uhr)

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

    Standard

    Nein, das ist nicht richtig so. Deine Klasse Heißt ja \App\Model\ProductModel, nicht \ProductModel.

  13. #13
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard

    Also sollte ich mit \App\Model\ProductModel::findBy... auf diese zugreifen?

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

    Standard

    Ja. Das hat auch nichts mit Contao zu tun - du musst natürlich immer die jeweilige Klasse richtig referenzieren. \ProductModel funktioniert nur, wenn sich die Klasse im Root Namespace befindet (oder einen Alias dort hat).

  15. #15
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard

    Damit klappt es nun, vielen Dank für die Hilfe !

    Ich hätte da allerdings immernoch eine Frage
    Im Backend wird, wenn das Content Element in den Artikel eingefügt wird, allerdings nun in der Übersicht des Content-Elements die ersten Zeilen des Templates ausgegeben.
    Ist in den Docs irgendwo beschrieben, wie ich hier einen eigenen Text hinzufügen kann?

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

    Standard

    Was genau meinst du bzw. was genau möchtest du machen?

  17. #17
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard

    Unbenannt-5.png

    Ich meine die Content Element-Übersicht. Hier beginnt er bereits mit der Template-Ausgabe. Hier würde ich jedoch am liebsten einen Platzhaltertext z.B. einsetzen.

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

    Standard

    Das macht der AbstractFrontendModuleController zB bereits automatisch: https://github.com/contao/contao/blo...er.php#L28-L30

    Bei Inhaltselementen ist das nicht vorgesehen - aber du kannst es dir natürlich für dein Inhaltselement selbst implementieren.

  19. #19
    Contao-Nutzer
    Registriert seit
    02.12.2017.
    Beiträge
    140

    Standard

    Ich muss hier leider nochmal um Rat fragen.
    Ich entwickle parallel noch ein wiederverwendbares, lokales Bundle. Hier möchte ich gerade ein Frontend-Modul erstellen.
    Ich habe folgendes erstellt:

    composer.json meiner Contao Installation:
    PHP-Code:
    {
    {
        
    "type""project",
        
    "require": {
            
    "contao/conflicts""*@dev",
            
    "contao/manager-bundle""4.10.*",
            
    "contao/news-bundle""4.10.*",
            
    "vendorname/contao-helpdesk-bundle""dev-master"
        
    },
        
    "extra": {
            
    "contao-component-dir""assets"
        
    },
        
    "scripts": {
            
    "post-install-cmd": [
                
    "Contao\\ManagerBundle\\Composer\\ScriptHandler::initializeApplication"
            
    ],
            
    "post-update-cmd": [
                
    "Contao\\ManagerBundle\\Composer\\ScriptHandler::initializeApplication"
            
    ]
        },
        
    "repositories": [
          {
            
    "type""path",
            
    "url""dev"
          
    }
        ]

    composer.json meines Bundles in: /dev/composer.json
    PHP-Code:
    {
        
    "name""vendorname/contao-helpdesk-bundle",
        
    "description""...",
        
    "type""contao-bundle",
        
    "require": {
            
    "contao/core-bundle""^4.4"
        
    },
        
    "license""proprietary",
        
    "authors": [
            {
              
    "name""Vendor",
              
    "homepage""https://www.vendor.de"
            
    }
        ],
        
    "autoload": {
          
    "psr-4": {
            
    "vendorname\\ContaoHelpdeskBundle\\""src/"
          
    }
        },
        
    "extra": {
          
    "contao-manager-plugin""vendorname\\ContaoHelpdeskBundle\\ContaoManager\\Plugin"
        
    }


    /dev/Controller/FrontendModule.php
    PHP-Code:
    <?php

    namespace vendorname\ContaoHelpdeskBundle\FrontendModule;

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

    /**
     * @FrontendModule(category="miscellaneous")
     */
    class HelpdeskModuleController extends AbstractFrontendModuleController
    {
        protected function 
    getResponse(Template $templateModuleModel $modelRequest $request): ?Response
        
    {
            return 
    $template->getResponse();
        }
    }
    /dev/src/Resources/contao/dca/tl_module.php
    PHP-Code:
    <?php

    $GLOBALS
    ['TL_DCA']['tl_module']['palettes']['helpdesk_module'] =  '{title_legend},name,type;{template_legend:hide},customTpl;';
    /dev/src/Resources/contao/templates/mod_helpdesk_module.html5
    HTML-Code:
    <div class="my-frontend-module">
      <h1>FRONTEND MODULE</h1>
    </div>

    So habe ich es zumindest als Vorgehensweise in der Dokumentation verstanden.Das Frontendmodul wird mir jedoch nicht angezeigt.
    Der Composer Installer läuft ohne Fehlermeldung durch, zeigt mir zusätzlich aber noch folgendes an:
    PHP-Code:
    Deprecation Notice: Class vendorname\ContaoHelpdeskBundle\FrontendModule\HelpdeskModuleController located in ./vendor/vendorname/contao-helpdesk-bundle/src/Controller/FrontendModule/HelpdeskModuleController.php does not comply with psr-4 autoloading standardIt will not autoload anymore in Composer v2.0in phar:///var/www/vhosts/.../web/contao-manager.phar.php/vendor/composer/composer/src/Composer/Autoload/ClassMapGenerator.php:201 

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
  •