Использование блока Express объекта для вывода данных
Когда вы создали Express объекты и связи между ними, вам нужно как-то вывести эту информацию для публичного доступа на сайте. Давайте возьмем наш пример с Гаванью и Лодками. У нас есть страницы для каждой гавани, и мы хотели бы показать какие лодки находятся в каждой гавани на этих страницах.
Здесь показано как мы достигнем этой цели
- Во-первых, мы создадим атрибут страницы, который свяжет каждую Гавань с соответствующей ей страницей.
- Потом, мы добавим блок Детали Express объекта на каждую страницу, и настроим на показ express атрибута.
- Затем, создадим свой шаблон для этого блока, который будет брать с текущей страницы данные express объекта, находить соответствующие этому объекту лодки и выведет подходящие данные на странице.
Видео
Если вы хотите посмотреть видео показывающее все шаги, то вот оно:
Атрибут
Сначала, мы создадим Express Entity атрибут страницы, как на фото:
Then, apply the attribute to each page on the front-end:
Блок вывода данных (Подробно)
Добавьте блок вывода данных Express объекта на подходящую страницу с гаванью. Настройте его брать пользовательский атрибут с текущей страницы:
Пользовательский Шаблон
Наконец, мы создадим пользовательский шаблон, и применим его к текущему блоку. Узнайте как создавать пользовательские шаблоны блоков здесь... Вот как выглядит наш пользовательский шаблон:
<?php defined('C5_EXECUTE') or die(_("Access Denied.")); ?>
<?php
if (isset($entry) && is_object($entry)) {
$boats = $entry->getBoats();
?>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Year</th>
<th>Owner</th>
<th>Classification</th>
</tr>
</thead>
<tbody>
<?php if (count($boats)) {
foreach($boats as $boat) { ?>
<tr>
<td><?=$boat->getBoatName()?></td>
<td><?=$boat->getBoatYear()?></td>
<td><?=$boat->getBoatOwner()?></td>
<td><?=$boat->getBoatClass()?></td>
</tr>
<?php } ?>
<?php } else { ?>
<tr>
<td colspan="4">No boats found.</td>
</tr>
<?php } ?>
</tbody>
</table>
<?php } ?>
Это должно быть достаточно понятно. У нашего класса Express нет метода getBoats(), и у express объекта Лодка нет метода getBoatClass(), getBoatYear(), и так далее.... Но у Concrete\Core\Entity\Express\Entry
объекта есть магический метод, который определит соответствует ли вызванный метод пользовательскому идентификатору атрибута, или идентификатору связи. Таким образом, у нас будет красивая программа работающая с нашими Express объектами.