2010-07-09 18 views
0

Je vais essayer d'être aussi clair que possible.Accéder aux données dans la validation kohana

Je travaille sur une validation de forme en utilisant le merveilleux framework kohana. Cependant, je suis venu à la croisée des chemins et je ne sais pas si la façon dont j'ai pris est un choix judicieux. Fondamentalement, j'ai un sélecteur de date en utilisant plusieurs boîtes de sélection (je ai joué avec l'idée d'utiliser les sélecteurs de date javascript mais les boîtes de sélection se sont révélés plus appropriés pour mon but) et un champ de date dans une base de données. J'ai voulu concaténer ces boîtes de sélection dans le champ de date afin qu'il puisse être vérifié pour s'assurer qu'il est valide.

protected $_rules = array(
    'mydate'  => array(
     'not_empty'  => NULL, 
     'date'   => NULL, 
    ), 
); 

Maintenant, pour moi, il est logique d'inclure la validation dans le modèle, puisque c'est où la couche de données est dans le modèle MVC, alors j'ai décidé de créer des attributs de classe nommée _rules $, $ _filters et $ _callbacks, chacun défini comme protégé et avec mes règles de base appliquées. Et puis une fonction dans le modèle qui configure un objet de validation en utilisant ces attributs et le renvoie à n'importe quel contrôleur l'appelle, alors le contrôleur peut simplement exécuter la validation et le travail est terminé. Mon problème vient quand je veux concatuer ces boîtes de sélection, pour moi, il est plus logique de faire un filtre personnalisé et passer dans les données de publication, mais avec les règles de filtrage et les callbacks étant des attributs, je ne peux pas ajouter de variables à eux. Ma solution actuelle est d'ajouter manuellement le filtre supplémentaire lorsque la fonction de configuration de validation est en cours d'exécution quelque chose de similaire à ceci:

public function setupValid($post) { 
    $this->_filters['mydatefield'] = array(
     'MyClass::MyConcat' => array($post); 
    ); 

    //creates a validation object and adds all the filters rules and callbacks 
} 

Mais je ne pense pas que ce soit la solution la plus propre, je suis probablement nit picking la solution fonctionne comme je le souhaite. Cependant, je ne suis pas sûr si un filtre a jamais été prévu pour faire une telle chose, ou si cela devrait être un rappel car le rappel a accès au tableau par défaut, mais là encore les rappels sont appelés en dernier, ce qui signifierait que je ne pouvait pas appliquer de règles comme, 'not_empty' (pas important dans ce cas car ils sont pré-remplis, mais peut-être dans un autre cas)

Donc je suppose que ma question est, est-ce que j'utilise les filtres comme ils étaient destiné à être utilisé?

J'espère avoir réussi à expliquer cela clairement.

Merci

Répondre

2

vous devez garder à l'esprit que vous ne devez valider les champs à l'intérieur des _rules de $ qui sont très importants à votre base de données ou la logique métier. Ainsi, par exemple, si vous essayez d'installer un autre formulaire ailleurs dans votre application ou que vous fournissiez une API adaptée à votre application, la validation du champ 'day_field_(that_doesnt_exists_in_the_database_and_is_used_to_privide_a_better_ux_in_this_one_form)' => array('not_empty' => NULL) vous rendra la tâche difficile.

donc je vous conseille de garder vos _rules de $ comme ils sont maintenant et de fournir une certaine logique à votre méthode des valeurs():

// MODEL: 
public function values($values) 
{ 
    if (! empty($values['day']) && ! empty($values['month']) && ! empty($values['year'])) 
    { 
     $values['mydate'] = $values['year'].'-'.$values['month'].'-'.$values['day']; 
    } 

    return parent::values($values); 
} 


// CONTROLLER: 
if ($orm->values($form['form_array'])->check()) 
{ 
    $orm->save(); 
} 
else 
{ 
    $this->template->errors = $orm->validate()->errors('validation'); 
} 
+0

Genius! Oui, c'est ce que j'ai commencé à penser hier soir après avoir posté ma question. Je suis juste en train d'essayer à peu près ce que vous avez décrit, dans mes valeurs à la recherche de clés contenant * _day * _month * _year, puis en prenant * (serait un mot dans le cas des tableaux que je l'utilise comme joker ici). Ça va me demander d'adhérer à une convention de nommage avec mes formulaires, mais ça vaut le coup pour le gain de temps plus tard. Merci pour le réconfort :) – studioromeo