risposta-alla-domanda-sullo-sviluppo-web-bd.com

Convalida del modulo Codeigniter: come criterio di valutazione della forma dopo il successo?

Mi rendo conto che questa richiesta va contro l'esempio fornito nella documentazione di CI (che consiglia una vista di pagina separata per "successo"), ma vorrei riutilizzare una determinata vista modulo dopo che un modulo è stato inviato correttamente - visualizzando un messaggio di successo e poi visualizzando un modulo vuoto. Ho provato alcuni modi senza successo per cancellare i valori del set di validazione (disattivando $_POST, impostando regole/campi su un array vuoto e rieseguendo la validazione).

Potrei reindirizzare alla stessa pagina, ma poi dovrei impostare una variabile di sessione per visualizzare un messaggio di successo - che è un approccio disordinato.

Qualche idea su come ottenere il meglio sopra?

32
BrynJ

Reindirizza a se stesso. In questo modo, non sono stati eseguiti invii ... Questo ti dà anche modo di mostrare il 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

Un'altra soluzione, estendere la libreria CI_Form_validation. La proprietà $_field_data è protetta, quindi possiamo accederci:

class MY_Form_validation extends CI_Form_validation {

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

    public function clear_field_data() {

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

E chiama il nuovo metodo. In questo modo, puoi passare i dati senza memorizzare i dati in sessione.

    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

Passa una variabile TRUE/FALSE alle tue visualizzazioni che imposta in modo condizionale i valori del modulo.

Il controller

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

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

La vista:

<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 funzione set_value recupera il suo valore dall'oggetto Form_validation e non dall'array $ _POST. L'oggetto Form_validation archivia la propria copia dei valori registrati in una variabile denominata $ _field_data. 

È un hack, ma è possibile cancellare questa variabile dopo aver gestito una sottomissione riuscita:

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

Spero che questo sarebbe utile. Finalmente capisco l'intero concetto dell'estensione della biblioteca. Tutto ciò che devi fare è 
Passo 1 : In questa directory "application/libraries /" crea un file chiamato "MY_Form_validation.php" con il seguente codice php

<?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);    
    }
}

Passaggio 2: Quindi utilizzare la funzione "unset_field_data()" nel proprio controller. per esempio qui sotto:

    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

Ho trovato quello dove:

  1. ci sono più di una vista CI-parziali che compongono la pagina e i loro metodi di controllo eseguono la convalida
  2. una delle convalide ha avuto esito negativo e ha prodotto un errore dall'ultimo aggiornamento della pagina, ad esempio con un valore di campo di input formattato in modo errato o immesso

non è sufficiente cancellare solo l'array di regole di validazione, è necessario cancellare anche l'array di errore di convalida.

A tal fine, ho aggiunto un metodo a system/library/Form_Validation.php, come segue:

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

Restituire $ questo è importante se si desidera concatenare i metodi di convalida del modulo.

0
user3125602

La risposta di d5avard è errata, la convalida del modulo CI dovrebbe avere l'array di regole analizzato ad esso: se non lo fai puoi usare la convalida del modulo con i dati pubblicati, ma non con i dati di over-ride.

salva questo file come Librerie/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

Nella nuova versione 3.X, per cancellare set_value, $_POST=array() e $this->_field_data = array(); inMY_Form_validation.phplibrary. provare 

Cancella i dati del modulo dopo il codice di successo con php not jquery

0
Bhunesh Satpada