jefre hat geschrieben:Eigentlich wollte ich ja, dass man mir hilft
Also, habe mich jetzt mal mit dem Problem auseinandergesetzt und dabei wieder einiges über cakephp gelernt.
Daher noch mal der Ansatz: Die select-Boxen wird man los, indem man 'type' =>'text' setzt, wie schon von jefre erwähnt:
jefre hat geschrieben:- Code: Alles auswählen
echo $form->input('date', array('label' => 'Datum', 'type' =>'text', 'class' => 'datepicker'));
Die View liefert dann das Datum im Format 'yy-mm-dd' aus. Wir brauchen aber 'dd.mm.yy'. Das erwartet ja auch der Datepicker. Dies kann man mit einer selbst geschriebenen Helper-Funktion erledigen:
- Code: Alles auswählen
<?phpclass convertdateHelper
extends AppHelper
{ function toDe
($dateYMD) { $ar=explode('-',$dateYMD); $ret=$this->output($ar[2].'.'.$ar[1].'.'.$ar[0]); return $ret; }}?>
Dabei machte ich die unangenehme Erfahrung, dass cakephp offensichtlich keine Helper Dateien mit underscore im Dateinamen mag. Eigentlich wollte ich mich ja an die Konvention bei zusammengesetzten Begriffen halten, also convertDate und die Helper Datei dann eben convert_date.php nennen. Auch alle Core-Helper haben keinen Unterstrich im Dateinamen. Nun, dann eben in einem Wort!
Warum ich nicht date() und strtotime() nehme: siehe Diskussion
strftime() anstatt date() hier im Forum.
Im Controller muss der neue Helper natürlich bekannt gemacht werden, und im View folgendes hinzugefügt werden:
- Code: Alles auswählen
$value=$convertdate->toDe($this->data['Model']['datum']);echo $form->input('datum', array('label' => 'Datum', 'type' =>'text', 'class' => 'datepicker', 'value'=>$value));
Nun sollte das Datum schön deutsch im Input-Feld zu sehen sein. Die Funktion kann man natürlich genauso für die Übersichtstabelle (index) benutzen.
Nach dem Abschicken des Formulars muss nun wieder nach 'yy-mm-dd' gewandelt werden. Dafür folgende (Umkehr)-Funktion schreiben:
- Code: Alles auswählen
function fromDe
($dateDMY) { $ar=explode('.',$dateDMY); return $ar[2].'-'.$ar[1].'-'.$ar[0]; }
Diese Umkehrfunktion wollte ich eigentlich auch im convertdateHelper ablegen. Da ich aber noch nicht kapiert habe, wie man aus dem Controller heraus auf Helper-Funktionen zugreifen kann, (das ist ja wohl von der "cake-Logik" so auch nicht gedacht) habe ich die Funktion im Model untergebracht. Im Controller dann die Funktion vor dem save-Befehl aufrufen:
- Code: Alles auswählen
$this->data['Model']['datum']=$this-> Model->fromDe($this->data['Model']['datum']);
if ($this-> Model->save($this->data)) {...
...
Die Validierung geschieht im Model:
- Code: Alles auswählen
var $validate=array( 'datum'=>array
( 'rule'=>array
('date','ymd'), 'message'=>'invalid date' ));
So, ich hoffe ich habe nichts vergessen. Jedenfalls funktioniert das bei mir so erst mal.
Ist es aber wirklich eine gute Lösung so vorzugehen?
Ich glaube es ist eher ein Workaround. Denn soweit ich das "Cake-Prinzip" verstanden habe, sollte man Lösungen an den richtigen Stellen implementieren. Helper sind für die Anzeigenlogik zuständig und Funktionen im Model für die Geschäftslogik. Die Controller stellen den Benutzern die Funktionen über den URL zur Verfügung. Wo aber gehört das Problem der Formatierung von Datum und Zahlen eigentlich hin? Es ist doch wohl eine Sache der Lokalisierung, welches quasi "hinter" den Modelen steht. Ich vermute, dass die "wahre" Lösung in den Klassen i18n und l10n implementiert werden müsste. Dann würde sich nämlich durch Umschalten auf eine andere Sprache die Anzeige und Verarbeitung von Zahlen und Datum entsprechend ändern.
Oder gibt's da andere Erkenntnisse?