2010-10-10 3 views
2

Salutations,CakePHP Date de validation en utilisant le format de date tableau

À mon avis, j'ai une entrée de date, définissez comme ceci:

echo $form->input('cc_expdate', array('label' => __('exp. date', true), 
     'type' => 'date', 'dateFormat' => 'MY', 'default' => date('Y'), 
     'minYear' => date('Y'), 'maxYear' => date('Y', strtotime("+10 years")), 
     'orderYear' => 'asc', 'separator' => ' ', 'monthNames' => false)); 

Et dans mon modèle, j'ai une règle de validation, à savoir:

'cc_expdate' => array(
    'rule' => array('date', 'my'), 
'message' => 'Please select a valid expiration date' 
) 

Mais la validation échoue toujours. Quand je regarde $this->data, je vois que la date est passée à travers le formulaire comme un tableau (par exemple 'cc_expdate' => array('month' => '10', 'year' => '2010')) mais il semble que la règle de validation de date attend une chaîne comme 10-2010. J'ai chassé autour de Cake et vérifié la documentation, mais je n'ai rien trouvé qui couvre ça. Il semble que cela devrait être une tâche simple à gérer, est-ce que je manque quelque chose de simple ou est-ce que Cake n'a pas de validation intégrée pour les éléments de formulaire 'date'?

acclamations,
-Bri

+0

La classe 'model' a une [méthode' déconstruire() '] (http: //api13.cakephp .org/view_source/model/# line-849) dont le travail consiste à reconstituer les tableaux de dates créés par l'assistant 'Form' en une valeur scalaire. Dans mon expérience, cette "reconstruction" (IMO, la sémantique du nom de la méthode est contre-intuitive) arrive _before_ la valeur est passée en validation. Je ne vois rien de mal dans votre extrait. –

+0

@Rob Merci d'avoir signalé cela. Je vais jeter un coup d'oeil à la classe 'Model' pour voir si je peux savoir où se trouve le foobar.Pour l'instant j'ai ajouté du code à mon contrôleur qui scalarise le tableau de date dans une nouvelle clé ('$ this-> data ['Model'] ['cc_expdate2']') et ajouté une règle de validation personnalisée à mon modèle qui vérifie la valeur. (divers aspects de Cake et de ses formats de données attendus m'empêchent de le faire uniquement dans le contrôleur ou le modèle) – Soulriser

+0

J'ai posé une question similaire il y a quelques semaines. Je suis surpris que la validation de la date nécessite un code supplémentaire à effectuer. peut-être qu'ils vont affiner cela pour le gâteau 2.0. – the0ther

Répondre

0

J'ai eu le même problème dans une méthode du contrôleur récemment où je tentais de sauver une valeur de mois/an dans un champ de date MySQL et validation gardé défaut. J'utilisais mon/MY dans le modèle/vue pour les paramètres de date et il passait l'année et le mois comme prévu pour $ this-> données quand je l'ai vérifié dans le contrôleur. Ce que j'ai fait était de mettre la clé de jour à "1" dans le tableau de date passé du formulaire avant la validation dans le contrôleur, puis la validation a fonctionné. Cela a eu comme conséquence que toutes mes dates mois/année étaient stockées comme le 1er du mois, ce qui était bien pour mon application. Je suis encore nouveau sur CakePHP, donc cela peut être considéré comme un hack, je ne suis pas sûr. Mon champ de date dans la base de données était un champ de date MySQL, je me demandais si la validation échouait pour une raison quelconque car le jour manquait (peut-être que l'utilisation de varchar sauverait le mois/année sous forme de chaîne?).

+0

J'ai essayé cette suggestion, mais la validation échouerait. Je suis allé de l'avant et ai traversé le code dans 'validation.php' et' model.php' et ai trouvé que les valeurs de date commencent comme un tableau et sont converties en une chaîne safe mysql dans 'model.php'. Bien sûr, ce format est AAAA-MM-JJ, qui échoue lorsqu'il est passé à la règle de validation "mon". Changer la règle de validation en "ymd" valide correctement. Cela semble plutôt stupide; C'est comme si la règle de date avec autre chose que "ymd" était réservée aux chaînes, à moins que vous ne convertissiez vos tableaux de dates vous-même ou n'utilisiez une règle personnalisée. – Soulriser

+0

Et merci pour le conseil, cela m'évite d'avoir à convertir mon champ db en varchar. – Soulriser

-1

Si vous utilisez les champs mois et forment l'année gâteau, pour que la validation pour fonctionner correctement, vous devez utiliser la notation suivante:

au lieu de .... « COLUMN_NAME » pour vos règles, utilisez ' column_name.month 'et column_name.year.

1

La meilleure solution/hack consiste à ajouter un champ caché supplémentaire représentant le jour. Dans ce cas, vous allez envoyer votre formulaire comme Cake s'attend à être: array ('day' => 1, 'month' => 12, 'year' => 1980) et maintenant vous avez une date de validation normale dans votre modèle et aucun problème d'enregistrement d'une valeur de date corrompue dans votre base de données.

Exemple:

Vue:

<?php echo $this->Form->input('YourModel.cc_expdate.day', array('type' => 'hidden', 'value' => 1));  
echo $this->Form->input('cc_expdate', array('label' => __('exp. date'), 
      'type' => 'date', 'dateFormat' => 'MY', 'empty' => true, 
      'minYear' => date('Y'), 'maxYear' => date('Y') + 10, 
      'orderYear' => 'asc', 'separator' => '&nbsp;', 'monthNames' => false)); 
?> 

Modèle:

'cc_expdate' => array(
      'date' => array(
       'rule' => array('date'), 
       'message' => 'Invalid date', 
       //'allowEmpty' => false, 
       //'required' => false, 
       //'last' => false, // Stop validation after this rule 
       //'on' => 'create', // Limit validation to 'create' or 'update' operations 
      ), 
     ),