Как правильно сделать условное форматирование в проекте ZF2 MVC?
В проекте ZF2, который я разрабатываю, я хотел бы создать оболочку вокруг echo $this->content;
заявление в layout.phtml, которое позволит условное форматирование основной области содержимого. В частности, я хочу поместить содержимое в столбец шириной 75% и включить некоторые "декоративные" элементы в столбец шириной 25% для большинства страниц. Тем не менее, я хочу перейти на один столбец для страниц, которые требуют больше места. Мой проект - это CMS, в которой каждая страница имеет атрибут, который может указывать либо представлению, либо контроллеру, должна ли страница быть нормальной или широкой. Я рассмотрел несколько методов для достижения того, что я после.
Мое "условное форматирование в макете" может выглядеть так:
// module/Application/view/layout/layout.phtml:
//...
if ($templateNormal) {
echo "<div class='col-md-9'>";
} else {
echo "<div class='col-md-12'>";
}
echo $this->content;
if ($templateNormal) {
echo "</div>";
echo "<div class='col-md-3'>";
//... ornamentation
echo "</div>";
} else {
echo "</div>";
}
//...
Хотя вышеприведенный метод мог бы работать, для чистого MVC я не думаю, что в представлении макета предполагается принятие какого-либо решения.
Мое "условное форматирование в частичных представлениях" может выглядеть так:
// module/Application/view/layout/layout.phtml:
//...
echo $this->partial('partial/open-shell.phtml');
echo $this->content;
echo $this->partial('partial/close-shell.phtml');
//...
// module/Application/view/partial/open-shell.phtml:
if ($templateNormal) {
echo "<div class='col-md-9'>";
} else {
echo "<div class='col-md-12'>";
}
// module/Application/view/partial/close-shell.phtml:
if ($templateNormal) {
echo "</div>";
echo "<div class='col-md-3'>";
//... ornamentation
echo "</div>";
} else {
echo "</div>";
}
Здесь принятие решения вынимается из представления макета, но оно просто помещается в другие представления, поэтому оно все еще находится в пакете представления и все еще не является чисто MVC.
В моем решении "условное форматирование в контроллере" пара строк html-скриптов разрабатывается в функции контроллера, а затем передается в представление. Это может выглядеть так:
// module/Application/view/layout/layout.phtml:
//...
echo $this->open-shell-script';
echo $this->content;
echo $this->close-shell-script';
//...
// some controller function:
//...
if ($templateNormal) {
$open-shell-script = "<div class='col-md-9'>";
$close-shell-script = "</div>";
$close-shell-script = "<div class='col-md-3'>";
$close-shell-script .= //... ornamentation
$close-shell-script .= "</div>";
} else {
$open-shell-script = "<div class='col-md-12'>";
$close-shell-script = "</div>";
}
//...
В этом методе принятие решения осуществляется в контроллере, где, как я полагаю, должно быть, но кажется странным, что здесь пишется html.
Любые комментарии или предложения?
3 ответа
Есть много способов сделать это. Это один из методов, и логика живет в контроллере:
контроллер
public function yourSampleAction()
{
// assign variables as usual to this view model
$viewModel = new ViewModel(array(
//vars
);
// this will be the "wrapper" and can be single, double column or anything else.
$wrapperViewModel = new ViewModel();
$wrapperViewModel->addChild($viewModel, 'innerContent');
// use this line when you want one column
$wrapperViewModel->setTemplate('path/to/your/single-column-wrapper.phtml');
// when this line you want two columns
$wrapperViewModel->setTemplate('path/to/your/two-column-wrapper.phtml');
return $wrapperViewModel;
}
две колонки-wrapper.phtml
<div class='col-md-9'>
<?php echo $innerConntent; ?>
</div>
<div class='col-md-3'>
<!--- something else in here? -->
</div>
один столбец-wrapper.phtml
<div class='col-md-12'>
<?php echo $innerConntent; ?>
</div>
Создайте два макета и в методе init() модуля Module.php решите, какой макет следует использовать.
public function init(ModuleManager $moduleManager) {
$sharedEvents = $moduleManager->getEventManager()->getSharedManager();
$sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
// This event will only be fired when an ActionController under the MyModule namespace is dispatched.
$controller = $e->getTarget();
$controller->layout(" your chose layout ");
}
}
Вместо настройки разных шаблонов вы можете настроить классы Bootstrap Twitter, сделав необходимые классы зависимыми от переменной макета. Вы можете использовать логику в ваших действиях контроллеров для передачи переменных непосредственно в макет (а не в представление) следующим образом:
$this->layout()->setVariables
(
array
(
'layoutVar1' => 75,
'someColClass' => ($someSwitch ? 'col-md-9':'col-md-12' ),
'layoutVar1' => 75,
)
);
а затем просто получите доступ к этим переменным в макете, как переменные, отправленные в представление. Вам не нужно даже ставить перед ними "макет", они не будут конфликтовать.