Zum Inhalt springen

default =

Erstellt am 25. April 2006 · 7 Antworten · letzte Antwort am 27. April 2006

Tags: Frage

crimson ·

Hallo zusammen,

ich habe ein Problem mit einer TCA-Config einer Extension. Ich möchte eigentlich folgendes haben:

"feInterface" => $TCA["tx_meine_Extension"]["feInterface"], 
    "columns" => Array ( 
        "startdatum" => Array (         
            "exclude" => 1,        
            "label" => "LLL:EXT:Vorschau/locallang_db.php:tx_meine_Extension.startdatum",         
            "config" => Array ( 
                "type" => "input", 
                "size" => "8", 
                "max" => "20", 
                "eval" => "date", 
                "checkbox" => NULL, 
                "default" => NULL, 
            ) 
        ), 
    }

Leider klappt default => NULL und checkbox => NULL nicht. Er schreibt mir immer eine 0 in die DB wenn das Häkchen abgehakt wird oder der Inhalt des Feldes gelöscht wird. Ich brauche aber dringend ein NULL in der DB wegen der Sortierung.

Habt Ihr eine Idee?

Viele Grüße
der André

mithrandix ·

Schau mal in die ext_tables.sql, da steht höchst wahrscheinlich etwas im Stile von:

	startdatum int(11) unsigned DEFAULT '0' NOT NULL,
crimson ·
mithrandix schrieb

startdatum int(11) unsigned DEFAULT '0' NOT NULL,

Ach was wäre das schön wenn dem so wäre ;-) Nein meine Datenbankstruktur stimmt:

startdatum` int(11) default NULL,

Ich versuche mich gerade mit einem userfunc-Field aber das ist echt nicht ganz einfach...

crimson ·
steffenk schrieb

m.E. hängt das mit der eval-Funktion zusammen, die bei date entweder den Timestamp oder 0 liefert.

default und checkbox erwarten Strings, NULL ist aber kein String.

Was ist, wenn du eval, default und checkbox weglässt ?

Hallo Steffen,

gute Idee aber leider ohne Wirkung. Wenn ich default und checkbox weglasse, bringt es gar nichts aber die netten Javascript-Datumsfunktionen funktionieren noch. Wenn ich eval weglasse sind die auch weg und im Input-Feld wird die 0 angezeigt die in der DB steht.

Ich fürchte fast ich komme nicht um die userFunc drumherum. Ich poste sie wenn ich sie fertig habe.

Vielen Dank und viele Grüße
der André

crimson ·

also ich hab das mit einer usefunc mal probiert. War auch ne schöne Erfahrung, bringt aber rein gar nichts, denn all das ist nur für die Darstellung und das Verhalten im FE zuständig. Der Speichervorgang bleibt davon völlig unbeeindruckt. #angry#

Guckst Du:
die Felddefinition:

"startdatum" => Array (		
	"exclude" => 1,
	"label" => "LLL:EXT:Vorschau/locallang_db.php:tx_Vorschau_filme.startdatum",		"config" => Array (
	"type" => "user", 
	'userFunc' => 'user_class->user_DatetoNULL',
	)
),

die Userfunc (noch nicht bis ins Detail ausgefeilt bzw. optimiert aber funktioniert einigermaßen):

class user_class {

function user_DatetoNULL($PA, $fobj)    {
		// return t3lib_div::view_array($PA);
		
		$out = "
		<script language="Javascript" type="text/javascript">
		
		function initDatUM(){
			var formInhalt = document.editform.elements['".$PA['itemFormElName']."_hr'].value;
			switch (formInhalt.substr(2,1)){ 
				case \".\":
				var richtig = teil.replace('.', ',');
				document.editform.elements['".$PA['itemFormElName']."_hr'].value = richtig;
				break;
				case \",\":
				document.editform.elements['".$PA['itemFormElName']."_hr'].value = teil;
				break;
			 	default:
				var contentField = new Date(".($PA['itemFormElValue'] * 1000).");
				document.editform.elements['".$PA['itemFormElName']."_hr'].value = contentField.getDate()+'-'+contentField.getMonth()+'-'+contentField.getFullYear();
				break;
			
			}
			
		}
		
		function datumsfeld(){
		var formInhalt = document.editform.elements['".$PA['itemFormElName']."_hr'].value;
		switch(formInhalt.substr(2,1)){
		case '.':
		var datumarray = formInhalt.split('.');
		var meinDatum = new Date(datumarray[2],datumarray[1],datumarray[0],0,0,0);
		var meinTimestamp = meinDatum.getTime();
		
		  	document.editform.elements['".$PA['itemFormElName']."_hr'].value = datumarray[0]+'-'+datumarray[1]+'-'+datumarray[2];
		  	document.editform.elements['".$PA['itemFormElName']."'].value = meinTimestamp / 1000;
		break;
		case '-':
		var datumarray = formInhalt.split('-');
		var meinDatum = new Date(datumarray[2],datumarray[1],datumarray[0],0,0,0);
		var meinTimestamp = meinDatum.getTime();
		
		  	document.editform.elements['".$PA['itemFormElName']."_hr'].value = datumarray[0]+'-'+datumarray[1]+'-'+datumarray[2];
		  	document.editform.elements['".$PA['itemFormElName']."'].value = meinTimestamp / 1000;
		break;
		case '':
			document.editform.elements['".$PA['itemFormElName']."'].value = '';
		break;
		}
		
		}
		</script>
		";
		$out .= t3lib_div::view_array($PA).'<br /><br /><input name="'.$PA['itemFormElName'].'_hr" value="'.htmlspecialchars($PA['itemFormElValue']).'" onfocus="initDatUM();" onblur="datumsfeld();" />'; // '.$PA['onFocus'].'
		$out .= "<input type="hidden" name="".$PA[" itemformelname="" value="" />";
		return $out;
	}
}

gespeichert wird trotzdem eine 0 und kein NULL. An die Speichern-Routinen gehe ich aber eher nicht dran. Mal sehen, denn das wäre echt wichtig, dass das Feld mit NULL anstatt 0 befüllt wird. Die Sortierung für dieses Feld sieht folgendermaßen aus:

"default_sortby" => " ORDER BY nachvorn DESC, IFNULL(startdatum, bundesstart) ASC, filmtitel ASC ",

Was ohne das NULL leider nicht funktioniert. Habt Ihr eine andere Idee?

viele Grüße aus Kölle
der André

steffenk ·

warum nicht

"default_sortby" => " ORDER BY nachvorn DESC, IF(startdatum>0;bundesstart ASC;1), filmtitel ASC ",

? 😃

crimson ·
steffenk schrieb

"default_sortby" => " ORDER BY nachvorn DESC, IF(startdatum>0;bundesstart ASC;1), filmtitel ASC ",

Warum einfach, wenn es auch kompliziert geht! Danke Steffen, das ist der Hamertipp. Allerdings in leicht variierter Version:

"default_sortby" => " ORDER BY nachvorn DESC, IF(startdatum<>0, startdatum, bundesstart)  ASC, filmtitel ASC "

Das bringt mit sich, dass wenn startdatum gleich 0 oder startdatum gleich NULL ist, bundesstart verwendet wird andernfalls wird startdatum verwendet. Würde ich mysql ein wenig besser beherrschen, hätte ich mir gut zwei halbe Tage arbeit sparen können. #angry# #angry# #angry# Naja wieder mal viel über Typo3 gelernt, das ist auch einiges Wert...

Dankbare Grüße
der André