Bonsoir le Forum,

J'ai un petit soucis avec le helper Form et je pense même que la solution n'est pas compliquée...
Lorsque je crée un formulaire avec un champ date ou même directement avec

$this->Form->year('mon_champ',date('Y')-50,date('Y'))

j'ai un soucis au moment de poster le formulaire.
En effet, en étudiant les données envoyées (grâce à DebugKit) je me retrouve avec un array portant le nom mon_champ et dont le premier index est year avec la valeur que j'ai rentrée. Le soucis c'est que ça ne correspond pas à ma base et me génère une erreur (car c'est un array au lieu d'une date).

Pour info si je passe le champ en type text , tout fonctionne... mais je n'ai pas une liste déroulante et encadrée par des valeurs min et max...
Mon champ sql est de type date

D'avance merci pour votre aide.

9 réponses


pims64
Auteur
Réponse acceptée

Bonsoir tout le monde,

J'ai enfin réglé mon problème!!! La solution n'était pas vraiment dans la doc en ligne mais dans le CookBook!!

Le Helper Form utilise plusieurs suffixes de champ en interne pour la création de champ input datetime. Si
vous utilisez des champs nommés year, month, day, hour, minute, or meridian et rencontrez des
problèmes pour obtenir un input correct, vous pouvez définir le nom name de l’attribut pour remplacer le
behavior par défaut :
echo $this->Form->input(’Model.year’, array(
’type’ => ’text’,
’name’ => ’data[Model][year]’
));

Et donc la solution est bien dans la propriété "name"...
Par exemple, avec le code initial:

$this->Form->year("mon_champ",2000,date('Y'),array('label'=>'Année de Sortie'));
//Output:
<select name="data[Film][mon_champ][year]" label="Année de Sortie" id="FilmMonChampYear">

On voit bien que la sortie sera un array mon_champ avec un index 'year'... ce qui pose problème pour l'envoi à la base.
Du coup comme préconisé dans le CookBook, voici la solution:

echo $this->Form->year('release_date', date('Y')-50, date('Y'), array ('label'=>'Année de sortie', 'name'=>'data[Film][release_date]'));
//Output:
<select name="data[Film][release_date]" label="Année de sortie" id="FilmReleaseDateYear">

Et la magie opère... l'enregistrement en BDD se fait parfaitement...

Voilà, merci à tous ceux qui m'ont aidé :)

@ Bientôt!!

Pas de souci quand tu debug un array, c'est une fonction "automagique" de cake, il va reconstruire la bonne date. Cependant ta base attend un format de type date (année-mois-jour), du coup cake attend aussi un format de ce type. Alors qu'ici tu ne lui passe que l'année, il te manque le jour et le mois.

'mon_champ'=>array(
        'day'=> '01',
        'month'=>'01',
        'year'=>'2013'
    )

Du coup, soit tu rajoutes

$this->Form->month('mon_champ');
$this->Form->day('mon_champ');

Soit tu change seulement ton input

echo $this->Form->input('mon_champ', array(
        'dateFormat' => 'DMY',
        'minYear' => date('Y') - 50,
        'maxYear' => date('Y') ,
    ));
pims64
Auteur

Bonsoir et merci pour ta réponse amethyste.
J'ai manqué de détail dans mon explication car il se trouve que le champ de ma base n'est pas un champ date mais un champ year!
Donc normalement le

$this->Form->year()

convient parfaitement!!
Surtout qu'il me semble que sur la doc Cake, le retour d'une telle fonction est une string... donc je suis vraiment perdu...
Le but est de pouvoir rentrer une année de sortie pour un film, une série ou un album... l'année seule est nécessaire.
Je ne trouve pas de réponse, je peux tout à fait générer un champ mois et jour avec des valeurs par défaut mais bon... je trouve plus classe d'utiliser un champ year pour rentrer une année... :)

Ok, dans ce cas laisse un input par defaut et cake va gérer le reste

echo $this->Form->input('mon_champ', array('dateFormat' => 'Y','minYear' => 1900, 'maxYear' => date('Y')));
pims64
Auteur

C'était mon premier essai... le problème c'est que Cake me génère automatiquement un textarea et zappe complètement l'info maxYear et minYear o_O!!
Ce que je ne comprends pas c'est pourquoi il existe une méthode Form->year qui ne marche pas de manière évidente avec un champ YEAR de SQL!!

Si je ne trouve pas de réponse (même Google reste muet :)) je me résoudrais à imposer le type du champ à text...

Merci de ton aide en tout cas ;)

Petite suggestion à la con (je ne connais pas les champs de type date), mais on sait jamais.
Si tu ajoutes :

'type'=>'date','dateFormat'=>'Y'

ça marche ?

pims64
Auteur

J'avais également essayé... le même problème que pour la méthode year... c'est un tableau qui est retourné avec 'year' en premier index. Le message d'erreur:

SQL Query: INSERT INTO `breque`.`films` (`support_id`, `name`, `original_title`, `release_date`, `duration`, `synopsis`, `user_id`, `created`) VALUES (1, 'azdeaze', 'azeazeaz', Array, 110, 'zaeazeaz zaea zea ze aze azeaze aze azea ', 1, '2013-09-11 11:51:37')

On voit bien que le champ 'release_date' essaie d'être rempli par une valeur de type Array...

Merci pour ton aide ;)

Es-tu sûr que dans phpmyadmin ton champ est de type "YEAR" ? As-tu un helper qui passe dessus le FormHelper ?

pims64
Auteur

Oui oui je viens de vérifier et PhpMyAdmin et HeidiSQL me donne la même info, il s'agit bien d'un champ YEAR(4) soit une année sur 4 chiffres.
Je ne crois pas qu'un autre Helper passe dessus... il s'agit d'un basique formulaire pour ajouter des films dans ma base de données... rien de bien compliqué... je me suis d'ailleurs largement inspiré du TP de la formation de Grafikart pour créer le système, mais j'avoue que je débute avec Cake et malgré mes recherches et la doc, je n'arrive pas à régler mon souci...

Merci :)