Уровень представления — это уровень представления приложения MVC. Он отделяет логику приложения от логики представления. В типичном веб-приложении на PHP вся бизнес-логика и дизайн смешаны. Смешивание обеспечивает более быструю разработку в небольшом проекте. Но это с треском проваливается в большом проекте, где задействовано много архитектуры высокого уровня. Чтобы изменить дизайн веб-приложения, разработчик должен также поработать над бизнес-логикой. Это может привести к катастрофическим последствиям, приводящим к нарушению бизнес-логики.
Zend Framework предоставляет продуманный, чистый, гибкий и расширяемый слой View. Слой View доступен в виде отдельного модуля Zend / View и прекрасно интегрируется с модулем Zend / Mvc . Zend View Layer разделен на несколько компонентов, хорошо взаимодействующих друг с другом.
Его различные компоненты следующие:
-
Контейнеры переменных — содержит данные слоя представления.
-
Просмотр моделей — содержит переменные контейнеры и шаблон дизайна.
-
Средства визуализации — обрабатывают данные и шаблон из View Model и выводят представление проекта, возможно, окончательный вывод html.
-
Resolvers — шаблон разрешений, доступный в модели представления, таким образом, чтобы его мог использовать рендерер.
-
Просмотр (Zend \ View \ View) — сопоставляет запрос с средством визуализации, а затем с средством визуализации в ответ.
-
Стратегии рендеринга — Используется View для отображения запроса к рендереру.
-
Стратегии отклика — используются представлением для сопоставления рендерера с откликом.
Контейнеры переменных — содержит данные слоя представления.
Просмотр моделей — содержит переменные контейнеры и шаблон дизайна.
Средства визуализации — обрабатывают данные и шаблон из View Model и выводят представление проекта, возможно, окончательный вывод html.
Resolvers — шаблон разрешений, доступный в модели представления, таким образом, чтобы его мог использовать рендерер.
Просмотр (Zend \ View \ View) — сопоставляет запрос с средством визуализации, а затем с средством визуализации в ответ.
Стратегии рендеринга — Используется View для отображения запроса к рендереру.
Стратегии отклика — используются представлением для сопоставления рендерера с откликом.
Слой вида View обрабатывает ViewModel , разрешает шаблон с помощью Resolver , визуализирует его с помощью стратегии рендеринга и, наконец, выводит его с помощью Response Renderer .
Просмотр конфигурации слоя
Как и контроллер, слой View можно настроить в файле конфигурации модуля, который называется — module.config.php . Основная конфигурация — указать, где будут размещаться шаблоны. Это может быть достигнуто путем добавления следующей конфигурации в «module.config.php».
'view_manager' => [ 'template_path_stack' => ['tutorial' => __DIR__ . '/../view',], ]
По умолчанию слой View имеет поведение по умолчанию для всех его компонентов. Например, ViewModel разрешает имя шаблона действия контроллера внутри корня шаблона по правилу «нижний регистр-имя-модуля / нижний регистр-имя-контроллера / нижний регистр-действие-имя». Однако это может быть переопределено методом setTemplate () в ViewModel.
Контроллеры и View Layer
По умолчанию контроллеру не нужно отправлять какие-либо данные на слой представления. Достаточно написать шаблон в нужном месте.
Например, в нашем примере, TutorialController , шаблон должен быть размещен в myapp / module / Tutorial / view / tutorial / tutorial / index.phtml . Index.phtml ссылается на шаблон на основе PHP, и он будет отображаться PHPRenderer. Существуют и другие средства визуализации, такие как JsonRenderer для вывода json и FeedRenderer для вывода rss и atom .
Полный список выглядит следующим образом —
<?php namespace Tutorial\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class TutorialController extends AbstractActionController { public function indexAction() { } }
Шаблон приложения Zend
<div class = "row content"> <h3>This is my first Zend application</h3> </div>
Наконец, мы успешно завершили модуль Tutorial и можем получить к нему доступ, используя url — http: // localhost: 8080 / tutorial .
Передача данных в слой просмотра
Самый простой способ отправить данные в слой представления — это использовать аргументы ViewModel . Измененный метод indexAction выглядит следующим образом:
public function indexAction() {
$view = new ViewModel([
'message' => 'Hello, Tutorial'
]);
return $view;
}
Теперь измените файл index.phtml следующим образом:
<div class = "row content"> <h3>This is my first Zend application</h3> <h4><?php echo $this->message?></h4> </div>
Просмотр помощников
View Helper используется для написания небольших элементарных функций, которые будут использоваться в шаблонах. Zend Framework предоставляет интерфейс Zend \ View \ Helper \ HelperInterface для написания стандартных помощников вида.
HelperInterface имеет только два метода,
-
setView () — этот метод принимает экземпляр / реализацию Zend \ View \ Renderer \ RendererInterface.
-
getView () — используется для получения этого экземпляра.
setView () — этот метод принимает экземпляр / реализацию Zend \ View \ Renderer \ RendererInterface.
getView () — используется для получения этого экземпляра.
Полный список кодов HelperInterface выглядит следующим образом:
namespace Zend\View\Helper;
use Zend\View\Renderer\RendererInterface as Renderer;
interface HelperInterface {
/**
* Set the View object
*
* @param Renderer $view
* @return HelperInterface
*/
public function setView(Renderer $view);
/**
* Get the View object
*
* @return Renderer
*/
public function getView();
}
Чтобы использовать помощника в вашем скрипте вида, получите к нему доступ с помощью $ this-> helperName () .
Встроенные помощники
Zend Framework предоставляет множество встроенных вспомогательных функций для различных целей. Некоторые из помощников вида, доступных в zend-mvc :
URL
URL-помощник используется для генерации URL-адресов, соответствующих маршрутам, определенным в приложении.
Определение помощника URL —
$this->url($name, $params, $options, $reuseMatchedParameters)
Например, в учебном модуле маршрут называется учебным и имеет два параметра action и id . Мы можем использовать помощник URL для генерации двух разных URL, как показано ниже —
<a href = "<? = $this->url('tutorial'); ?>">Tutorial Index</a>
<a href = "<? = $this->url('tutorial', ['action' => 'show', 'id' =>10]); ?>">
Details of Tutorial #10
</a>
Результат будет следующим:
<a href = "/tutorial">Tutorial Index</a> <a href = "/tutorial/show/10"> Details of Tutorial #10</a>
Заполнитель
Вспомогательный помощник используется для сохранения содержимого между сценариями представления и экземплярами представления. Он предоставляет возможность установить данные изначально, а затем использовать их на более поздних этапах.
Например, мы можем установить, скажем, название компании, а затем использовать его во всех других местах.
<?php $this->placeholder('companyname')->set("TutorialsPoint") ?>
<?= $this->placeholder('companyname'); ?>
Заполнитель предоставляет некоторые дополнительные параметры для генерации сложного содержимого из массива и объектов PHP. Он также имеет возможность захватить определенный раздел самого шаблона.
Например, следующий код захватывает промежуточный результат шаблона и сохраняет его в заполнителе списка продуктов .
Класс — Продукт
class Product {
public $name;
public $description;
}
контроллер
$p1 = new Product(); $p1->name = 'Car'; $p1->description = 'Car'; $p2 = new Product(); $p2->name = 'Cycle'; $p2->description = 'Cycle'; $view = new ViewModel(['products' => $products]);
шаблон
<!-- start capture -->
<?php $this->placeholder('productlist')->captureStart();
foreach ($this->products as $product): ?>
<div>
<h2><?= $product->name ?></h2>
<p><?= $product->description ?></p>
</div>
<?php endforeach; ?>
<?php $this->placeholder('productlist')->captureEnd() ?>
<!-- end capture -->
<?= $this->placeholder('productlist') ?>
Результат
<div class = "foo"> <h2>Car</h2> <p>Car</p> </div> <div class = "foo"> <h2>Cycle</h2> <p>Cycle</p> </div>
Doctype
Помощник Doctype используется для создания различных HTML-типов документов. Это конкретная реализация помощника Placeholder . Тип документа может быть установлен в файле начальной загрузки и в файле конфигурации.
Основное использование показано ниже —
Загрузочный файл приложения
use Zend\View\Helper\Doctype;
$doctypeHelper = new Doctype();
$doctypeHelper->doctype('XHTML5');
Конфигурация модуля
// module/Application/config/module.config.php:
return [
/* ... */
'view_manager' => [
'doctype' => 'html5',
/* ... */
],
];
шаблон
<?php echo $this->doctype() ?>
HeadTitle
Помощник HeadTitle используется для создания элемента заголовка HTML. Это конкретная реализация помощника Placeholder . Zend предоставляет возможность установить заголовок в файле конфигурации модуля, и его можно установить на любом уровне, например, сайт, модуль, контроллер, действие и т. Д. Частичный код для HeadTitle выглядит следующим образом:
модуль
headTitleHelper->append($action); $headTitleHelper->append($controller); $headTitleHelper->append($module); $headTitleHelper->append($siteName);
шаблон
<?= $this->headTitle() ?>
Результат
action - controller - module - Zend Framework
HeadMeta
Помощник HeadMeta используется для создания мета-тегов HTML. Это конкретная реализация помощника Placeholder.
Шаблон —
<?php
$this->headMeta()->appendName('keywords', 'turorialspoint, zend framework, php');
echo $this->headMeta()
?>
Результат
<meta name = "keywords" content = "tutorialspoint, zend framework, php" />
HeadLink
Помощник HeadLink используется для генерации HTML-ссылок для включения внешних ресурсов. Это конкретная реализация помощника Placeholder.
шаблон
<?php
// setting links in a view script:
$this->headLink(['rel' => 'icon', 'href' => '/img/favicon.ico'], 'PREPEND')
->appendStylesheet('/styles/site.css')
->prependStylesheet('/styles/mystyle.css', 'screen', true, ['id' => 'mystyle']);
// rendering the links from the layout:
echo $this->headLink();
?>
Результат
<link href = "/styles/mystyle.css" media = "screen" rel = "stylesheet" type = "text/css" id = "mystyle"> <link href = "/img/favicon.ico" rel = "icon"> <link href = "/styles/site.css" media = "screen" rel = "stylesheet" type = "text/css">
HeadStyle
Помощник HeadStyle используется для генерации встроенных стилей CSS. Это конкретная реализация помощника Placeholder.
шаблон
<?php $this->headStyle()->appendStyle($styles); ?> <?php echo $this->headStyle() ?>
HeadScript
HeadScript используется для создания встроенного сценария или для включения внешних сценариев. Это конкретная реализация помощника Placeholder.
шаблон
<? $this->headScript()->appendFile(‘/js/sample.js’);?> <?php echo $this->headScript() ?>
InlineScript
InlineScript используется для генерации скрипта в секции head и body шаблона html. Он получен из HeadScript.
HtmlList
HTMLList используется для создания упорядоченного и неупорядоченного списка. Определение HTMLList следующее —
Определение
htmlList($items, $ordered, $attribs, $escape)
шаблон
$items = [ '2015', ['March', 'November'], '2016', ]; echo $this->htmlList($items);
Результат
<ul>
<li>2015
<ul>
<li>March</li>
<li>November</li>
</ul>
</li>
<li>2016</li>
</ul>
цикл
Цикл используется для генерации альтернатив в циклической среде. У него есть функция assign, next и prev.
контроллер
$view = new ViewModel(['message' => 'Hello, Tutorial', 'data' => array('One', 'Two')]);
шаблон
<?php $this->cycle()->assign(['#F0F0F0', '#FFF'], 'colors'); ?>
<table>
<?php foreach ($this->data as $datum): ?>
<tr style = "background-color: <?= $this->cycle()->setName('colors')>next() ?>">
<td><?= $this->escapeHtml($datum) ?></td>
</tr>
<?php endforeach ?>
</table>
Результат
<table>
<tr style = "background-color: #F0F0F0">
<td>One</td>
</tr>
<tr style = "background-color: #FFF">
<td>Two</td>
</tr>
</table>
Вот несколько других важных встроенных помощников:
-
BasePath — BasePath используется для генерации пути к общей папке корня приложения.
-
Частичный — Частичный используется для визуализации определенного шаблона в его собственной области видимости переменной.
-
PartialLoop — PartialLoop похож на Partial, но используется в циклической среде.
-
Идентификация. Идентификация используется для получения идентификатора вошедшего в систему пользователя из службы аутентификации.
-
JSON — JSON используется в спокойной среде, где выходные данные представлены в формате JSON. Он излучает правильный заголовок HTTP и отключает концепцию макета.
BasePath — BasePath используется для генерации пути к общей папке корня приложения.
Частичный — Частичный используется для визуализации определенного шаблона в его собственной области видимости переменной.
PartialLoop — PartialLoop похож на Partial, но используется в циклической среде.
Идентификация. Идентификация используется для получения идентификатора вошедшего в систему пользователя из службы аутентификации.
JSON — JSON используется в спокойной среде, где выходные данные представлены в формате JSON. Он излучает правильный заголовок HTTP и отключает концепцию макета.
В Zend Framework все еще есть много помощников, таких как помощник i18n, помощники по формам, помощники по разбиению на страницы, помощники по навигации и т. Д.
Создание помощников вида
Zend Framework предоставляет встроенный AbstractHelper, реализующий HelperInterface для написания помощников вида.
Шаги, связанные с написанием нового помощника, следующие:
-
Шаг 1 — Расширение класса Zend \ View \ Helper \ AbstractHelper.
-
Шаг 2 — Переопределите функцию __invoke () .
-
Шаг 3 — Установите конфигурацию в файле module.config.php .
-
Шаг 4 — Использование помощника вида в скриптах вида.
Шаг 1 — Расширение класса Zend \ View \ Helper \ AbstractHelper.
Шаг 2 — Переопределите функцию __invoke () .
Шаг 3 — Установите конфигурацию в файле module.config.php .
Шаг 4 — Использование помощника вида в скриптах вида.
Давайте теперь создадим TestHelper
Создайте папку Helper в каталоге myapp / module / Tutorial / src / View . Напишите TestHelper в каталоге Helper, TestHelper.php .
Полный список выглядит следующим образом —
<?php
namespace Tutorial\View\Helper;
use Zend\View\Helper\AbstractHelper;
class TestHelper extends AbstractHelper {
public function __invoke() {
$output = "I am from test helper";
return htmlspecialchars($output, ENT_QUOTES, 'UTF-8');
}
}
Установите конфигурацию в module.config.php .
'view_helpers' => [
'aliases' => [
'testHelper' => View\Helper\TestHelper::class,
],
'factories' => [
View\Helper\TestHelper::class => InvokableFactory::class,
],
],
Используйте только что созданный TestHelper в скрипте about .
