web-dev-qa-db-ja.com

codeigniterでリダイレクトを使用して検証エラーを表示するにはどうすればよいですか?

私はしばらくの間問題に取り組んできました。関数でリダイレクトを使用して検証エラーを設定するにはどうすればよいですか?これは私のコントローラーにあるコードです:

function send()
{
    $this->form_validation->set_rules('e-mail', 'Email', 'trim|required|valid_email');
    $this->form_validation->set_rules('cellphone', 'Cellphone Number', 'trim|required|is_natural');
    $this->form_validation->set_message('required', '%s is required.');
    $this->form_validation->set_message('valid_email', '%s is not a valid Email Address');
    $this->form_validation->set_message('is_natural', '%s can only contain numbers.');
    $this->form_validation->set_error_delimiters('<li>', '</li>');

    if($this->form_validation->run() == FALSE)
    {
        redirect ('/');
    }
    else
    {
        echo '<pre>';
        print_r($_POST);
        echo '<pre>';
    }
}

そして、これは私のビューファイルで使用するコードです:

<? if (validation_errors())
{   
echo '<div id="validation_errors" title="Error:">';
echo '<div class="response-msgs errors ui-corner-all"><span>Errors:</span><br /><ul>';
echo validation_errors();
echo '</ul></div>';
echo '</div>';
}
?>
15
Afshin

私はそれをする方法を見つけました。リダイレクトしても、表示されるデータは保持されません。以下のコードを使用して問題を解決しました:

if($this->form_validation->run() == FALSE)
{
    $this->index();
}
18
Afshin

私はそれが少し遅いことを知っていますが、この方法は不思議に機能します。

フォームが読み込まれる関数とは異なる関数でフォームを検証する場合は、validation_errors()メソッドを渡すことで、redirect()を使用する任意のページにvalidation_errors()を送信できます。 $this->session->set_flashdata()に次のように:

if ($this->form_validation->run() == FALSE) {

    $this->session->set_flashdata('error', validation_errors());

    redirect('/');
}

エラーやメッセージを受信したいコントローラー関数で、次のようにそれらを$data配列に設定できます。

if (!empty($this->session->flashdata('message'))) {

    $data['message'] = $this->session->flashdata('message');
} elseif (!empty($this->session->flashdata('error'))) {

    $data['error'] = $this->session->flashdata('error');
}

私の見解の上部には、通常、次のものが含まれます。

<?php if (isset($message)) {

    echo '<p class="alert alert-info">'.$message.'</p>';
} elseif (isset($error)) {

    echo '<p class="alert alert-danger"><strong>Error: </strong>'.$error.'</p>';
}?>

Twitter bootstrapクラスを使用してメッセージをフォーマットすると、メッセージを区別するのに役立ちます。

message flashdataを含めたので、送信するメッセージやエラーの種類に関係なく、すべての情報、警告、成功、エラーメッセージに対して異なる形式でフォーマットできます。

13
MunkyMead

私のコメントによると:

_function index()
{
    $this->load->library('form_validation');
    $data = array
    (
        'Param' => 'Value'
    );
    if($this->input->post('cellphone', true) !== false)
    {
        if($this->form_validation->run() != FALSE)
        {
            echo '<pre>' . print_r($_POST, true) . '</pre>';
        }
    }
    $this->load->view('index', $data);
}
_

まず、現在のページを指すようにフォームを変更する必要があります。つまり、current_url()またはsite_url('controller/index')です。

投稿せずにindexに移動すると、検証がスキップされます。フォームを送信すると、検証が実行されます。

次に、組み込みの_form_error_または_validation_errors_メソッドを使用して、indexビュー内にエラーを表示できます。

2
Gavin

最後に、validation_errorsを使用したリダイレクトの解決策を得ました

これは、セッションデータのvalidation_errorsを渡すために使用しています、私はこのようにします

if ($this->form_validation->run()) {
        $data = array(
            'email' => $this->input->post('email'),
            'is_login' => true
        );
        $this->session->set_userdata($data);
        redirect($this->input->post('redirect'));
    }
    else
    {
        $data = array (
            'errors' => validation_errors(),
            'is_login' => false
        );
        $this->session->set_userdata($data);
        redirect($this->input->post('redirect'));
    }

と私が使用したページで

        $this->session->set_flashdata('redirectToCurrent', current_url());

    if ($this->session->userdata('is_login'))
    {
        echo "You are using this as : </br>" . $this->session->userdata('email');
        echo "</br><a href='/logout'>Logout</a>";
    }
    else
    {
        echo form_open('login');
        echo "" . $this->session->userdata('errors');
        echo "email : " . form_input('email');
        echo "Password : " . form_password('password');
        echo form_submit('submit', 'Login');
        echo form_hidden('redirect',$this->uri->uri_string());
        echo form_close();
    }   

この高速ソリューションが気に入っていただければ幸いです

0
Tamer Fahmy