Как уберечь логику от взглядов CakePHP? - PullRequest
2 голосов
/ 20 января 2011

Я понимаю, что "просмотры" должны отображать информацию только для пользователя и не дают никакого реального "мышления".

Если у меня есть поле в форме, в котором я не должен был ограничивать доступ некоторых пользователей к тому, что ясделать, это поставить условие на мой взгляд:

        <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 Ответ

4 голосов
/ 21 января 2011

Вы должны принять это решение в какой-то момент. Куда бы вы его ни положили, вам нужен где-то переключатель 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'));

Это обеспечит лучшее разделение внутренней логики. Фактическое решение о том, что визуализировать, все равно будет приниматься в представлении.

Лучшее решение для вас, вероятно, где-то посередине. Самое важное, что нужно помнить, это то, что нет ничего плохого в том, что логика в представлении. Фактически невозможно не иметь if утверждений в представлениях. Представления могут быть интеллектуальными и полными кода, это абсолютно не проблема. Они просто не должны содержать никакого кода, касающегося чего-либо, кроме вывода данных, переданных ему контроллером. И, естественно, код должен быть максимально лаконичным и читабельным. Вам необходимо найти правильный баланс между абстрагированием объектов для помощников, элементов или совершенно разных файлов представлений в зависимости от ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...