Ergebnis 1 bis 8 von 8

Thema: Contao 3 DCA Feld-Definition und dessen Default-Werte in der Datenbank

  1. #1
    Contao-Fan
    Registriert seit
    08.11.2011.
    Ort
    Frankfurt am Main
    Beiträge
    768
    User beschenken
    Wunschliste

    Standard Contao 3 DCA Feld-Definition und dessen Default-Werte in der Datenbank

    Hallo zusammen,

    ich benutze die Contao 3 RC 1 und entwickle gerade eine Erweiterung speziell für Contao 3. Ich benutze hier nicht mehr die SQL-Datei, sondern die neue Möglichkeit den entsprechenden Datenbank-Feldtyp direkt in der Felddefinition im DCA anzugeben.

    Das funktioniert auch alles einwandfrei, allerdings ist mir nachfolgendes Verhalten schleierhaft. Womöglich ist es Absicht oder ich bin gerade etwas zu verwirrt, allerdings erscheint es mir unlogisch. Daher würde ich mich freuen, wenn mir jemand weiterhelfen kann.

    Ich definiere z.B. folgendes Feld

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_content']['fields']['dk_cfsType'] = array
    (
          
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['dk_cfsType'],
          
    'default'            => 'dk_cfsStart',
          
    'inputType'            => 'radio',
         
    'options'            => array('dk_cfsStart''dk_cfsStop'),
          
    'reference'            => &$GLOBALS['TL_LANG']['tl_content'],
          
    'eval'                => array('submitOnChange'=>true),
        
    'sql'                => "varchar(16) NOT NULL default ''"
    ); 
    Im SQL wird definiert, daß der (Datenbank-)Default-Wert eine leere Zeichenkette sein soll. Als Default-Wert im Backend beim Anlegen eines Elements, soll dagegen der Radio-Button dk_cfsStart vorausgewählt werden.

    Erstelle ich nun ein beliebiges Content-Element, so findet sich in der Tabelle te_content in dessen Eintrag in der Spalte dk_cfsType der Wert dk_cfsStart, obwohl dieses Content-Element mit meinem nichts zu tun hat und ich als Default-Wert eine leere Zeichenkette angegeben habe.

    Gebe ich in einer Felddefinition kein 'default' an wird das Feld in der Datenbank so behandelt wie im 'sql'-Part angegeben.

    Es scheint, daß Contao 3 grundsätzlich bei vorhandenem 'default' dessen Wert in die Datenbank schreibt - selbst bei artfremden Elementen. Hier hätte ich erwartet, daß Contao 3 den Default-Wert aus der SQL-Definition benutzt. Denn wozu sollte in einem Bild-Element in der Spalte dk_cfsType etwas vorhanden sein?

    Das Verhalten ist auch nicht auf meine Erweiterung beschränkt. In der Spalte mootype steht z.B. immer der Wert start. Es sei denn es handelt sich um das Start-Element eines Accordeons. Dann findet sich dort mooStart.

    Neben den möglichen unschönen Seiteneffekten, falls jemand seine SQL-Abfragen nicht genau genug stellt, ist es doch unnütze Ressourcen-Verschwendung und macht die Daten in der DB nicht gerade übersichtlich...

    Da Bilder viel helfen habe ich eine Beispiel-Abfrage angehängt. Dort kann man sehr schön sehen, daß dk_cfsType immer gesetzt wird ('default' definiert) und dk_cfsJsTpl nur in dem Element gesetzt wird wo das Feld auch vorhanden ist ('default' nicht definiert).

    Womöglich mach ich die Pferde scheu oder ist es noch ein Bug, aber bevor ich ein Ticket schreibe wollte ich nachfragen, ob ich nicht etwas falsch verstanden habe (was gut möglich sein kann )

    Vielen dank schon mal an dieser Stelle...

    Edith sagt: Auf dem Bild wurde der Datensatz mit der ID 1 angelegt bevor ich die Erweiterung installiert habe. Daher sind die Werte dort nicht gesetzt.
    Angehängte Grafiken Angehängte Grafiken

  2. #2
    Contao-Fan
    Registriert seit
    22.11.2009.
    Ort
    14943 Luckenwalde
    Beiträge
    373

    Standard

    ich mach das soo wie im folgenden ....

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_content']['fields']['dk_cfsType'] = array 

          
    'label'                => &$GLOBALS['TL_LANG']['tl_content']['dk_cfsType'], 
          
    'inputType'            => 'radio'
         
    'options'            => array('dk_cfsStart''dk_cfsStop'), 
          
    'reference'            => &$GLOBALS['TL_LANG']['tl_content'], 
          
    'eval'                => array('submitOnChange'=>true), 
        
    'sql'                => "varchar(16) NOT NULL default 'dk_cfsStart'" 
    ); 
    Freundliche Grüße
    Jens


  3. #3
    Contao-Nutzer
    Registriert seit
    23.08.2012.
    Beiträge
    30

    Standard

    Sorry, vielleicht verstehe ich die Frage nicht richtig, aber was hättest Du denn gerne als Wert? Wenn Du einen Wert setzt, dann soll der doch auch in der Datenbank stehen, oder?

    Du gibst "dk_cfsStart" vor, und das steht in der DB. Wenn Du, gerade bei Radio Buttons, eben nicht mit 0 und 1 arbeitest, soll doch genau der Wert eingetragen sein. Oder verstehe ich die Frage nicht richtig? Welchen Sinn macht denn kein Eintrag in der DB?


    EDIT: Typisch, vorher wirklich zweimal gelesen, und jetzt nach dem Beitrag nochmal, jetzt wird's klarer! Da muss ich nochmal bei mir rein schauen.

    EDIT2: So, gerade nochmal ein bisschen probiert.

    Schwierige Frage, ich kann Deiner Argumentation schon folgen, im ersten Nachdenken wäre es auch meine gewesen. Andererseits ist dem entgegen zu halten, dass sobald ein Button eben selektiert ist, er auch seinen Wert in die DB schreiben sollte. In den meisten Fällen ist das ja auch ein durchaus gewünschtes Verhalten.

    Wie sollte man das auch umsetzen? In dem dargestellten Formular ist der Wert ja selektiert. Woher soll man denn wissen, wann der quasi gewünscht ausgewählt wurde?
    Geändert von Paddy0174 (16.09.2012 um 22:02 Uhr)

  4. #4
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.519
    User beschenken
    Wunschliste

    Standard

    Das ist doch ganz richtig so wie es sich verhält?

    Die SQL Default Definition gilt immer dann, wenn beim Insert dieses Feld nicht mit angegeben ist, dann nimmt MySQL das Default aus der Definition.
    (z.B. ein Feld was nicht im DCA Formular auftaucht)

    Das DCA Default ist in dem Augeblick gesetzt, wenn das Formular aufgerufen wird. Wird es dann gespeichert, auch wenn das Feld nicht angefasst wurde, wird dieser Default Wert in die DB geschrieben.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  5. #5
    Contao-Nutzer
    Registriert seit
    23.08.2012.
    Beiträge
    30

    Standard

    Dachte ich es doch. Das sieht mir jetzt aber doch ungewollt aus, denn das passiert auch bei Select Feldern...

    Folgendes Feld:
    Code:
    $GLOBALS['TL_DCA']['tl_module']['fields']['blub'] = array
    	(
    		'label'                 => &$GLOBALS['TL_LANG']['tl_module']['blub'],
    		'inputType'          => 'select',
    		'default'		=> '16',
    		'options'		=> array('8','16','24','32'),
    		'eval'			=> array('tl_class'=>'w50'),
    		'sql'                   => "varchar(2) NOT NULL default ''"
    	);
    Für meine Begriffe sollte das Feld solange leer bleiben, bis das entsprechende Modul auch angelegt wurde. Tut es aber leider nicht.

    Wenn ich diesen Eintrag in der tl_module DCA setze, wird der default Wert automatisch bei jedem neuen Modul eingetragen. Unabhängig welches das ist....

    Oder verstehe ich da die Logik falsch?

  6. #6
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.519
    User beschenken
    Wunschliste

    Standard

    Nein, Contao nimmt die Defaults aus dem DCA.
    Aber was stört dich daran?
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  7. #7
    Contao-Fan
    Registriert seit
    08.11.2011.
    Ort
    Frankfurt am Main
    Beiträge
    768
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von BugBuster Beitrag anzeigen
    Nein, Contao nimmt die Defaults aus dem DCA.
    Aber was stört dich daran?
    Hallo zusammen,

    bin aus meinem Urlaub zurück und habe gerade gesehen, daß sich hier doch noch etwas getan hat. Danke. =)

    Ich habe vor kurzem meine erste Erweiterung entwickelt und daher zum ersten Mal intensiv geschaut/erlebt was Contao wann/wo in der DB speichert. Dabei ist mir dieses Verhalten aufgefallen, was ich spontan als "merkwürdig" empfand und gerne den näheren Hintergrund dazu wissen wollte bzw. rausfinden wollte, ob das ein Fehler ist. Ich habe mich vermutlich etwas unglücklich ausgedrückt.

    - funktionell ist kein "Fehler" vorhanden und es geht mir auch weniger um mein Content-Element oder das Verständnis wie man ein Feld definiert/benutzt, sondern:

    - Ich definiere ein Feld in einem eigenen Content Element.
    - Diese Spalte wird der entsprechenden Tabelle hinzugefügt.
    - Habe ich einen Default-Wert im DCA angegeben wird dieser bei jedem neuen DB-Eintrag automatisch gesetzt (absolut korrekt) und zwar ebenfalls - und das ist der springende Punkt - auch bei anderen Content Elementen als dem, wo das Feld definiert wurde. Erwartet hätte/hatte ich, daß der DCA Default-Wert nur in dem Content Element gesetzt wird, wo das Feld definiert wurde und sonst den entsprechend im SQL-Part definierten SQL Default-Wert verwendet (wie z.B. ... default ''), wie das der Fall ist wenn kein DCA-Default-Wert definiert wurde.

    Wie gesagt ich fand es überraschend, daß da auch z.B. in Bild-Elementen meine Default-Werte zu finden waren, obwohl dieses Element mit den von mir definierten Feldern rein gar nichts zu tun hat und der Speicher dafür eigentlich unnütz verbraucht wird. Deshalb hab ich nachgefragt. Dachte es ist womöglich ein Contao 3 Fehler und evtl. noch keinem aufgefallen. Aber wenn das schon immer so war, dann soll mir das recht sein...

  8. #8
    Contao-Nutzer
    Registriert seit
    23.08.2012.
    Beiträge
    30

    Standard

    Den Beitrag von Dir hatte ich übersehen, BugBuster, sorry.

    Mir geht es sehr ähnlich wie Dirch. Ich hatte eben auch erwartet, dass "meine Felder" nur mit dem "default" Wert aus dem DCA gespeichert werden, wenn es sich um "meine Erweiterung" handelt.

    Ist jetzt auch nicht weiter schlimm, ich fand es eben auch "ungewöhnlich" (und hinterfragenswert).

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
  •