2

CodeIgniterを使用してサイトを開発していますが、 "Fat Model/Skinny Controller"パラダイムを遵守しようとしていますが、フォームを含むページについてはいくつか問題があります。いくつかの入力。私のビューのCodeIgniter:入力が多いフォームのコントローラ構造

$this->data['address1'] = array(
      'name' => 'address1', 
      'id' => 'address1', 
      'type' => 'text', 
      'class' => 'field text addr', 
      'tabindex' => '10', 
      'value' => $this->form_validation->set_value('address1'), 
      'placeholder' => 'Street Address' 
     ); 

$this->data['address2'] = array(
      'name' => 'address2', 
      'id' => 'address2', 
      'type' => 'text', 
      'class' => 'field text addr', 
      'tabindex' => '11', 
      'value' => $this->form_validation->set_value('address2'), 
      'placeholder' => 'Address Line 2', 
     ); 

$this->data['city'] = array(
      'name' => 'city', 
      'id' => 'city', 
      'type' => 'text', 
      'class' => 'field text addr', 
      'tabindex' => '12', 
      'value' => $this->form_validation->set_value('city'), 
      'placeholder' => 'City' 
      ); 

$this->data['state'] = array(
      'name' => 'state', 
      'id' => 'state', 
      'class' => 'field addr', 
      'tabindex' => '13', 
      'value' => $this->form_validation->set_value('state'), 
      'label' => array('class' => 'desc') 
      ); 

$this->data['zip'] = array(
      'name' => 'zip', 
      'id' => 'zip', 
      'type' => 'text', 
      'class' => 'field text addr', 
      'tabindex' => '14', 
      'maxlength' => '20', 
      'value' => $this->form_validation->set_value('zip'), 
      'placeholder' => 'Zip/Postal Code' 
      ); 

$this->data['country'] = array(
      'name' => 'country', 
      'id' => 'country', 
      'class' => 'field addr', 
      'tabindex' => '15', 
      'value' => $this->form_validation->set_value('country') 
      ); 

パート:次のコードは、私は(私は、フォームの入力とその属性を定義しています)私のコントローラの

パートアドレスフィールドに入力を定義するために使用しているものです(マイナスすべてのHTMLは、フォーム入力を配置する):

<?php 
    echo form_open("address/add"); 
    echo form_input($address1); 
    echo form_input($address2); 
    echo form_input($city); 

    $options = array(); 
    $options[''] = 'State/Province/Region'; 
    foreach($province_options AS $prov) 
    { 
      $options[$prov->id] = $prov->province; 
    } 
    echo form_dropdown('state',$options,'',$state); 

    echo form_input($zip); 

    $options = array(); 
    $options[''] = 'Country'; 
    foreach($country_options AS $cnt) 
    { 
      $options[$cnt->id] = $cnt->country; 
    } 
    echo form_dropdown('country',$options,'',$country); 
    echo form_submit('submit', 'Submit & Continue'); 
    echo form_close(); 
?> 

私のコントローラが過度に冗長ですが、私は選択肢が私を表現するのに必要な情報を整理する方法についてはどのようになるかを考えることができないように私は感じますフォームヘルパーを使用してfor私の視点ではm個の入力があります。これは正しいことですか、よりよいアプローチがありますか?

答えて

1

コントローラ、さらにはモデルレイヤーに移動することができるロジックの少しがあります:

$options = array(); 
$options[''] = 'Country'; 
foreach($country_options AS $cnt) 
{ 
     $options[$cnt->id] = $cnt->country; 
} 
echo form_dropdown('country',$options,'',$country); 

おそらく次のようになります。

echo form_dropdown('country', $countries, '', $country); 

...オプションをコントローラに移動するとまたは表示する。

これは問題を解決するために、私はいつも物事を維持しようとしていますDRY可能な限り、フォームデータを定義しますか?私は時には "MVC"の "V"の力を忘れると思う。 はビューのすべてのビューロジックを代わりに定義できます。

id,tabindexおよびplaceholderのようなものは、ビュー内に必要かつ有用である。フォームの検証ルールやデータのチェック/準備などは、コントローラ/モデルレイヤーに属します。

フォームヘルパー関数は便利ですが、生のHTMLが優れていることがあります。

// Controller 
$this->data['address1'] = array(
      'name' => 'address1', 
      'id' => 'address1', 
      'type' => 'text', 
      'class' => 'field text addr', 
      'tabindex' => '10', 
      'value' => $this->form_validation->set_value('address1'), 
      'placeholder' => 'Street Address' 
     ); 
// View 
echo form_input($address1); 

それとも単に:たとえば

<input name="address1" id="address1" tabindex="10" type="text" placeholder="Street Address" value="<?php echo set_value('address1'); ?>" class="field text addr"> 

私はモデル内のすべてのこのようなものを定義したところ、私は昨年のアプリケーションの束を書いた、と私はしてきたとして、今、私はそれを後悔していますそれらのメンテナンスを行うために戻って、すべてのビューロジックがモデルまたはコントローラで隠されています。コントローラまたはモデルを編集してclass属性を変更するだけでは愚かです。

2

Codeigniterがこれらのヘルパーをすべて提供しているという理由だけで、それらを使用する必要はありません!

これはCRSFトークン(使用されている場合)を追加するため、form_open()が必要です。

Raw HTMLははるかにクリーンで、私はマークアップをレンダリングするのをPHPが待つよりはるかに早いと思われます。

編集:CIが特定の仕様に準拠する可能性のある出力を制御できるため、そのクリーナーが追加された理由を追加したいと思います。

あなたの質問には問題はありません。

これは単なる愚かである

$options = array(); 
$options[''] = 'State/Province/Region'; 
+0

生のHTMLの場合+1(30分前に夕食が中断されるまで似たような回答を投稿していました)が、あなたが投稿したコードブロックについては "愚かな"ものは表示されません。説明できますか? –

+0

@MadM質問に答えるために、私は個人的にvarを型キャストする際にポイントを見ないで、値を入力してください。これはクラス内でOKですが、これはメソッド内のtmp配列です(BTWはPHP6または5.4のwhitversに感謝します) 、アプローチは健全かもしれませんが、読みやすさのために私は間違っていると思います。 – Philip

+1

さて、* 2番目の* $ options = array();がなければ、最初のものからの値がこぼれるでしょう(おそらく別のvar名を使うべきでしょう)。私はあなたの意味を理解していますが、私はまだそれが良い習慣だと思っており、「事故」を避けるために何が起こっているかを非常に明確にしています。 –

関連する問題