web-dev-qa-db-ja.com

Codeigniterフォーム検証-成功後にフォーム値を設定解除する方法は?

このリクエストはCIドキュメント(別の「成功」ページビューを助言する)で提供されている例に反することを理解していますが、フォームが正常に送信された後、特定のフォームビューを再利用したいと思います-成功メッセージを表示し、空白のフォーム。検証セットの値をクリアするために失敗したいくつかの方法を試しました(unsetting $_POST、ルール/フィールドを空の配列に設定し、検証を再実行します)。

同じページにリダイレクトすることはできますが、セッション変数を設定して成功メッセージを表示する必要があります。これは面倒なアプローチです。

上記を最もよく達成する方法はありますか?

32
BrynJ

自分自身にリダイレクトします。この方法では、送信は実行されていません...これは、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);
35
Thorpe Obazee

別の解決策は、ライブラリを拡張するCI_Form_validation。プロパティ$_field_dataは保護されているため、アクセスできます。

class MY_Form_validation extends CI_Form_validation {

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

    public function clear_field_data() {

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

そして、新しいメソッドを呼び出します。このようにして、セッションにデータを保存せずにデータを渡すことができます。

    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

フォームの値を条件付きで設定するビューにTRUE/FALSE変数を渡します。

コントローラー

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

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

景色:

<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

Set_value関数は、$ _ POST配列からではなく、Form_validationオブジェクトから値をフェッチします。 Form_validationオブジェクトは、ポストされた値の独自のコピーを$ _field_dataという変数に格納します。

これはハックですが、正常な送信を処理した後でこの変数をクリアすることができます。

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

これがお役に立てば幸いです。最後に、ライブラリの拡張の全体的な概念を理解しました。あなたがする必要があるのは
ステップ1:このディレクトリ「application/libraries /」に、「MY_Form_validation.php」という名前のファイルを次の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);    
    }
}
_

ステップ2:次に、コントローラーで関数 "unset_field_data()"を使用します。以下の例:

_    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

私はそれを見つけました:

  1. ページを構成する複数のCIビュー部分があり、それらのコントローラーメソッドが検証を実行します
  2. 検証の1つが失敗し、最後のページ更新以降にエラーが発生しました。

validation-rules配列のみをクリアするだけでは不十分です。validation-error配列もクリアする必要があります。

このために、system/libraries/Form_Validation.phpに次のようにメソッドを追加しました。

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

$ thisを返すことは、フォーム検証メソッドをチェーンしたい場合に重要です。

0
user3125602

D5avardからの答えは間違っています。CIフォーム検証では、ルール配列が解析されます。これを行わない場合は、投稿データでフォーム検証を使用できますが、オーバーライドデータでは使用できません。

このファイルを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

新しいバージョン3.Xでは、set_value、$_POST=array()および$this->_field_data = array();をクリアするためにMY_Form_validation.phpライブラリ。試す

jqueryではなくphpを使用して成功したcodeigniterの後にフォームデータをクリアする

0
Bhunesh Satpada