Вы должны принять это решение в какой-то момент. Куда бы вы его ни положили, вам нужен где-то переключатель 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
утверждений в представлениях. Представления могут быть интеллектуальными и полными кода, это абсолютно не проблема. Они просто не должны содержать никакого кода, касающегося чего-либо, кроме вывода данных, переданных ему контроллером. И, естественно, код должен быть максимально лаконичным и читабельным. Вам необходимо найти правильный баланс между абстрагированием объектов для помощников, элементов или совершенно разных файлов представлений в зависимости от ситуации.