2010-04-15 3 views
0

J'ai un petit problème.Comment structurer une application Kohana MVC avec des champs ajoutés dynamiquement et fournir une validation et des commentaires

J'ai une application Kohana qui a dynamiquement ajouté des champs.

Les champs ajoutés sont appelés numéros DISA.

Dans le modèle, je regarde ceci et le résultat est retourné sous la forme d'un tableau. Je code le tableau dans une chaîne JSON et j'utilise JQuery pour les remplir La vue connaît la longueur du tableau et crée donc autant d'éléments DISA que nécessaire avant l'affichage. Voir le code ci-dessous pour un résumé de comment cela fonctionne.

Ce que je trouve est que cela commence à être difficile à gérer. Le code devient en désordre. La gestion des erreurs de ce type de contenu dynamique finit par être réparties un peu partout. Non seulement ça, ça ne marche pas comme je le veux. Ce que vous voyez ici est juste un petit extrait de code.

Pour la gestion des erreurs, j'utilise la bibliothèque de validation. J'ai commencé en utilisant add_rules sur tous les champs qui reviennent dans le post. Comme ce sont toujours des numéros de téléphone, je règle une règle requise (quand elle est là) et une règle de chiffres sur les clés de validation-> as_array(). Ça marche. La difficulté est en fait le rendre à la vue. c'est-à-dire un champ javascript dynamiquement ajouté. Soumet de nouveau au formulaire. Enregistrer le contenu dans une session View doit charger les champs de la base de données + ceux du post précédent et signaler les champs qui ont des problèmes. Tout est assez compliqué et je reçois ce code à travers la vue du contrôleur et du modèle.

Donc ma question est. Avez-vous déjà fait cela à Kohana et comment l'avez-vous géré? Il doit y avoir un moyen plus facile non?

Extrait de code.

- edit.php -

public function phone($id){ 
    ... 
    $this->template->content->disa_numbers = 
      $phones->fetch_disa_numbers($this->account, $id); 
    ... 
} 

- phones.php -

public function fetch_disa_numbers($account, $id) 
{ 
    $query = $this->db->query("SELECT id, cid_in FROM disa WHERE owner_ext=?", array($id)); 

    if (!$query){ 
     return ''; 
    } 

    return $query; 
} 

- edit_phones.php ---

<script type="text/javascript"> 
var disaId = 1; 

function delDisaNumber(element){ 
    /* Put 'X_' on the front of the element name to mark this for deletion */ 
    $(element).prev().attr('name', 'X_'+$(element).prev().attr('name')); 
    $(element).parent().hide(); 
} 

function addDisaNumber(){ 
    /* input name is prepended with 'N_' which means new */ 
    $("#disa_numbers").append("<li><input name='N_disa"+disaId+"' id='disa'"+ 
    "type='text'/><a class='hide' onClick='delDisaNumber(this)'></a></li>"); 
    disaId++; 
} 
</script> 

... 


<php 
    echo form::open("edit/saveDisaNumbers/".$phone, array("class"=>"section", "id"=>"disa_form")); 
    echo form::open_fieldset(array("class"=>"balanced-grid")); 
?> 
     <ul class="fields" id="disa_numbers"> 
     <?php 
     $disaId = 1; 
     foreach ($disa_numbers as $disa_number){ 
      echo '<li>'; 
      echo form::input('disa'.$disaId, $disa_number->cid_in); 
      echo'<a class="hide" onclick="delDisaNumber(this)"></a>'; 
      echo "</li>"; 
      $disaId++; 
     } 
     ?> 

     </ul> 
     <button type="button"onclick="addDisaNumber()"><a class="add"></a>Add number</button> 

     <?php 
     echo form::submit('submit', 'Save'); 
     echo form::close(); 
     ?> 

EDIT: Je J'ai trouvé un plugin de validation de formulaire en ligne qui est idéal pour cela. Le lien est ici. http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/

Jusqu'ici tout va bien.

EDIT2: Ok, le validateur en ligne fonctionne très bien. Ce que j'ai décidé de faire est de mettre la validation de base dans le modèle avant qu'il ne soit soumis à la base de données. Cela évite que quelque chose de mauvais ne parvienne à la base de données. Mais j'utilise le validateur de formulaire pour fournir un retour instantané.

Répondre

0

J'ai déjà construit quelque chose de similaire.

Ce que j'ai fait est de développer une classe Validation_lib, qui est une classe construite au-dessus de Kohana Validation.

Il est quelque chose de similaire comme:

class Validation_lib { 
    static private $instance = NULL; 

    private function __construct() 
    { 
     // Can overload Configs here 
    } 

    public static function instance() 
    { 
     if (self::$instance === NULL) 
     { 
      self::$instance = new self; 
     } 

     return self::$instance; 
    } 

    public function validate_dynamic($post) 
    { 
     $validate = new Validation($post); 

     foreach ($post as $dynamic_key => $value) 
     { 
      switch ($dynamic_key) 
      { 
       // Do switch + regex matching for your $post['dynamic_name'] 
       // You can have maybe prepended 'phone_' for field of phone type 
       // You can have maybe prepended 'mail_' for field of mail type.. 
       case (//regex match mailhere): 
        $validate->add_rules($key ,'required', valid::Email); 
        break; 
      } 
     } 
    } 
} 

Hope this helps :)