如何保持蛋糕观点的逻辑?

时间:2011-01-20 16:58:42

标签: model-view-controller 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 个答案:

答案 0 :(得分: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中完成。

最适合您的解决方案可能介于两者之间。要记住的最重要的事情是在视图中使用 logic 没有任何问题。 在视图中有if个语句几乎是不可能的。视图可以是智能的并且充满代码,这绝对没有问题。它们应该不包含任何与输出控制器传递给它的数据有关的代码。当然,代码应尽可能简洁易读。您需要根据具体情况在帮助器,元素或完全不同的视图文件之间找到正确的平衡点。