CakePHP - Calendrier et les dates en timestamp
Par foxmask le dimanche, juin 8 2008, 21:39 - Lien permanent
Bonsoir, voici un billet sur une de mes mésaventures avec CakePHP et le champ de formulaire type "date".
Pour un plugin Calendrier, j'ai besoin d'un sélecteur de dates, voici comme on l'obtient avec CakePHP :
echo $form->input('date',array('type'=>'date','label'=>false,'dateFormat'=>'DMY'));
ceci affichera donc 3 liste deroulantes "jour"-"mois"-"année".
Quand j'ajoute la donnée dans ma base, je recréé ma colonne date (dans ma methode "add") comme suit pour la transformer en timestamp :
$this->data ['Calendar'][ 'date' ] = mktime(0,0,0,$this->data['Calendar']['date']['month'].
$this->data['Calendar']['date']['day'],
$this->data['Calendar']['date']['year']);
Comme j'ai également besoin de modifier l'évènement de mon calendrier, je réutilise la même vue, et m'attends évidement à retrouver ma date (par exemple le 6 juin 2008). Mais Ô surprise, au lieu d'avoir la date voulue, j'obtiens une date du 1 janvier 2028...
Comment ce fait-ce ?
CakePHP nous fait un caprice ! Il ne "comprend" pas que ma colonne de ma table au format INTEGER contient un ENTIER et m'en fait une CHAINE ! (hic!)
Pour contourner cet avatar et l'aider à comprendre voici ce qu'il faut faire dans sa méthode edit :
public function edit ($id = null) {
[...]
if (empty($this->data)) {
$this->data = $this->Calendar->read(null, $id);
}
$this->data['Calendar']['date'] = (integer) $this->data['Calendar']['date'];
Comme on le voit, juste après le this->Calendar->read je force le typage du contenu de la valeur de ma array $this->data['Calendar']['date'] par (integer) $this->data['Calendar']['date']
et là ô miracle, le formulaire de modification de l'évènement affiche les 3 selecteurs jour/mois/année avec la date atendue
Ouf !!!!!!!
pour la petite histoire, "la faute" incombait à la ligne 1389 du helper form
extrait ligne 1385 - 1391 :
if (!empty($selected)) {
if (is_array($selected)) {
extract($selected);
} else {
if (is_int($selected)) {
$selected = strftime('%Y-%m-%d %H:%M:%S', $selected);
}
la condition if (is_int($selected)) n'est étrangement pas rencontrée avec sa colonne en timestamp tant qu'on ne lui force pas le typage comme je l'ai fait dans ma méthode edit...
Mais en bon renard que je suis, entêté et curieux, j'ai forcé l'obstacle 