このリクエストはCIドキュメント(別の「成功」ページビューを助言する)で提供されている例に反することを理解していますが、フォームが正常に送信された後、特定のフォームビューを再利用したいと思います-成功メッセージを表示し、空白のフォーム。検証セットの値をクリアするために失敗したいくつかの方法を試しました(unsetting $_POST
、ルール/フィールドを空の配列に設定し、検証を再実行します)。
同じページにリダイレクトすることはできますが、セッション変数を設定して成功メッセージを表示する必要があります。これは面倒なアプローチです。
上記を最もよく達成する方法はありますか?
自分自身にリダイレクトします。この方法では、送信は実行されていません...これは、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);
別の解決策は、ライブラリを拡張する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));
}
}
フォームの値を条件付きで設定するビューに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'); ?>" />
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));
}
}
これがお役に立てば幸いです。最後に、ライブラリの拡張の全体的な概念を理解しました。あなたがする必要があるのは
ステップ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();
}
_
私はそれを見つけました:
validation-rules配列のみをクリアするだけでは不十分です。validation-error配列もクリアする必要があります。
このために、system/libraries/Form_Validation.phpに次のようにメソッドを追加しました。
public function clear_rules()
{
$this->_error_array = array();
$this->_field_data = array();
return $this;
}
$ thisを返すことは、フォーム検証メソッドをチェーンしたい場合に重要です。
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 = '';
}
}
新しいバージョン3.Xでは、set_value、$_POST=array()
および$this->_field_data = array();
をクリアするためにMY_Form_validation.php
ライブラリ。試す