Ergebnis 1 bis 6 von 6

Thema: List Modul mit AbstractFrontendModuleController

  1. #1
    Contao-Nutzer
    Registriert seit
    15.07.2020.
    Beiträge
    3

    Frage List Modul mit AbstractFrontendModuleController

    Hallo Contao Community,

    bei der Entwicklung eines Frontend Moduls, welches eine Liste von Einträgen aus der Datenbank anzeigt, komme ich nicht mehr weiter.

    Erstmal zur Ausgangslage:
    Ich habe einen funktionierenden Controller für das Modul geschrieben, dieser nimmt alle Eintrage aus dem über die Modul Einstellungen definierten Archiv und geht diese durch.
    Über einen weiteren "Controller" (der aber eigentlich keiner ist, ich habe ihn nur so benannt gehabt) wird nach alter Contao 3.x manier mit compile aus dem übergebenen Template html erzeugt.

    Der nachfolgende Code ist teilweise gekürzt/angepasst, also nicht über nichtssagende Variablen Namen wundern.

    Der List Modul Controller:
    PHP-Code:
    class ListModuleController extends AbstractFrontendModuleController {

        protected function 
    getResponse(Template $templateModuleModel $modelRequest $request): ?Response {
            
    $types TypeModel::findBy('pid'$model->archive);
            
    $arrTypes = array();
            
    $typeModuleController = new TypeModuleController();
            foreach (
    $types as $type) {
                
    $type_template = new FrontendTemplate();
                
    $type_template->setName($model->type_template);
                
    $arrTypes[] = $TypeModuleController->compile($type_template$type);
            }
            
    $template->types $arrTypes;        
            return 
    $template->getResponse();
        }

    Der Type "Controller":
    PHP-Code:


    class TypeModuleController extends Frontend {

        public function 
    compile(Template $templateModel $model): string {
            
    $template->setData($model->row());
            return 
    $template->parse();
        }


    List Template:
    HTML-Code:
    <?php $this->extend('block_searchable'); ?>
    
    <?php $this->block('content'); ?>
    
        <?php foreach($this->types as $type): ?>
            <?=$type ?>
        <?php endforeach; ?>
    
    <?php $this->endblock(); ?>
    Nun würde ich gerne auch für die einzelnen Typ Blöcke auch einen FragmentController nutzen um
    Sure one could simply create a module the old way, but this limits functionality and is not recommended anymore.
    Contao Developer Documentation Fragments
    gerecht zu werden.


    Leider nutzen die Contao-Core Erweiterungen, die ich mir angeschaut habe meist noch nicht die neuen AbstractFrontendModuleController, sodass ich mir nicht einfach dort eine Liste anschauen konnte.

    Hoffe mir kann hier jemand etwas weiter helfen, wie ich an dieser Stelle die Fragments/Sub Requests einsetzen muss, damit ich diese möglichst effizient einsetzen kann.

    Mit freundlichen Grüßen

    Markus
    Geändert von m.wersig (16.07.2020 um 10:15 Uhr) Grund: Klassen angepasst

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

    Standard

    Warum instanzierst du in deinem ListModuleController einen TypeModuleController? Das wird vermutlich nicht funktionieren. Davon abgesehen hast du dich bei den Variablennamen verschrieben.

  3. #3
    Contao-Nutzer
    Registriert seit
    15.07.2020.
    Beiträge
    3

    Frage

    Zitat Zitat von Spooky Beitrag anzeigen
    Warum instanzierst du in deinem ListModuleController einen TypeModuleController? Das wird vermutlich nicht funktionieren. Davon abgesehen hast du dich bei den Variablennamen verschrieben.
    Ich habe den Code nochmal angepasst, wie gesagt, das mit dem TypeModuleController ist kein wirklicher Controller, bzw. darum geht es mir ja gar nicht.
    Der Code wie er jetzt dort steht funktioniert (da ich die Variablen umbenannt habe, kann es sein, dass diese nicht 100% zusammenpassen), allerdings nutzt er nicht alle Vorteile der Sub Requests.

    Meine Frage ist ja, wie kann ich in dem List Controller die Controller der einzelnen Elemente aufrufen, dass diese korrekt in einer Liste angezeigt werden.

    Vielleicht ein kleines Beispiel um mein Anliegen zu verdeutlichen:

    Ich lege das Frontendmodul an und wähle dort aus, aus welchem Archiv die Elemente aus der Datenbank gelesen werden sollen.

    Im TypeListModuleController werden dann die Elemente geladen, diese sollen nun im Template ausgegeben werden, wenn möglich als eigene Controller um das Caching von Contao 4.9 zu nutzen.

    Wie rufe ich in einem Controller also weitere Controller auf und leite ihre Responses korrekt ans Frontend weiter?

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

    Standard

    Das kann ich dir leider nicht beantworten. Ich weiß auch nicht ob Subrequests in der Form überhaupt unterstützt werden.

    Aber ich habe noch nicht verstanden, warum du das so machen möchtest. Für Caching musst du ja nur den Response des ListModuleController entsprechend taggen, dafür brauchst du ja nicht extra einen Sub Controller?

  5. #5
    Contao-Nutzer
    Registriert seit
    15.07.2020.
    Beiträge
    3

    Daumen hoch

    Danke für die schnelle Antwort.

    Ich dachte man könnte dank der Controller ohne compile/generate auskommen und nur noch Controller benutzen, aber das scheint wohl nicht so einfach zu sein.
    Bezüglich des Caching werde ich mir wohl nochmal die Dokumentation dazu genauer durchlesen und in Kombination damit für jedes Modul das Template compilen.

    Falls ich noch mehr Fragen habe, oder eine Lösung gefunden habe, mit der sich Sub Requests nutzen lassen (damit wäre die Cache Invalidation vermutlich einfacher, da ich nur für jeden Datensatz schauen müsste, ob er sich verändert hat), werde ich hier nochmal schreiben.

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

    Standard

    Zitat Zitat von m.wersig Beitrag anzeigen
    Ich dachte man könnte dank der Controller ohne compile/generate auskommen und nur noch Controller benutzen, aber das scheint wohl nicht so einfach zu sein.
    Doch natürlich. Wieso willst du in deinem Controller ein anderes Modul compilen?



    Zitat Zitat von m.wersig Beitrag anzeigen
    (damit wäre die Cache Invalidation vermutlich einfacher, da ich nur für jeden Datensatz schauen müsste, ob er sich verändert hat), werde ich hier nochmal schreiben.
    Dafür nutzt du wie gesagt den Response Tagger.

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
  •