2011-03-15 13 views
5

テンプレートにハードコードされたフォームにエラーを表示してフィールドを再投入することはできますか?これまでのところ、モジュールのビューにエラーを表示する方法しかわかりませんでしたが、テンプレートは表示されませんでした。ExpressionEngineフォーム検証クラスをモジュール内で使用してテンプレートのフォームを再移植する方法は?

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(); 

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

答えて

10

偉大な質問、私は解決するための最善の方法を見つけるために長い時間がかかりました。

CodeIgniter Form Validation libraryは素晴らしいですが、適切なビューとコントローラでのみ使用できるため、フロントエンドタグを開発しているときはそのままでは機能しません。

通常、フロントエンドフォームを送信するための好ましい方法は、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開発者にとっても役立つでしょう!

+0

ありがとう、Adrian!面倒なビットが、今私は知っている。ほとんどの訪問者にはリアルタイムのJavaScript検証があっても、修正するための戻るボタンのエラーが大きな問題にならないことを示すビューにはほとんど変わっているようです。 –

+0

あなたが自分のサイト用に開発しており、フロントエンドでJS検証が行われることを知っているのであれば、実際はかなりスマートな解決策です。私のソリューションは、商用モジュールを開発していて、設計者に最も柔軟性を持たせたい場合には、おそらくもっと役に立ちます。 –

+0

ありがとう!私はアクションでフォームを処理する方法を考え出しましたが、検証によって私は捨てました。 – juddlyon

関連する問題