Связывание записей с другими записями
Связывание данных для расширения возможностей

ExpressionEngine позволяет вам создавать зависимости между записями в различных разделах, или между записями раздела и записями галереи.

Зачем связывать записи с другими записями?

Вот пример для иллюстрации того, зачем создавать связи (отношения) между записями.

Владелец ночного клуба

Представьте, что вы владелец ночного клуба, в котором различные музыканты выступают по ночам. Для рекламы вашего клуба вы решили создать сайт на основе ExpressionEngine, чтобы отображать информацию о каждом ночном событии.

Каждый день вы публикуете новую запись с информацией об отдельном ночном событии. В публикации вы также включаете подробную информацию о каждом исполнителе (имя, биография, дискография, и т.д.), но так как многие из исполнителей появляются регулярно в вашем клубе, в течение долгого времени, то у вас появится большое количество повторяющейся информации в ваших записях. Если информация об исполнителе изменяется, то вы должны будете обновить ее в каждой записи, где она упоминается. Очень скоро вы понимаете, что это не очень эффективно.

Если бы только вы могли поддерживать второй раздел, в котором вы могли хранить только информацию о каждом исполнителе, и затем использовать ее так или иначе в основном разделе, так, чтобы не было дублирования информации. И что же? Вы можете сделать это с помощью связей.

В приведенном выше примере, ваш основной раздел (давайте будем называть его события), содержал бы только информацию, которая является уникальной для отдельной ночи, как например дата, время, любая специальная оценка, и т.д., и второй раздел (давайте будем называть его исполнители), в котором содержалась бы только информацию о каждом исполнителе. Тогда вы динамически получали бы информацию о каждом исполнителе в соответствующий раздел события. Посетителям вашего сайта информация отображалась бы точно так же, как из обычной записи раздела, но внутри, ExpressionEngine получал бы информацию из одной записи и отображал бы ее в пределах другой записи.

Следующий рисунок иллюстрирует эту концепцию. Раздел "события" слева, отображает информацию из раздела "исполнители" справа. Между записями существует только связь. Сами данные никогда не дублируются.

Каждая запись раздела может быть связана с одной или более записями из другого раздела и/или с записью из вашей галереи изображений.

Настройка связей

Необходимо выполнить два шага для настройки связи, более подробно они описаны ниже:

  1. Создание связи между разделом и другим разделом (или галереей).
  2. Добавьте тег "related entry" в ваши шаблоны, для того, чтобы можно было отображать связанные записи.

После настройки связи, всякий раз при посещении страницы ПУБЛИКОВАТЬ для создания нового контента, вы увидите, что выпадающее меню заполнено заголовками всех записей, из связанного раздела или галереи. Выберите отдельную запись из списка, и вот... записи будут связанными.

1. Создание связи

Связь определяется в менеджере заказных полей, который расположен в панели управления:

Admin > Управление разделами > Заказные поля разделов

Заказные поля могут нескольких типов, включая тип связь. Если вы выбираете тип заказного поля "связь", вам будет предложено выбрать с каким разделом или галереей необходимо ассоциировать это поле. После настройки связи, вы увидите выпадающее меню на странице ПУБЛИКОВАТЬ, в котором отображаются заголовки всех записей в связанном разделе или галерее.

2. Добавление тега related entry в ваш шаблон.

Для отображения связанной записи вам необходимо использовать следующие теги:

{related_entries id="field_name"}

{/related_entries}

Примечание: Параметр id должен содержать имя поля того заказного поля, которое содержит связь. Например, если имя вашего заказного поля performers, то вы должны использовать:

{related_entries id="performers"}

{/related_entries}

Важно: Приведенные выше теги должны размещаться внутри тега {exp:weblog:entries}.

Ниже приведен пример использования тега related entries в теге weblog entry:

{exp:weblog:entries weblog="news" limit="15"}

<h3>{title}</h3>

{body}

{related_entries id="performers"}
 <h2>{title}</h2>
 {body}
{/related_entries}

Submitted on: {entry_date format='%M %d, %Y'}

{/exp:weblog:entries}

{if no_related_entries} Conditional

Условный оператор {if no_related_entries} позволяет вам определить контент, который будет отображаться, если запись не имеет связанной записи.

{exp:weblog:entries weblog="news" limit="15"}

<h3>{title}</h3>

{body}

{related_entries id="performers"}
 {if no_related_entries}
  <h2>No Performer Information Available</h2>
 {/if}
 <h2>{title}</h2>
 {body}
{/related_entries}

Submitted on: {entry_date format='%M %d, %Y'}

{/exp:weblog:entries}

Какие типы связанных данных можно отображать?

Почти что все, что доступно в тегах weblog entries и gallery entries, можно отображать, как связанные данные.

Важно:  Для повышения быстродействия все связанные данные записей кэшируются системой, при отправке записей со страницы публиковать. В связи с этим возникает побочный эффект работы некоторых элементов, которые обычно являются динамическими, и поэтому они становятся недоступными для использования. Сюда входят различные статистические переменные:

{view_count_one}
{view_count_two}
{view_count_three}
{view_count_four}
{expiration_date }
{comment_expiration_date}
{recent_comment_date}
{comment_total}
{trackback_total}

Примеры:

Галерея:  Чтобы показать запись галереи в пределах записи раздела, вы можете использовать код наподобие этого:

{exp:weblog:entries weblog="news" limit="15"}

<h3>{title}</h3>

{body}

{related_entries id="gallery"}

   <div class="gallery">
   <img src="{image_url}" width="{width}" height="{height}" border="0" alt="{title}" title="{title}" />
   </div>
   <h3>{title}</h3>
   {caption}

{/related_entries}

Submitted on: {entry_date format='%M %d, %Y'}

{/exp:weblog:entries}

Примечание: Никогда не размещайте теги открытия/закрытия галереи внутри тегов related_entries. Размещайте ТОЛЬКО переменные и код HTML, которые вы хотите отображать.  Также обратите внимание, что вы можете создавать связи только из записи раздела в запись галереи. Вы не можете сделать наоборот, то есть, отправить новую запись галереи, в которой содержится указатель (связь) на запись раздела.

Раздел:  Чтобы связать запись раздела с другой записью, вам необходимо использовать код, подобный приведенному ниже:

{exp:weblog:entries weblog="news" limit="15"}

<h3>{title}</h3>

{body}

{related_entries id="weblog"}

   {date_heading}
   <h3 class="date">{entry_date format=' %l, %F %d, %Y '}</h3>
   {/date_heading}

   <h2 class="title">{title}</h2>
   {summary}

   <div class="posted">Posted by <a href="{profile_path=member/index}">{author}</a> on {entry_date format='%m/%d'}

   {categories}
   <a href="{path=SITE_INDEX}">{category_name}</a>
   {/categories}

{/related_entries}

Submitted on: {entry_date format='%M %d, %Y'}

{/exp:weblog:entries}

Как указано выше: Никогда не размещайте открывающие/закрывающие теги записи внутри тегов related_entries. Размещайте ТОЛЬКО переменные и код HTML, которые вы хотите отображать.

Наверх страницы