Представления¶
Представления (views) - это V в MVC. Они отвечают за генерацию ответа на запрос. Часто этот ответ возвращается в HTML, XML, или JSON, однако работа с потоковыми файлами, создание PDF файлов, которые могут скачивать пользователи, тоже осуществляется в слое представления.
Шаблоны представлений¶
Слой представления в CakePHP - это способ общения с пользователями. Большую часть времени ваши представления будут отдавать (X)HTML документы браузерам, но, возможно, вы захотите сохранить AMF данные в Flash объект, ответить удаленному приложению через SOAP, или выдать CSV файл пользователю.
По умолчанию файлы представлений CakePHP написаны на PHP и имеют расширение .ctp (CakePHP шаблон). Эти файлы содержат всю логику отображения данных, полученных от контроллера, в необходимом для получателя формате. Если вы предпочитаете такие языки шаблонов, как Twig или Smarty, то подкласс класса View станет связующим звеном между необходимым языком шаблона и CakePHP.
Файлы представлений находятся в /app/View/, в папке с названием контроллера, в котором используются и называются так же, как и соответствующие действия в этом контроллере. Например, файл представления для действия “view()” контроллера Products обычно находится в /app/View/Products/view.ctp.
Слой представления в CakePHP может состоять из разных частей. Каждая часть имеет различное назначение и будет рассмотрена в этой главе:
- представления: части страницы, образуют “мясо” ответа приложения.
- элементы: маленькие, многократно используемые шаблоны. Обычно используются внутри представлений.
- лэйауты: шаблоны, в которые в процессе формирования ответа вставляется код представлений и элементов. Типичный пример такой страницы - шапка и подвал сайта, между которыми вставляются представления различных действий.
- помощники: эти классы заключают в себе логику, которая необходима во многих местах в слое представления. Между прочим, помощники в CakePHP могут помочь в построении форм, AJAX функционала, постраничного вывода данных модели, или вывода RSS лент.
Лэйауты¶
Лэйауты (layouts) содержат код представления, это обертка для представлений. Все, что вы хотели бы увидеть во всех шаблонах представлений необходимо поместить в лэйаут.
Файлы лэйаутов должны быть в /app/View/Layouts. Лэйаут по умолчанию в CakePHP переопределяется с помощью создания нового в /app/View/Layouts/default.ctp. Как только лэйаут default создан, все представления (если в контроллере им не назначен другой лэйаут) будут вставляться внутрь него при отображении страницы.
Когда вы создаете лэйаут, вам нужно указать, куда будет вставляться код представлений. Для этого поместите в нужное место в лэйауте вывод переменной $content_for_layout. Далее приведен пример как должен выглядеть лэйаут default:
<!DOCTYPE html>
<html lang="en">
<head>
<title><?php echo $title_for_layout?></title>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<!-- Вставьте внешние файлы и скрипты сюда (см. помощник HTML для детальной информации) -->
<?php echo $scripts_for_layout ?>
</head>
<body>
<!-- Здесь вы можете добавить меню, которое будет во всех представлениях -->
<div id="header">
<div id="menu">...</div>
</div>
<!-- Тут будут вставляться представления -->
<?php echo $content_for_layout ?>
<!-- Подвал для каждой страницы -->
<div id="footer">...</div>
</body>
</html>
$scripts_for_layout содержит любые внешние файлы и скрипты, загруженные с помощью встроенного помощника HTML. Полезен для вставки javascript и CSS файлов из представлений.
Примечание
При использовании HtmlHelper::css() или HtmlHelper::script() в файлах представлений, укажите ‘false’ для параметра ‘inline’, чтобы вставить генерируемый html код в $scripts_for_layout. (см. API для более подробной информации).
$content_for_layout содержит представление. Это место, где будет размещен код представления.
$title_for_layout содержит заголовок страницы. Эта переменная генерируется автоматически, но вы можете ее переопределить в контроллере/представлении.
Установить заголовок страницы проще всего в контроллере с помошью метода set:
class UsersController extends AppController {
function view_active() {
$this->set('title_for_layout', 'View Active Users');
}
}
Также можно установить переменную $title_for_layout внутри файла представления:
$this->set('title_for_layout', $titleContent);
Вы можете делать сколько угодно лэйаутов: просто поместите их в папку app/View/Layouts и переключайтесь между ними в действиях контроллера используя аттрибут контроллера или представления $layout
// в контроллере
function admin_view() {
// код
$this->layout = 'admin';
}
// в файле представления
$this->layout = 'loggedin';
Например, если раздел моего сайта содержит меньше места для рекламного баннера, я мог бы сделать новый лэйаут с учетом места для этого баннера и применить его для всех действий в контроллере:
class UsersController extends AppController {
public function view_active() {
$this->set('title_for_layout', 'View Active Users');
$this->layout = 'default_small_ad';
}
public function view_image() {
$this->layout = 'image';
//вывод изображения пользователя
}
}
CakePHP имеет два основных лэйаута (не считая default лэйаут), которые вы можете использовать в своих приложениях: ‘ajax’ и ‘flash’. Лэйаут ajax удобен при разработке ajax ответов - это пустой лэйаут (для большенства ajax ответов требуется лишь небольшая разметка, а не весь интерфейс). Лэйаут flash используется для сообщений, выводимых вызовом метода Controller::flash().
Три остальные лэйаута - xml, js, и rss, созданы для быстрого и легкого способа выдачи контента, не являющегося text/html.
Элементы¶
Многие приложения содержат маленькие блоки кода представления, которые повторяются от страници к странице, иногда в разных местах в лэйауте. CakePHP может помочь вам в повторном использовании такого кода. Эти многократно используемые части называются элементами. Реклама, блоки с помощью, навигация, меню, формы авторизации и сноски часто создаются в CakePHP в виде элементов. Иными словами, элемент - это мини представление, которое можно вставить в в другие представления, в лэйауты и даже в другие элементы. Элементы могут использоваться для того, чтобы сделать представления более читабельными, хранения кода элемента в отдельном файле.
Элементы живут в папке /app/View/Elements/, это файлы с расширением .ctp. Они выводятся с помощью метода представления element:
echo $this->element('helpbox');
Передача переменных в элемент¶
Вы можете передавать данные в элемент через второй параметр метода element:
echo $this->element('helpbox', array(
"helptext" => "Ах, этот текст очен полезен."
));
Внутри файла элемента все переданные переменные, доступны, как члены ассоциативного массива (точно также, как и Controller::set() в контроллере работает с файлами представления). В предыдущем примере в файле /app/View/Elements/helpbox.ctp доступна переменная $helptext:
// внутри app/View/Elements/helpbox.ctp
echo $helptext; //выведет "Ах, этот текст очен полезен."
Метод View::element() поддерживает такие опции элемента, как ‘cache’, ‘callbacks’ и ‘plugin’. Пример:
echo $this->element('helpbox', array(
"helptext" => 'Это передается в элемент, как $helptext',
"foobar" => 'Это передается в элемент, как $foobar',
),
array(
"cache" => "long_view", // включает конфигурацию кеша "long_view"
"plugin" => "", // рендерить элемент из плагина
"callbacks" => true // установите true чтобы методы before/afterRender вызывались для элемента
)
);
Кеширование элемента происходит через класс Cache. Для элемента вы можете установить любую настроенную в Cache конфигурацию кеша. Это обезпечивает вам большую гибкость в выборе того, где и как долго элементы будут храниться. Чтобы закешировать разные версии одного и того же элемента в приложении, укажите уникальный ключ кеша, используя следующий формат:
$this->element('helpbox', array(), array(
"cache" => array('config' => 'short', 'key' => 'уникальное значение')
)
);
Вы можете получить полное преимущество элементов, используя requestAction(). Метод requestAction() получает переменные от действия контроллера и возвращает их в массиве. Это дает возможность выполнять элементы в истинном стиле MVC. Создайте действие в контроллере, которое подготовит переменные представления для ваших элементов, затем вызовите requestAction() внутри второго параметра метода element(), чтобы передать переменные из контроллера.
Чтобы сделать это, в контроллере добавьте что-то как в следующем примере для контроллера Post:
class PostsController extends AppController {
...
function index() {
$posts = $this->paginate();
if (isset($this->params['requested'])) {
return $posts;
} else {
$this->set('posts', $posts);
}
}
}
Затем в элементе мы получим доступ к модели постов, разбитой постранично. Чтобы получить последние пять постов отсортированных по дате создания, сделаем следующее:
<h2>Последние посты</h2>
<?php $posts = $this->requestAction('posts/index/sort:created/direction:asc/limit:5'); ?>
<?php foreach ($posts as $post): ?>
<ol>
<li><?php echo $post['Post']['title']; ?></li>
</ol>
<?php endforeach; ?>
Кеширование элементов¶
Вы можете кешировать элементы в CakePHP, если укажете соответствующий параметр. Если он выставлен в true, для кеширования элемента будет использована конфигурация ‘default’. С другой стороны вы можете указать конфигурацию кеширования. См. детальную информацию по настройке Cache /core-libraries/caching. Приведем простой пример кеширования элемента:
echo $this->element('helpbox', array(), array('cache' => true));
Если вы используете один и тот же элемент с кешированием несколько раз в одном представлении, убедитесь, что используете разные ключи кеширования, иначе все элементы будут выглядеть как первый элемент. Например:
echo $this->element(
'helpbox',
array('var' => $var),
array('cache' => array('key' => 'first_use', 'config' => 'view_long')
);
echo $this->element(
'helpbox',
array('var' => $differenVar),
array('cache' => array('key' => 'second_use', 'config' => 'view_long')
);
В данном примере элементы будут кешированы по отдельности. Если вы хотите чтобы все элементы использовали одну конфигурацию кеша, вы можете установить атрибут View::$elementCache в необходимую конфигурацию кеша. CakePHP будет использовать эту конфигурацию по умолчанию.
Получение элементов из плагина¶
Если вы используете плагин и хотите получить из него элементы, просто укажите имя плагина в соответствующем параметре. Если представление отображается для действия контроллера плагина, то элемент автоматически будет взят из этого плагина. Если в соответствующем плагине нет запрашиваемого элемента, CakePHP будет искать его в папке APP приложения.:
echo $this->element('helpbox', array(), array('plugin' => 'pluginname'));
API представления¶
- class View¶
Методы представления доступны во всех представлениях, элементах и файлах лэйаутов. Чтобы вызвать любой метод представления используйте $this->method()
- View::set(string $var, mixed $value)¶
Представления имеют метод set(), аналогичный методу set() в контроллерах. Использование set() из представления позволит добавить переменную в лэйаут и элементы, которые будут использованы далее. См. Методы Контроллера(Controller Methods) для получения подробной информации об использовании set().
В файле представления вы можете сделать следующее:
$this->set('activeMenuButton', 'posts');
После этого в лэйауте станет доступной переменная $activeMenuButton, содержащая значение ‘posts’.
- View::getVar(string $var)¶
Получает значение переменной $var из viewVar
- View::getVars()¶
Получает список всех доступных переменных представления в текущей области видимости. Возвращает массив имен переменных.
- View::element(string $elementPath, array $data, array $options = array())¶
Отображает элемент. См. раздел Элементы для получения детальной информации с примерами.
- View::uuid(string $object, mixed $url)¶
Генерирует уникальный не случайный DOM ID для объекта, основываясь на типе объекта и url. Это метод часто используется помощниками, которым нужна генерация уникальных DOM ID для элементов, например JsHelper:
$uuid = $this->uuid('form', array('controller' => 'posts', 'action' => 'index')); //$uuid содержит 'form0425fe3bad'
- View::addScript(string $name, string $content)¶
Добавляет контент в внутренний буфер скриптов. Этот буфер доступен в лэйауте в переменной $scripts_for_layout. Этот метод нужен для помощников, которым необходимо добавлять javascript или css файлы непосредственно в лэйаут. Имейте в виду, что скрипты, добавленные в лэйауте или элементах, находящихся в лэйауте, не будут добавлены в $scripts_for_layout. Этот метод часто используется в таких помощниках, как /core-libraries/helpers/js и /core-libraries/helpers/html.
- property View::$layout¶
Устанавливает лэйаут для текущего представления.
- property View::$elementCache¶
Конфигурация кеша, использующаяся для кеширования элементов. Изменение этого свойства, влияет на конфигурацию кеширования по умолчанию для элементов. Это значение может быть переопределено использованием опции ‘cache’ в методе отображения элемента.
- property View::$request¶
Экземпляр CakeRequest. Используйте его для доступа к информации о текущем запросе.
- property View::$output¶
Содержит последние отображаемое содержимое из представления, либо файл представления, или содержимое лэйаута.