web-dev-qa-db-fra.com

Validation de formulaire Codeigniter - Comment supprimer des valeurs de formulaire après un succès?

Je me rends bien compte que cette demande va à l’encontre de l’exemple fourni dans la documentation de CI (qui recommande une vue de page de réussite distincte), mais j’aimerais réutiliser une vue de formulaire donnée après qu’un formulaire a été soumis avec succès. formulaire BLANC. J'ai tenté plusieurs fois sans succès d'effacer les valeurs définies dans la validation (suppression de $_POST, définition des règles/champs dans un tableau vide et réexécution de la validation). 

Je pourrais rediriger vers la même page, mais je devrais alors définir une variable de session pour afficher un message de réussite, ce qui est une approche compliquée.

Des idées comment mieux réaliser ce qui précède?

32
BrynJ

Rediriger vers lui-même. De cette façon, aucune soumission n'a été exécutée ... Cela vous donne également un moyen d'afficher le flash_data.

    $this->load->library('form_validation');

    $this->form_validation->set_rules('firstname', 'First Name', 'required');
    $this->form_validation->set_rules('surname', 'Sur Name', 'required');

    if ($this->form_validation->run() === TRUE)
    {
                    // save data

        $this->session->set_flashdata('message', 'New Contact has been added');
        redirect(current_url());
    }

    $this->load->view('contacts/add', $this->data);
34
Thorpe Obazee

Une autre solution consiste à étendre la bibliothèque CI_Form_validation. La propriété $_field_data est protégée, nous pouvons donc y accéder:

class MY_Form_validation extends CI_Form_validation {

    public function __construct()
    {
        parent::__construct();
    }

    public function clear_field_data() {

        $this->_field_data = array();
        return $this;
    }
}

Et appelez la nouvelle méthode. De cette façon, vous pouvez transmettre des données sans les stocker en session.

    class Item extends Controller
    {
        function Item()
        {
            parent::Controller();
        }

        function add()
        {
            $this->load->library('form_validation');
            $this->form_validation->set_rules('name', 'name', 'required');

            $success = false;

            if ($this->form_validation->run())
            {
                $success = true;
                $this->form_validation->clear_field_data();
            }

            $this->load->view('item/add', array('success' => $success));
        }
    }
12
d5avard

Transmettez une variable TRUE/FALSE à vos vues pour définir de manière conditionnelle les valeurs du formulaire.

Le controlle

if($this->form_validation->run())
{
    $data['reset'] = TRUE;
}
else
{
    $data['reset'] = FALSE:
}

$this->load->view("form", $data);

La vue:

<input type="text" name="email" value="<?php echo ($reset) ? "" : set_value('email'); ?>" />

<input type="text" name="first_name" value="<?php echo ($reset) ? "" : set_value('first_name'); ?>" />
7
bschaeffer

La fonction set_value extrait sa valeur de l'objet Form_validation et non du tableau $ _POST. L'objet Form_validation stocke sa propre copie des valeurs publiées dans une variable appelée $ _field_data. 

C'est un hack, mais vous pouvez effacer cette variable après avoir traité une soumission réussie:

class Item extends Controller
{
    function Item()
    {
        parent::Controller();
        $this->load->model('item_model');
    }

    function add()
    {
        $this->load->library('form_validation');
        $this->form_validation->set_rules('name', 'name', 'required');

        $success = false;

        if ($this->form_validation->run())
        {
            $this->item_model->add_item($this->input->post('name'));
            $success = true;

            // Look away now. Hack coming up!
            // Clear the form validation field data
            $this->form_validation->_field_data = array();
        }

        $this->load->view('item/add', array('success' => $success));
    }
}
4
Stephen Curran

J'espère que cela serait utile. Enfin, je comprends tout le concept de l'extension de la bibliothèque. Tout ce que vous devez faire c'est 
Étape 1 : Dans ce répertoire "application/libraries /", créez un fichier nommé "MY_Form_validation.php" avec le code php suivant

<?php if (!defined('BASEPATH')) exit('No direct script access allowed.');
class MY_Form_validation extends CI_Form_validation {

 public function MY_Form_validation() {
    parent::__construct();
  }

  public function unset_field_data()
    {    
        unset($this->_field_data);    
    }
}

Étape 2: Utilisez ensuite la fonction "unset_field_data()" dans votre contrôleur. par exemple ci-dessous:

    if ($this->form_validation->run())
    {
        $this->item_model->add_item($this->input->post('name'));
        $success = true;

        $this->form_validation->unset_field_data();
    }
0
dt teja

J'ai trouvé ça où:

  1. il y a plusieurs vues partielles CI qui composent la page et leurs méthodes de contrôleur effectuent la validation
  2. une des validations a échoué et a généré une erreur depuis la dernière actualisation de la page, par exemple avec une valeur de champ de saisie mal formatée ou typée

il ne suffit pas d'effacer uniquement le tableau de règles de validation, vous devez également effacer le tableau d'erreur de validation.

À cette fin, j'ai ajouté une méthode à system/libraries/Form_Validation.php, comme suit:

public function clear_rules()
{
    $this->_error_array = array();
    $this->_field_data = array();
    return $this;
}

Retourner $ est important si vous souhaitez chaîner vos méthodes de validation de formulaire.

0
user3125602

La réponse de d5avard est erronée, le tableau de règles doit y être analysé: si vous ne le faites pas, vous pouvez utiliser la validation de formulaire avec les données publiées, mais pas avec les données de remplacement.

enregistrer ce fichier sous le nom Libraries/MY_Form_validation.php

    /**
     * Class MY_Form_validation
     * @description extension of the CI_Form_validation
     * @property CI_DB_query_builder db database driver
     * @property CI_Benchmark benchmark
     * @property CI_Input input
     * @property CI_Output output
     */
    class MY_Form_validation extends CI_Form_validation
    {
        /**
         * MY_Form_validation constructor.
         * @param array $rules
         */
        function __construct($rules = array())
        {
            parent::__construct($rules);
            $this->_error_prefix        = '<div class=""><p>';
            $this->_error_suffix        = '</p></div>';
        }

        /**
         * Resets the form validation class for multiple runs.
         * @param array $rules
         */
        public function initialise($rules = array())
        {
            if (count($rules) == 0 )
            {
                require (APPPATH.'config'.DIRECTORY_SEPARATOR.'form_validation.php');
                $this->_config_rules = $config;
            }
            else
            {
                $this->_config_rules = $rules;
            }
            $this->_field_data          = array();
            $this->_error_array         = array();
            $this->_error_messages      = array();
            $this->_error_prefix        = '<div class=""><p>';
            $this->_error_suffix        = '</p></div>';
            $this->error_string         = '';
        }
    }
0
pgee70

Dans la nouvelle version 3.X, pour effacer set_value, $_POST=array() et $this->_field_data = array(); dans la bibliothèque MY_Form_validation.php. essayer 

Effacer les données de formulaire après succès codeigniter en utilisant php pas jquery

0
Bhunesh Satpada