2011-01-20 14 views
2

「ビュー」はユーザーに情報を表示するだけで、実際の「思考」はしないことを理解します。cakephpビューからロジックを保護する方法は?

私は私が私の見解に条件を入れて何をすべきかアクセスする一部のユーザーレベルを制限する波平フォームのフィールドを持っている場合:

 <td style="v-align: middle;"> 
     <?php 
      if ($auth['level_id'] == 6) { 

       echo $form->input('product_date', 
        array('class' => 'input-box', 
          'div' => false, 
          'label' => false,       
          'readonly' => 'readonly', 
          'style' => 'width:100px; margin-top: 8px; float:left;', 
          'value' => $productiondate, 
          'tabindex' => 3013 
         ) 
       ); 
       echo '<div style="padding-left: 10px; float:left;"><a href="#" id="supplier_submit" name="supplier_submit"><img src="/img/submit.png" border="0"/></a></div>'; 
      } 
      else { 

       echo $form->input('product_date_ro', 
        array('class' => 'input-box', 
          'div' => false, 
          'label' => false,       
          'readonly' => 'readonly', 
          'style' => 'width:100px', 
          'value' => $productiondate, 
          'tabindex' => 3013 
         ) 
       ); 

      } 
     ?> 

     </td>    

これをやっていないためのベストプラクティスは何ですか?

よろしく

あなたはいくつかの点でその決定をしなければならないポール

+1

私はヘルパーを調べます。 level_id引数を渡すことで、必要なフォーム入力を返すヘルパーを作成します。 –

+0

ヘルパーは、このような抽象的なものを「アウトソース」するには良い方法だと同意しますが、ビューとヘルパーが同じレベルにあるので、MVCパターンに正しく従いません。しかし、ビューの軽量ロジックを行うことは犯罪ではなく、Paulの初期の例は実際には「プレゼンテーション」にのみ適用されます(私が間違っていれば修正します)。この場合は完全に問題ありません。 – laander

答えて

4

。どこに置いても、どこかでif ($level = 6)スイッチが必要です。あなたが絶対に見えないようにしたいのであれば、可能な他の場所はコントローラーだけです。コントローラで行うことができるのは、別のビューをレンダリングすることだけです。これは、すべてのロジックをビューから外しているという意味では完璧ですが、わずかな違いだけで多くの重複したコードになります。

を行うことができ:最悪の重複を回避しながら

// Controller 
switch ($level) { 
    case 6 : 
     $this->render('level6_view'); 
     break; 
    ... 
    default : 
     $this->render('normal_view'); 
} 


// Views 
echo $this->element('standard_elements'); 
echo // something special for level 6 
echo $this->element('rest_of_standard_elements'); 

これは、コントローラのロジックを配置します。あなたの意見がより複雑になればなるほど、この解決策は実行可能ではありません。

あなたは、単に抽象的意思決定のためのビューコントローラとセットのみのフラグにビットができます

// Controller 
$flags = array('render_foo' => false, 'render_bar' => true); 
if ($level == 6) { 
    $flags['render_foo'] = true; 
} 
$this->set(compact('flags')); 

これは、内部ロジックの良好な分離を提供します。何をレンダリングするかについての実際の決定は、Viewでもまだ行われます。

あなたのための最良の解決策はおそらくその中間にあります。覚えておくべき最も重要なことは、ビュー内に論理を持つことに何も問題がないことです。 ではなく、にはifというステートメントが表示されます。ビューはインテリジェントでコードが豊富で、問題はありません。コントローラーが渡したデータを出力する以外のコードは含まれていないはずです。そして、もちろん、コードはできるだけ簡潔かつ読みやすいものにする必要があります。ヘルパー、要素、または状況に応じて完全に異なるビューファイルに抽象化することの適切なバランスを見つける必要があります。

関連する問題