Empfehlungen: Erweiterte Suche

dt. Datum in SQL format umwandeln

Daten auslesen, verarbeiten und den Views übergeben

dt. Datum in SQL format umwandeln

Beitragvon jefre » Do 13. Aug 2009, 12:59

Hallo,
ich habe in der View meinen datepicker auf ein deutsches Format eingestellt. Wenn ich das Formular speichern möchte, muss ich das dt. Datum in y-m-d umwandeln. Gibt es eine elegante Möglichkeit von cake? Sonst müsste ich jedesmal aus dem data Array das Datum von Hand umwandeln.
Grüße
Jefre
jefre
 
Beiträge: 5
Registriert: Do 13. Aug 2009, 12:09

Re: dt. Datum in SQL format umwandeln

Beitragvon mbrod » Do 13. Aug 2009, 16:31

Ich glaube, in cakephp direkt gibt es so eine Funktion nicht. Die Einbindung eines Datepickers ist unter http://bakery.cakephp.org/articles/view/using-the-unobtrusive-date-picker-widget-in-cakephp beschrieben. Habe das aber bisher noch nicht nachvollzogen.

Irgendwann möchte ich meinen eigenen Datepicker in cakephp verwenden, bin aber noch mit anderen Dingen beschäftigt, die ich erst mal in cakephp kapieren muss.

Welchen Datepicker verwendest Du, und wie hast Du ihn in die View integriert, damit nicht die ganzen Select-Boxen erscheinen?
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: dt. Datum in SQL format umwandeln

Beitragvon dth33 » Do 13. Aug 2009, 16:48

hi,

das geht.

mal ein Ausschnitt aus meinem Quelltext.............

'lieferdatum' => date('Y-m-d', strtotime($this->data['Delivery']['sucheNachLieferdatum']))


Dei beiden Funktionen heißen also: date und strtotime

Grüße
dth33
 
Beiträge: 33
Registriert: Do 22. Jan 2009, 15:38
Wohnort: Am schönen Niederrhein
CakePHP-Version: 1.3
OS: Win32

Re: dt. Datum in SQL format umwandeln

Beitragvon jefre » Do 13. Aug 2009, 16:50

Eigentlich wollte ich ja, dass man mir hilft ;-))
Aber das Einbinden von einem datepicker ist easy. Ich habe auch den aus der Beschreibung genommen. Und dann muss man die JS Dateien in das Verzeichnis js und die Bilder in das Verzeichnis img kopieren (die Bilder liegen dann im Verz. img/datepicker)
Dann braucht man noch das JQuery UI (link weiss ich grad nicht)
in der View steht oben:
Code: Alles auswählen

<?php
$html->css('ui-lightness/jquery-ui-1.7.2.custom', null, null, false);
$javascript->link(array('jquery-1.3.2.min', 'jquery-ui-1.7.2.custom.min'), false);
?>
<script type='text/javascript'>

    $(function() {
        $('#EarningDate').datepicker({dateFormat: 'dd.mm.yy'});
        $('#EarningRecieved').datepicker({dateFormat: 'dd.mm.yy'});
    });
</script>

und in der Form:
Code: Alles auswählen

echo $form->input('date', array('label' => 'Datum', 'type' =>'text', 'class' => 'datepicker'));
echo $form->input('recieved', array('label' => 'Eingang', 'type' =>'text', 'class' => 'datepicker'));
 
jefre
 
Beiträge: 5
Registriert: Do 13. Aug 2009, 12:09

Re: dt. Datum in SQL format umwandeln

Beitragvon mbrod » Sa 15. Aug 2009, 20:43

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
<?php
class 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?
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: dt. Datum in SQL format umwandeln

Beitragvon dth33 » Sa 15. Aug 2009, 23:18

Also man kann es auch umständlich machen.......Soviel Aufwand wegen Nichts

Das geht auch in einer Zeile.

umwandlung = date('Y-m-d', strtotime($this->data['xvz']['abc']))


Das passiert im Controller. Vielleicht könnte man sowas auch in beforeSave (Modell) packen. Auf die Probleme (Jahr: 1970) von strtotime wurde freilich schon hingewiesen. Leider meldet sich der Fragesteller nicht mehr, sonst könnte man ihn fragen, was er eigentlich nun konkret machen möchte und ob es Sinn macht hier weiter an seiner Antwort zu basteln.
dth33
 
Beiträge: 33
Registriert: Do 22. Jan 2009, 15:38
Wohnort: Am schönen Niederrhein
CakePHP-Version: 1.3
OS: Win32

Re: dt. Datum in SQL format umwandeln

Beitragvon mbrod » So 16. Aug 2009, 08:40

Um die Methode von dth33 zu nutzen, muss die entsprechende Umkehrfunktion im View benutzt werden:
Code: Alles auswählen
$value=date('d.m.Y', strtotime($this->data['Model']['datum']));
echo $form->input('datum', array('label' => 'Datum', 'type' =>'text', 'class' => 'datepicker', 'value'=>$value));

Der auf deutsch eingestellte Datepicker erwartet das so. Und die Benutzer wohl auch.
Die Unsicherheit bleibt, was Daten vor 1970 angeht. Auf meinem System war das frühste gültige Datum der 15.12.1901.

Da ich noch schwer am Lernen bin was cakephp angeht, wollte ich meine frischen Erfahrungen einfach mal im Forum zurückgeben. Der nächste Lernende kann vielleicht etwas damit anfangen. Auch wenn es vielleicht umständlich erscheint.
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: dt. Datum in SQL format umwandeln

Beitragvon jefre » So 16. Aug 2009, 08:44

Der Fragesteller meldet sich nicht mehr, weil er keine Mails mehr bekommen hat. Ich wusste gar nicht, dass die Diskussion weitergeht.

Naja, es ist so, dass in der DB 2009-08-16 stehen soll und in den views 16.08.2009.
Das Anzeigen in der add view ist ja eigentlich kein Problem:
Code: Alles auswählen
$('#ModelFeldname').datepicker({dateFormat: 'dd.mm.yy'});

denn dem datepicker kann ich das Format mitgeben. In der index view auch nicht, denn dafür habe ich den time Helper
Code: Alles auswählen

echo $time->format('d.m.Y',$foo['Model']['feldname']);

Im controller muss man dann vor dem
Code: Alles auswählen
->save
noch das Datum umwandeln:
Code: Alles auswählen
$this->data['Model']['feldname'] = date('Y-m-d', strtotime($this->data['Model']['feldname']));

um es für die Datenbank nutzen zu können. Ich hatte allerdings gehofft, dass es dafür eine elegantere Methode geben würde.
Jetzt wird bei mir noch das falsche Format in der edit view angezeigt: 2009-08-16
jefre
 
Beiträge: 5
Registriert: Do 13. Aug 2009, 12:09

Re: dt. Datum in SQL format umwandeln

Beitragvon dth33 » So 16. Aug 2009, 12:59

Hi,

für die EditView kann man das Datum ebenfalls formatiert ausgeben lassen.

Code: Alles auswählen

echo $form->input('Model.Field', array('dateFormat' => 'DMY'));
 
dth33
 
Beiträge: 33
Registriert: Do 22. Jan 2009, 15:38
Wohnort: Am schönen Niederrhein
CakePHP-Version: 1.3
OS: Win32

Re: dt. Datum in SQL format umwandeln

Beitragvon jefre » Mo 17. Aug 2009, 08:13

Code: Alles auswählen
'dateFormat' => 'DMY'


bei mir tut sich da leider nichts.
jefre
 
Beiträge: 5
Registriert: Do 13. Aug 2009, 12:09

Nächste

Zurück zu Controller

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast