Мне нужен шаблонизатор для небольшого сайта, и я решил попробовать использовать \Zend\View
, Я не использую сам Zend Framework, хотя.
Поэтому в основном я хочу выполнить некоторую обработку данных в моих пользовательских скриптах за пределами Zend, а затем передать переменные в \Zend\View
и заставь это сделать мои шаблоны.
Я имел в виду следующее руководство: zend.view.quick-start.html. Основная реализация (где я использую \Zend\View\Renderer\PhpRenderer
а также \Zend\View\Model\ViewModel
только) работает как положено. Но я сталкиваюсь с ошибками, когда пытаюсь сделать что-то более сложное, например, используя общий макет.
Если я правильно понял, \Zend\View\Model\ViewModel
s могут быть вложенными, и я могу вызывать дочерние, используя предопределенные заполнители (zend.view.quick-start.html гнездовой-View-модель #). Но должен быть один основной ViewModel
что послужит корнем (zend.view.quick-start.html # дилинг-с-макетов), он будет содержать скелетную HTML-страницу с Doctype и всем, что я передам headTitle()
, headMeta()
и т.п.
Я пытался создать viewModel, указать его на мой корневой макет, используя setTemplate()
а затем передать его setRoot()
функция, но это не сработало. Я попытался найти код для этой функции, и я нашел его в /Zend/View/Helper/ViewModel.php. Это берет пример Zend\View\Model\ModelInterface
а не пример \Zend\View\Model\ViewModel
, Но когда я пытаюсь создать новый ModelInterface и установить на него шаблон, он бросает меня
Неустранимая ошибка: не удается создать экземпляр интерфейса Zend \ View \ Model \ ModelInterface
Это становится слишком сложным, и я не могу понять это.
<?php
require_once '/path/to/zend/autoloader.php';
$resolver = new \Zend\View\Resolver\TemplatePathStack();
$resolver->addPath('/path/to/views/');
$viewModel = new \Zend\View\Model\ViewModel();
$viewModel->setTemplate('layout.phtml');
//$ModelInterface = new \Zend\View\Model\ModelInterface();
//$ModelInterface->setTemplate('layout.phtml');
// this is the only class that has the setRoot() declared
//$ZendViewHelperViewModel = new \Zend\View\Helper\ViewModel();
//$ZendViewHelperViewModel->setRoot($ModelInterface);
$renderer = new \Zend\View\Renderer\PhpRenderer();
$renderer->setResolver($resolver);
//$renderer->layout('layout.phtml');
$renderer->headTitle('Zend');
$renderer->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8');
$renderer->headLink()->setStylesheet('/test1.css');
$renderer->headLink()->appendStylesheet('/test2.css');
$renderer->headScript()->setFile('/javascript1.js');
$renderer->headScript()->appendFile('/javascript2.js');
$viewModel->setVariable('date', gmdate('r'));
echo $renderer->render($viewModel);
//echo $renderer->render($ZendViewHelperViewModel);
layout.phtml
код:<?php
$this->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
$this->headTitle()->setSeparator(' - ');
?>
<!DOCTYPE html>
<html>
<head>
<?php echo $this->headMeta(); ?>
<?php echo $this->headTitle(); ?>
<?php echo $this->headLink() . "\n" ?>
<?php echo $this->headscript(). "\n"?>
</head>
<body>
<div id="nav">
<?php echo $this->layout()->nav ?>
</div>
<div id="content">
<?php echo $this->layout()->content; ?>
</div>
</body>
</html>
Неустранимая ошибка: необработанное исключение ‘Zend \ View \ Exception \ RuntimeException’
с сообщениемZend \ View \ Helper \ Layout :: getRoot: модель без вида
в настоящее время зарегистрирован как root в рендерере‘ в
Zend / View / Helper / Layout.php: 64 Трассировка стека:0 Zend / View / Helper / Layout.php (37): Zend \ View \ Helper \ Layout-> getRoot ()
1 [внутренняя функция]: Zend \ View \ Helper \ Layout -> __ invoke ()
2 Zend / View / Renderer / PhpRenderer.php (399): call_user_func_array (Объект (Zend \ View \ Helper \ Layout), Массив)
3 views / layout.phtml (16): Zend \ View \ Renderer \ PhpRenderer -> __call (‘layout’, Array)
4 views / layout.phtml (16): Zend \ View \ Renderer \ PhpRenderer-> layout ()
5 Zend / View / Renderer / PhpRenderer.php (506): включить (‘…’)
6 zendviewtest.php (32): Zend \ View \ Renderer \ PhpRenderer-> render (Object (Zend \ View \ Model \ ViewModel))
7 {main} добавлено в Zend / View / Helper / Layout.php в строке 64
Я считаю, что это из-за $this->layout()
ссылка. Когда я удаляю эту часть, она начинает работать нормально.
Но я думаю, что $this->layout()
необходимо, потому что это естественный способ передачи содержимого страницы. Если я уберу это и использую равнину setVariable('content', ...)
это нарушит соглашения Zend, верно?
Я также хотел бы использовать некоторые вложенные макеты, такие как верхний и нижний колонтитулы и т. Д., Но я не уверен, как это реализовать. Я попытался выполнить поиск по ключевым словам и кодам ошибок, но не могу найти ничего полезного. Пожалуйста, порекомендуйте.
ОБНОВИТЬ Как лучше всего обрабатывать и отображать содержимое страницы? Так как я не могу использовать echo $this->layout()->content
часть, предложенная в документации, чем я должен заменить ее?
$this->layout()
возвращает layout view model
ведьмы у тебя нет
рендерить другие скрипты вида внутри другого использования partial view helper
,
print $this->partial('path/to/other/view/script',array('param1'=>'param1'));
макет в Zend Framework определяется в конфигах view_manager и обрабатывается контроллером, так как вы делаете эти шаги вручную, вам не нужен макет … просто установите ваши переменные как $viewModel->setVariable('param1', 'param1Value');
и использовать его в виде, как $this->param1
…
Но я думаю, что $ this-> layout () необходим, потому что это естественный
способ передачи содержимого страницы. Если я уберу это и использую равнину
setVariable (‘content’, …) это нарушит соглашения Zend, верно?
Вы абсолютно НЕПРАВИЛЬНЫ, мое приложение полностью основано на Zend MVC, и я никогда не использовал $this->layout()
, как я сказал $this->layout()
возвращает layout view model
Созданный менеджером вида из файла layout.phtml, скрипт, который у вас есть в данный момент, является макетом. setVariable (‘content’, …) — единственный способ, которым вы можете продолжить, и нет другого способа сделать это …
Других решений пока нет …