2011-01-20 81 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參數傳遞給它,請創建一個幫助程序,該幫助程序將返回所需的表單輸入。 – 2011-01-20 19:30:30

回答

4

你必須在某個時候決定。無論你把它放在哪裏,你都需要if ($level = 6)開關。如果你絕對不想讓它看起來那麼簡單,唯一可能的地方就是控制器。你可以在Controller中做的唯一事情就是呈現不同的視圖。這是完美的,它保留了視圖中的所有邏輯,但是最終會產生很多重複的代碼,只有很小的差異。

什麼你做:

// 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語句。視圖可以是智能且充滿代碼的,這絕對沒有問題。他們不應該包含任何與輸出控制器交給它的數據有關的任何代碼。自然,代碼應儘可能簡潔易讀。您需要在根據情況將事物抽象爲助手,元素或完全不同的視圖文件之間找到適當的平衡點。