Ergebnis 1 bis 9 von 9

Thema: Im DCA die Anzal der Child-Records ausgeben

  1. #1
    Jayster
    Gast

    Standard Im DCA die Anzal der Child-Records ausgeben

    Hallo liebe Contao Community,

    ich erstelle gerade eine Erweiterung, bei der man Seminare einstellen kann, zu denen sich die Besucher der Website Anmelden können. Die Anmeldungen habe ich als Child-Records von den Seminaren implementiert. Man kann nun im Backend Modul Seminare anlegen und wenn man auf das Bearbeiten-Symbol klickt, kommt man zu den Anmeldungen.

    Nun würde ich gerne bei der Auflistung der Seminare direkt die Anzahl der Anmeldungen (also die Anzahl der Child-Records) ausgeben. Wie kann ich das in meinem Seminar DCA am besten realisieren? Ich könnte natürlich in meinem label_callback (also der Funktion, die die Seminare auflistet) für jeden Eintrag eine SQL-Anfrage machen, die die Child-Records zählt. Das erscheint mir aber sehr ineffizient, da ich so sehr viele Datenbankanfragen habe. Hat vielleicht jemand eine bessere Idee?

  2. #2
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.480
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Aus meiner Sicht hast du schon die Lösung.

    Die andere wäre, dass du am Seminar ein Feld "Anzahl Anmeldungen" hast und das dann entsprechend änderst, wenn Anmeldungen hinzukommen bzw. gelöscht werden.

    Also doch eher sein Weg. Im Grunde hast du doch pro Listing Seite max. 30 Abfragen ....

    Gruß, Cliff

  3. #3
    Jayster
    Gast

    Standard

    Danke für die Antwort.

    Ich habe es inzwischen auch so implementiert. Ein eigenes Feld für die Anzahl der Anmeldungen möchte ich nicht so gern machen, weil ich mich dann immer darum kümmern muss, dass das richtig aktualisiert wird. Die Child-Records zu zählen erscheint mir einfacher und weniger Fehleranfällig.

    Mich würde trotzdem noch interessieren, ob es irgendwie anders geht. Wenn die Seminare von Contao geladen werden, wird da ja auch irgendwo eine SQL-Anfrage stattfinden. Vielleicht könnte man diese Anfrage irgendwie erweitern, sodass das Zählen der Child-Records mit eingefügt wird. So nach dem Muster "COUNT(*) AS registrations" und ich könnte dann auf die Anzahl zugreifen.

    Eine andere Sache gibt es da noch. Das ist nicht unbedingt nötig, aber mich würde echt interessieren, ob es machbar ist. Die Child-Records (also die Anmeldungen) Liste ich mit Mode 4 auf. Also mit Informationen über das Elternelement im Header. In diesem Header kann ich mir ja jedes beliebige Feld aus dem Elternelement ausgeben lassen. Aber kann ich den Header auch noch weiter nach eigenen Bedürfnissen anpassen, ähnlich wie mit dem label_callback? Ich würde hier nämlich auch gern wieder die Anzahl der Anmeldungen ausgeben.

  4. #4
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.480
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ja, das Zusatzfeld finde ich auch nicht schön.

    Ich denke nicht, dass man sich irgendwo an SQL hängen kann. Aber wer weiß, vlt. hat noch jmd. ne Idee.

    Zu deiner letzten Frage:

    Es gibt einen "header_callback" (ist, wie es scheint nicht in der Doku aufgeführt).

    Der Aufruf im Code ist hier: https://github.com/contao/core/blob/...hp#L4058-L4070

    Du legst ihn an wie einen "child_record_callback". Methodensignatur ist dann
    PHP-Code:
    myHeaderCallback($arrHeaderFieldsDataContainer $dc
    Z.B. so: https://github.com/cliffparnitzky/Tr...sults.php#L506

    Gruß, Cliff

  5. #5
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.480
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Nachtrag:

    "haeder_callback" ist nun auch in der Doku: https://docs.contao.org/books/api/dc...ting-callbacks

    Gruß, Cliff

  6. #6
    Jayster
    Gast

    Standard

    Vielen Dank!

    Der header_callback war genau, was ich gebraucht habe.

  7. #7
    Contao-Nutzer
    Registriert seit
    09.09.2009.
    Beiträge
    89

    Standard

    10 Jahre später stehe ich gerade vor der gleichen Fragestellung -Anzahl der Child-Records - und würde einmal die Runde fragen, ob es zwischenzeitlich evtl. einen besseren Weg als einen Callback gibt? Hat ggf. jemand das schon mal in einer Erweiterung implementiert?

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

    Standard

    Der Callback ist doch der beste Weg?
    » sponsor me via GitHub or Revolut

  9. #9
    Contao-Nutzer
    Registriert seit
    09.09.2009.
    Beiträge
    89

    Standard

    Ich hatte gehofft, dass es für

    Mich würde trotzdem noch interessieren, ob es irgendwie anders geht. Wenn die Seminare von Contao geladen werden, wird da ja auch irgendwo eine SQL-Anfrage stattfinden. Vielleicht könnte man diese Anfrage irgendwie erweitern, sodass das Zählen der Child-Records mit eingefügt wird. So nach dem Muster "COUNT(*) AS registrations" und ich könnte dann auf die Anzahl zugreifen.
    eventuell bereits eine Lösung gibt.

    Aber dann soll es der Callback sein.

    Code:
    // src/EventListener/DataContainer/ChildrenLabelCallbackListener.php
    namespace App\EventListener\DataContainer;
    
    use App\Model\MyModel;
    use Contao\CoreBundle\DependencyInjection\Attribute\AsCallback;
    use Contao\DataContainer;
    
    #[AsCallback(table: 'tl_mytable', target: 'list.label.label')]
    class ChildrenLabelCallbackListener
    {
    
        public function __invoke(array $row, string $label, DataContainer $dc, array $labels): array
        {
            $fieldName = 'children';
            $fields = $GLOBALS['TL_DCA'][$dc->table]['list']['label']['fields'];
            $key = array_search($fieldName, $fields, true);
    
            $children = MyModel::findByPid($row['id']);
    
            $counter = 0;
    
            if(null !== $children) {
                $counter = $children->count();
            }
    
            $labels[$key] = $counter;
    
            return $labels;
        }
    }

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •