Уровень представления — это уровень представления приложения 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 .