Bonjour tout le monde, je viens de m’inscrire sur votre forum en raison d’un blocage avec un formulaire sur codeIgniter.

Voici donc le code dans mes fichiers vue et contrôleur que j’ai simplifié au maximum afin de vous le rendre plus clair :

<?php
// saisie_view.php
?>
<table>
    <tr>
<?php
    echo form_open('saisie/validation');
    foreach ($rubrique as $key => $value):
        extract($value);
?>
        <td><?php echo $key; ?></td>                    
<?php 
        $data = array('name' => 'saisie]' . $type . ']', 'value' => set_value('saisie]' . $type . ']', $valeur)); 
?>
        <td><?php echo form_input($data); ?></td>
        <td><?php echo $type; ?></td>                
<?php
        echo form_hidden('id]', $id);
    endforeach;
    echo form_submit('validation', 'Valider');
    echo form_close();
?>
    </tr>
</table>

<?php
// saisie.php    
public function validation()
{
    $this->form_validation->set_rules('saisie][texte]', 'valeur du champ', 'required|alpha_dash');
    $this->form_validation->set_rules('saisie][nombre]', 'valeur du champ', 'required|integer');
    if ($this->form_validation->run() == FALSE) {
        $this->load->view('saisie_view', $data);
    } else {
        $this->BDU->ajoutDonnees($this->input->post());
        $this->load->view('saisie_confirmation_view', $data);
    }
}

Dans un 1er temps, je récupère du contenu dans la base de données que j’affiche dans le formulaire, notamment des valeurs qui ont été préalablement saisies et qui doivent apparaitre dans des champs textes. Je mets aussi de côté dans des champs ‘hidden’ les identifiants associés à chacune de ces valeurs et que je veux pouvoir ensuite contrôler selon leur type, texte, nombre etc…

C’est là que le bas blesse, les règles de validation ne fonctionnent pas dans le contrôleur. Ça fonctionnait quand j’attribuais au ‘name’ des champs textes le tableau ‘saisie]’, mais avec un tableau multidimensionnel comme ‘saisie]' . $type . ']’ ou ‘saisie' . $type . ']]’, ça coince. Pourtant ça me permettrait de vérifier les valeurs par type mais j’ai dû faire une erreur concernant les paramètres des fonctions set_rules dans le contrôleur. A moins qu’il y ait une autre façon d’atteindre le même but. Je suis ouvert à toutes suggestions.

Ensuite, c'est simple, dans la partie modèle, les données quand elles existent sont mises à jour et dans le cas contraire insérées.

Voilà, c'est donc la vérification du formulaire avec l'utilisation d'un tableau multidimensionnel associé au name des champs texte qui pose problème.

Merci d'avance.

2 réponses


Tu te compliques drôlement la vie rien que sur la partie formulaire html.
Dans tes règles de validations tu déclares

$this->form_validation->set_rules('saisie][texte]...

or dedans tu ne met pas d'id, de clé dans ton array

saisie?][texte]...

L'objet de validation attends un tableau indexé ou associatif, mais là tu lui envois un format html sans id.
En tous les cas je ne comprends pas pourquoi tu t'embêtes à ce point avec du dynamique, je ne vois pas très bien alors que tu pourrais te facilité bien plus la vie.
N'oublie pas que dans codeigniter tu peux externaliser aussi tes règles de validation, au lieu d'ajouter des set_rules dans ton controller, tu peux envoyer un tableau de règle de validation lorsque tu instancies ta class validate form, étant donné qu'il attends un tableau, rien ne t'empêche de créer un fichier dans config/ que tu appellerais rules ou validateform.php et tu lui mets un tableau multidimensionnel.

Dans ton array saisie il faut que tu lui mettes un id dans ton tableau, car là php ne comprend pas ce que tu lui envoi, du moins aussi la class de règles de validations.
Pourquoi utilises-tu un array indexé alors que tu sembles avoir des clés nommés différentes ? Pourquoi tu ne fais pas un saisie'texte'] etc...
Enfin j'ai pas toutes les infos j'ai peut être manqué quelques choses.

artSeb
Auteur

J'ai trouvé la solution hier, le tableau multi me permet bien de contrôler les valeurs par type. L'utilisateur doit pouvoir saisir des chiffres ou du texte dans la série de champs texte.

J'utilise donc tout simplement un foreach pour gérer les set_rules. Les 2 dimensions du tableau sont renseignées. A l'origine, avec un tableau simple de type saisie], c'était pas la peine de faire une boucle et donc d'indexer le tableau. On pouvait mettre $this->form_validation->set_rules('saisie]', etc..) et ça marchait alors je suis parti sur une fausse piste

<?php  
// saisie_view.php
?>
<table>
    <tr>
<?php
    echo form_open('saisie/validation');
    foreach ($rubrique as $key => $value):
        extract($value);
        $saisie = 'saisie' .$type. ']' .$id. ']';
?>
        <td><?php echo echo form_label($key, $saisie); ?></td>                    
<?php 
        $data = array('name' => $saisie, 'value' => set_value($saisie, $valeur)); 
?>
        <td><?php echo form_input($data); ?></td>
        <td><?php echo $type; ?></td>                
<?php
        echo form_hidden('id]', $id);
    endforeach;
    echo form_submit('validation', 'Valider');
    echo form_close();
?>
    </tr>
</table>

<?php
// saisie.php    
public function validation()
{
    extract($this->input->post());
    foreach ($saisie as $type => $value) {
        switch ($type) {
            case 'nombre':
                foreach ($value as $ssi_id => $val) {
                    $this->form_validation->set_rules('saisie[nombre]' .$ssi_id. ']', 'valeur du champ', 'required|integer');
                }
                break;

            case 'texte':
                foreach ($value as $ssi_id => $val) {
                    $this->form_validation->set_rules('saisie[texte]' .$ssi_id. ']', 'valeur du champ', 'required|alpha_dash');
                }
                break;
        }            
    }

    if ($this->form_validation->run() == FALSE) {
        $this->load->view('saisie_view', $data);
    } else {
        $this->BDU->ajoutDonnees($this->input->post());
        $this->load->view('saisie_confirmation_view', $data);
    }
}

Je vais aussi étudier ta solution d'externaliser les règles de validation. Mais c'est à voir car je les utilise qu'une seule fois dans le projet. Merci de ta réponse.