7
votes

CDÉDIDEIDE - FORMULAIRE DE REPLOPULATION SUR LA VALIDATION ÉCHELLE APRÈS LE SOUMISSION

J'ai une forme qui oblige l'utilisateur à entrer certaines informations. S'ils ne parviennent pas à remplir les champs requis, ils sont présentés avec le formulaire; le haut de la page les notifiant quels champs sont requis et j'ai activé des formulaires collants (Set_Value ()) afin que leur entrée n'est pas perdue.

J'utilise FlashData pour afficher des messages à l'utilisateur (c'est-à-dire si ce qu'ils 'VE entré existe déjà dans la base de données). P>

Mon formulaire est dans la méthode d'index de mon contrôleur. Lorsque la soumission est cliquée à partir de ma vue, il appelle la méthode add () dans mon contrôleur. La méthode ADD () effectue la validation et, en fonction des résultats soumet la base de données ou des coups de pied à l'utilisateur pour obtenir plus de données. P>

J'ai plusieurs problèmes avec la façon dont j'ai fait cela . 1. Si la validation échoue, j'utilise $ ceci-> index () pour revenir à mon formulaire et afficher les erreurs de validation. Si j'essaie d'utiliser Redirect, je perds mes erreurs de validation et mes données $ _Post [] de sorte que mes formes collantes se retrouvent en blanc. 2. Utiliser $ ceci-> index () ajoute à la fin de mon URL 3. Utiliser $ ceci-> index () provoque des problèmes avec les flashdata. Résultats aléatoires. P>

Des idées? P>

<?php
class Restaurant extends Controller {

    function Restaurant() {
        parent::Controller();
    }

    function index() {

        // Load libraries and models
        $this->load->model('/restaurant/mRestaurantTypes');
        $this->load->model('/restaurant/mRestaurant');
        $this->load->model('/utilities/mUtilities');

        // Get states
        $stateSelect = array();
        $getStates = $this->mUtilities->getStates();

        if($getStates->num_rows() > 0) {
            foreach($getStates->result() as $row) {
                $stateSelect[$row->abbr] = $row->name;
            }
        }


        // Get restaurant types
        $restaurantTypes = array();
        $getRestaurantTypes = $this->mRestaurantTypes->getRestaurantTypes();

        if($getRestaurantTypes->num_rows() > 0) {
            foreach($getRestaurantTypes->result() as $row) {
                $restaurantTypes[$row->restaurant_types_id] = $row->type;
            }
        }

        // Create form elements
        $data['name'] = array(
            'name'      =>  'name',
            'id'        =>  'name',
            'value'     =>  set_value('name'),
            'maxlength' =>  '200',
            'size'      =>  '50'
        );

        $data['address'] = array(
            'name'      =>  'address',
            'id'        =>  'address',
            'value'     =>  set_value('address'),
            'maxlength' =>  '200',
            'size'      =>  '50'
        );

        $data['city'] = array(
            'name'      =>  'city',
            'id'        =>  'city',
            'value'     =>  set_value('city'),
            'maxlength' =>  '50',
            'size'      =>  '25'        
        );

        $data['state'] = $stateSelect;

        $data['zip'] = array(
            'name'      =>  'zip',
            'id'        =>  'zip',
            'value'     =>  set_value('zip'),
            'maxlength' =>  '10',
            'size'      =>  '10'    
        );

        $data['phone'] = array(
            'name'      =>  'phone',
            'id'        =>  'phone',
            'value'     =>  set_value('phone'),
            'maxlength' =>  '15',
            'size'      =>  '15'    
        );

        $data['url'] = array(
            'name'      =>  'url',
            'id'        =>  'url',
            'value'     =>  set_value('url'),
            'maxlength' =>  '255',
            'size'      =>  '50'    
        );

        $data['type'] = $restaurantTypes;

        $data['tags'] = array(
            'name'      =>  'tags',
            'id'        =>  'tags',
            'value'     =>  set_value('tags'),
            'maxlength' =>  '255',
            'size'      =>  '50'    
        );

        $data['active'] = array(
            'name'      =>  'active',
            'id'        =>  'active',
            'value'     =>  'Y',
            'maxlength' =>  '1',
            'size'      =>  '2' 
        );

        // Set page variables
        $data_h['title'] = "Add new restaurant";

        // Load views
        $this->load->view('/template/header', $data_h);
        $this->load->view('/restaurant/index', $data);
        $this->load->view('/template/footer');      

    }


    /**
     * Add the the new restaurant to the database.
     */
    function add() {

        // Load libraries and models
        $this->load->library('form_validation');
        $this->load->model('/restaurant/mRestaurant');

        // Define validation rules
        $this->form_validation->set_rules('name',       'Name',     'trim|required|max_length[255]|xss_clean');
        $this->form_validation->set_rules('address',    'Address',  'trim|required|max_length[100]|xss_clean');
        $this->form_validation->set_rules('city',       'City',     'trim|required|max_length[128]|xss_clean');
        //$this->form_validation->set_rules('state',        'State',    'trim|required');
        $this->form_validation->set_rules('zip',        'Zip',      'trim|required|max_length[128]|xss_clean');
        $this->form_validation->set_rules('phone',      'Phone',    'trim|required|max_length[10]|xss_clean');
        $this->form_validation->set_rules('url',        'URL',      'trim|required|max_length[255]|xss_clean');
        $this->form_validation->set_rules('tags',       'Tags',     'trim|xss_clean');


        // Form validation
        if ($this->form_validation->run() == FALSE) {

            // On failure
            $this->index();

        } else {

            // On success, prepare the data
            $data = array(
                'name'      =>  $_POST['name'],
                'address'   =>  $_POST['address'],
                'city'      =>  $_POST['city'],
                'state'     =>  $_POST['state'],
                'zip'       =>  $_POST['zip'],
                'phone'     =>  $_POST['phone'],
                'url'       =>  $_POST['url'],
                'type'      =>  $_POST['type'],
                'tags'      =>  $_POST['tags'],
                'active'    =>  $_POST['active'],
            );

            // Check if the restaurant already exists
            $check = $this->mRestaurant->getRestaurant($data['name'], $data['zip']);

            // If no records were returned add the new restaurant
            if($check->num_rows() == 0) {
                $query = $this->mRestaurant->addRestaurant($data);

                if ($query) {
                    // On success
                    $this->session->set_flashdata('status', '<div class="success">Added New Restaurant!</div>');
                } else {
                    // On failure
                    $this->session->set_flashdata('status', '<div class="error">Could not add a new restaurant.</div>');    
                }

                redirect('restaurant/confirm', 'refresh');
            } else {
                // Notify the user that the restaurant already exists in the database
                $this->session->set_flashdata('status', '<div class="notice">This restaurant already exists in the database.</div>');
                redirect('restaurant/index');
            }

        }

    }


    function confirm() {

        $data['title'] = "Confirm";

        $this->load->view('/template/header');
        $this->load->view('/restaurant/confirm', $data);
        $this->load->view('/template/footer');
    }
}
?>


0 commentaires

4 Réponses :


0
votes

Vous pouvez essayer d'avoir le formulaire post à indexer et dans la méthode de l'index, faire validation si le formulaire a été soumis. Ensuite, soit rendre la vue d'index (s'il y a des erreurs) ou ajoutez le restaurant et rendez la vue de confirmation.


2 commentaires

J'ai déplacé tout le code de la méthode Ajouter () à l'index (), j'ai ensuite essayé de valider si le code d'a été soumis: Si ($ _ POST ["Ajouter '])) {~~} Cela fonctionne la première fois que la forme est rendue; Toutefois, parce que $ _Post ['ajouter'] est défini, la prochaine fois que l'utilisateur atteint l'ajout et que les règles de validation n'ont toujours pas été rencontrées. Je voudrais toujours utiliser la méthode Ajouter () au lieu de regrouper tout le code dans l'index.


Je pense que vous voulez que ce soit en boucle jusqu'à ce que les règles de validation ne passent pas, non? Et vous pouvez déplacer toute votre validation et ajouter du code aux méthodes privées ou aux méthodes de la bibliothèque, puis appelez-les de la méthode d'index si vous le souhaitez.



1
votes

J'ai eu un problème similaire et j'ai fini par faire:

Mon formulaire consiste à créer un nouvel utilisateur, mais vous devriez avoir l'idée. p> xxx pré>

si efficacement au lieu de Appeler une nouvelle fonction, je montais une nouvelle vue de la même fonction. Pas la plus belle solution mais ça marche. Aussi, vous voudrez peut-être utiliser quelque chose comme ça pour vérifier si le restaurant existe déjà: p> xxx pré>

et utilisez la fonction de validation de rappel: p>

$this->form_validation->set_rules('userName','User Name','trim|required|min_length[3]|callback__check_username');


1 commentaires

J'ai eu le même problème, $ this-> chargée-> bibliothèque ('form_validation'); déplacé cette ligne dans le __ constructeur et ça marche



3
votes

-------- Controller ------- xxx

puis à votre vue

" nom = "nom d'utilisateur>


1 commentaires

Solution simple et fonctionne en première minute. merci Tom.



3
votes

Je vais essayer d'aider avec la logique dans le contrôleur que j'utilise toujours:

...
<?php if ( $error_message ): ?>
  <?php echo $error_message; ?>
<?php endif; ?>
<?php echo form_open(current_url, array('id' => 'some_form_id')); ?>
<!-- form field here -->
<label for="field_name">Field label</label>
<input name="field_name" value="<?php echo set_value('field_name', $DEFAULT_FIELD_NAME_IF_NEEDED); ?>" />
<!-- more form field here -->
<?php echo form_close(); ?>
...


0 commentaires