2009-07-20 5 views
0

J'ai un tas de champs nom/email dans ma forme comme ceci:Faire partie d'un groupe de champs de formulaire similaires nécessaires dans CakePHP

data[Friend][0][name] 
data[Friend][1][name] 
data[Friend][2][name] 

etc.

et

data[Friend][0][email] 
data[Friend][1][email] 
data[Friend][2][email] 

etc.

J'ai une règle de validation personnalisée sur chacun qui vérifie si le champ correspondant est rempli. Ie. si les données [ami] [2] [nom] puis les données [ami] [2] [email] DOIVENT être remplies

Pour votre information, voici ce que l'une des deux règles ressemblent:.

Ma forme de validation règle: (j'ai une validation de courrier électronique aussi, mais c'est hors de propos ici)

'name' => array(
    'checkEmail' => array(
     'rule' => 'hasEmail', 
     'message' => 'You must fill in the name field', 
     'last' => true 
    ) 
) 

Mon code de règle personnalisée:

function hasEmail($data){ 
    $name = array_values($data); 
    $name = $name[0]; 
    if(strlen($name) == 0){ 
    return empty($this->data['Friend']['email']); 
    } 
    return true; 
} 

je dois faire en sorte que une des paires doit être rempli en un minimum. Cela peut être n'importe quand tant que les index correspondent.

Je n'arrive pas à trouver un moyen, comme si je définissais la règle de formulaire comme étant nécessaire ou que allowEmpty est faux, elle échoue sur TOUS les champs vides. Comment puis-je vérifier l'existence de 1 paire et si elle est présente, continuer?

De plus, j'ai besoin de supprimer tous les champs [Friend] vides restants, donc mon saveAll() n'enregistre pas un chargement de lignes vides, mais je pense pouvoir gérer cette partie en utilisant extract dans mon controller. Le problème principal est cette validation. Merci.

Répondre

1

j'aurais un regard sur le rappel Model::beforeValidate (API). L'utilisation de ce rappel pour afficher les informations de débogage devrait vous aider à déterminer le nombre de fois qu'il se déclenche et quelles données sont disponibles pour le modèle à chaque appel. Avec cette information, vous pouvez alors créer un indicateur lorsque vous trouvez votre première paire correspondante, et altérer le tableau Model :: validates ou le tableau Model :: data pour contourner les tentatives de validation suivantes.

Quant à votre dernier point, vous pourrez peut-être utiliser Set::filter pour enlever facilement les champs vides de votre ensemble de données.

Questions connexes