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?
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);
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));
}
}
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'); ?>" />
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));
}
}
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();
}
J'ai trouvé ça où:
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.
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 = '';
}
}
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