Ergebnis 1 bis 3 von 3

Thema: Unterscheidung zwischen neuen und bestehenden Eintrag in fields-load-Callback?

  1. #1
    Contao-Nutzer
    Registriert seit
    30.04.2010.
    Beiträge
    27
    Partner-ID
    xenbyte

    Standard Unterscheidung zwischen neuen und bestehenden Eintrag in fields-load-Callback?

    Guten Tag,

    ich habe eine eigene Tabelle mit mehreren Feldern erstellt und möchte, dass wenn ein bestimmte Select-Feld ausgewählt wird, die anderen Felder einen bestimmten Standardwert erhalten. Im DCA habe ich für das Select-Feld submitOnChange auf true gesetzt und dann (je Feld) einen Callback erstellt. Hier ein Auszug aus dem Callback mit dem target fields.action.load:

    PHP-Code:
    class EventActionDefaultCallback
    {
        public function 
    __invoke(string|null $currentValueDataContainer|null $dc null): string|null
        
    {
            if (
    null === $dc || '' !== ((string) $currentValue)) {
                return 
    $currentValue;
            }

            
    /** @var \stdClass|Result|null $record */
            
    $record $dc->activeRecord;
            if(
    null === $record){
                return 
    '';
            }

            
    $category '';

            switch (
    $record->event) {
                
    // ...
            
    }

            return 
    $category;
        }

    Die Prüfung auf $currentValue nehme ich vor, damit die Werte beim Bearbeiten nicht wieder zurückgesetzt werden. Das führt aber leider dazu, dass der Wert nur bei der erstmaligen Auswahl meines Select-Feldes vorausgefüllt wird. Wenn ich dann ein anderen Select-Wert wähle, bleiben die alten Inhalte stehen.

    Mein Problem ist dabei vor allem, dass ich nicht herausfinden kann, ob es sich um einen neuen Datensatz handelt oder nicht. Denn sobald ich in der Listen-Ansicht auf "Neu" klicke, wird bereits eine ID vergeben und "act" in der URL ist "edit. Insofern hilft mir die Prüfung auf die ID nicht weiter. Gibt es eine Möglichkeit, im Callback zu Unterscheiden, ob der Eintrag gerade erstmalig angelegt wird oder der bestehende Eintrag geändert wird bzw. kann ich verhindern, dass beim Anklicken von "Neu" auch ohne explizite Speicherung eine ID vergeben wird (ich vermute mal, dass das schon alleine aufgrund von submitOnChange gar nicht anders möglich ist)

    Mein alternativer Ansatz wäre, den die Feld-Werte zu überschreiben, sobald sich der Wert des Select-Feldes ändert. Aber ist das mittels Callback möglich?

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

    Standard

    Ich denke dafür eignet sich der oncreate oder onsubmit Callback am besten.
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    30.04.2010.
    Beiträge
    27
    Partner-ID
    xenbyte

    Standard

    config.oncreate scheidet leider aus. Der Callback wird direkt nach dem Neu-Button ausgelöst, bevor eine Ausprägung im Select-Feld gewählt werden kann, vergibt eine ID und leitet dann quasi in den Edit-Modus weiter. Danach wird er nicht mehr erneut ausgelöst wird.

    config.onsubmit wäre zumindest nicht so einfach möglich, weil ich dort nur das DataContainer-Objekt mit dem gesamten Ergebnis erhalte und nicht unterscheiden kann, ob sich der Wert im Select-Feld geändert hat. Höchstes über die Historie.

    Aber beim Lesen/Testen bin ich auf config.onbeforesubmit gestoßen. Hier sind im array des ersten Parameters nur die geänderten Einträge enthalten, sodass ich damit gut feststellen kann, ob das Select-Feld geändert wurde. Klappt damit zwar leider erst ab Contao 5.0, aber für 4.13 habe ich damit zumindest die alten Callbacks als Fallback-Lösung, auch wenn dieser dann halt nur beim erstmaligen Wechsel getriggert wird.

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
  •