Многие приложения имеют небольшие блоки кода, который должен быть на каждой странице, иногда в разных местах. Cake может помочь вам повторять куски вашего веб-сайта, которые нужно неоднократно использовать. Эти повторяющиеся части называются элементами. Реклама, блоки помощи, навигационный контроль, дополнительные меню и выноски представлены в Cake как элементы. Элемент это в основном мини-отображение, которое можно включать в другие отображения. Элементы могут быть использованы для того, чтобы сделать ваше отображение более удобочитаемым, размещая повторяющиеся элементы в свои собственные файлы. Они также могут помочь вам повторно использовать фрагменты содержимого в вашем приложении.
Элементы обитают в каталоге /app/views/elements/, и имеют расширение .ctp.
<?php echo $this->element('helpbox'); ?>
Вы можете передавать данные элементу через второй аргумент элемента:
<?php echo
$this->element('helpbox',
array("helptext" => "Да, этот текст очень полезен."));
?>
Внутри файла элемента, все переданные переменные доступны, как члены массива (таким же образом, как set() в контроллере работает с файлами отображений).
В примере выше файл /app/views/elements/helpbox.ctp может использовать переменную $helptext.
<?php
echo $helptext; //выводит "Да, этот текст очень полезен."
?>
Функция element() комбинирует настройки для элемента с передаваемыми данными. Две настройки: 'cache' и 'plugin'. Пример:
<?php echo
$this->element('helpbox',
array(
"helptext" => "Это передано в элемент как $helptext"
"foobar" => "Это передано в элемент как $foobar"
"cache" => "+2 days" //устанавливает кэширование в +2 days.
"plugin" => "" //для выполнения элемента из плагина
)
);
?>
Для кэширования различных версий одного и того же элемента в приложении, доступен уникальный ключ кэша, использующий следующий формат:
<?php
$this->element('helpbox',
array(
"cache" => array('time'=> "+7 days",'key'=>'unique value')
)
);
?>
Вы можете получить все преимущества элементов, используя requestAction(). Функция requestAction() выбирает переменные отображения из действия контроллера и возвращает их в виде массива. Это позволяет вашим элементам соответствовать стилю MVC. Создайте действие контроллера, которое подготовит переменные отображения для ваших элементов, затем вызовите requestAction() внутри второго параметра функции element(), для передачи элементу переменных отображения из контроллера.
Для того, чтобы сделать это, добавьте в ваш контроллер что-то, похожее на следующее:
<?php
class PostsController extends AppController {
...
function index() {
$posts = $this->paginate();
if (isset($this->params['requested'])) {
return $posts;
} else {
$this->set(compact('posts'));
}
}
}
?>
И затем, в элементе мы можем получить доступ к пронумерованной модели постов (posts). Для получения последних пяти постов в упорядоченный список мы должны сделать нечто подобное:
<h2>Последние посты</h2>
<?php $posts = $this->requestAction('posts/index/sort:created/order:asc/limit:5'); ?>
<?php foreach($posts as $post): ?>
<ol>
<li><?php echo $post['Post']['title']; ?></li>
</ol>
<?php endforeach; ?>