2011-01-20 58 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语句。视图可以是智能且充满代码的,这绝对没有问题。他们不应该包含任何与输出控制器交给它的数据有关的任何代码。自然,代码应尽可能简洁易读。您需要在根据情况将事物抽象为助手,元素或完全不同的视图文件之间找到适当的平衡点。