5

テンプレートにハードコードされたフォームで、エラーを表示してフィールドを再入力することはできますか? これまでのところ、エラーをモジュールのviewに表示する方法しかわかりませんでしたが、テンプレートはわかりませんでした。

ExpressionEngine のロジックに基づいて、モジュール内のタグを使用して検証エラーを表示するか、モジュールからフォーム全体を生成する必要があると推測していますが、これに最も適した方法がわかりません。

これが私が今持っているものです。

function submit_form()
{        
    $this->EE->load->helper('form');
    $this->EE->load->library('form_validation');

    $this->EE->form_validation->set_rules('first_name', 'First Name', 'required');
    $this->EE->form_validation->set_rules('last_name', 'Last Name', 'required');
    $this->EE->form_validation->set_rules('address', 'Address', 'required');
    $this->EE->form_validation->set_rules('city', 'City', 'required');
    $this->EE->form_validation->set_rules('province', 'Province', 'required');

    if ($this->EE->form_validation->run() == FALSE)
    {
        return $this->EE->load->view('form_errors');
    }
    else
    {
        // success
    }
} 

また、テストのために、ビューには次のものが含まれています。

echo validation_errors(); 

誰でも助けることができますか?

4

1 に答える 1

10

素晴らしい質問であり、解決する最善の方法を見つけるのに長い時間がかかりました。

CodeIgniter Form Validation ライブラリは優れていますが、適切なビューとコントローラーでしか使用できないため、フロント エンド タグを開発している場合はそのままでは機能しません。

通常、フロントエンド フォームを送信する好ましい方法は、upd.addon.php ファイルに「アクション」を登録することです (submit_form()関数に対してこれを行っていると思います)。これには番号が割り当てられ、URL/index.php?ACT=37などで投稿できます。これは、フォームの送信がモジュールから送信されたものであることがわかっていることを意味するため、優れたシステムです。ただし、入力フォームでは、入力フィールドを再入力できないことを意味するため、これは障害になります。したがって、現在の URL にポスト バックするように入力フォームを構成し、フォームの送信を処理する前にテンプレート エンジンがタグをレンダリングしようとするまで待つ必要があります。

これを実現するための最も簡単で視覚的に醜い方法は、 を使用すること$this->EE->output->show_user_error(FALSE, array_of_errors)です。これは、アクションから、またはモジュール コード内で実際に使用できます。それは、私たち全員が知って嫌うようになった標準的な灰色の EE メッセージ ページを表示します。

この種の紹介で、解決策がそれほど単純ではないことはおそらくわかっていましたよね? インライン エラー チェックを実装するタグ関数のスケルトンを次に示します。

function my_form()
{
    // load default tag variables
    $tag_vars = array();
    $tag_vars[0] = array(
        'first_name' => '',
        'error:first_name' => '',
        'last_name' => '',
        'error:last_name' => ''
    );

    // handle a form submission
    if ($this->EE->input->post('my_form_hidden') == '1'))
    {
        // load POST data into tag
        $tag_vars[0]['first_name'] = $this->EE->input->post('first_name', TRUE);
        $tag_vars[0]['last_name'] = $this->EE->input->post('last_name', TRUE);

        // use CI validation library to check submission
        $this->EE->load->helper('form');
        $this->EE->load->library('form_validation');
        $this->EE->form_validation->set_rules('first_name', 'lang:first_name', 'required');
        $this->EE->form_validation->set_rules('last_name', 'lang:first_name', 'required');

        $valid_form = $this->EE->form_validation->run();
        if ($valid_form)
        {
            // probably save something to database, then redirect
        }
        else
        {
            $form_errors = array();
            foreach (array('first_name', 'last_name') as $field_name)
            {
                $field_error = form_error($field_name);
                if ($field_error)
                {
                    $form_errors[] = $field_error;
                    $tag_vars[0]['error:'.$field_name] = $field_error;
                }
            }

            if ($this->EE->TMPL->fetch_param('error_handling') != 'inline')
            {
                // show default EE error page
                return $this->EE->output->show_user_error(FALSE, $form_errors);
            }
        }
    }

    // parse and output tagdata
    $out = $this->EE->functions->form_declaration(array(
        'action' => $this->EE->functions->fetch_current_uri(),
        'hidden_fields' => array('my_form_hidden')));
    $out .= $this->EE->TMPL->parse_variables($tagdata, $tag_vars);
    return $out.'</form>';
}

このようにして、デザイナーはerror_handling="inline"インライン エラーが必要な場合はタグで指定できます。それ以外の場合は、標準エラー フォームにリダイレクトされます。インライン エラー処理を要求する場合は、入力が次のようになっていることを確認する必要があります。

<input type="text" name="first_name" value="{first_name}" />
{error:first_name}

フォームとともに送信する非表示フィールドに注意してください。これにより、ログイン フォームなど、ページ上の他のフォームではなく、このフォームの送信のみを処理することができます。ページにフォームのインスタンスが複数ある場合 (チャネル エントリ ループなどの内部など)、送信されたフォーム インスタンスのみを処理するように、いくつかの策略を実装する必要があります。隠しフィールドとしての entry_id も。

すべてが文書化されたことをうれしく思います。これが他の EE 開発者にも役立つことを願っています!

于 2011-03-16T03:29:06.157 に答える