Использование поля типа Repeater

Зачем нужно и почему это удобно?

Данный тип поля удобно использовать в том случае, если необходимо к определённой сущности добавить поле, в котором будет храниться несколько однотипных сущностей другого типа. В качестве объяснения, с моей точки зрения идеально подойдет сущность типа "рецепт", для которой, предположим, нам надо придумать в каком именно виде будут храниться рецепты. Что обычно можно сделать в данном случае? На самом деле способов несколько: 

1. Создать сущность типа "ингредиент" и хранить связь в отдельной таблице. По времени это будет дольше и возможно придётся заморочиться. 

2. Создать несколько полей. Например: ингредиент 1, ингредиент 2 и так далее. Но во-первых, мы не можем заранее знать сколько у нас будет ингредиентов в рецепте. Во-вторых, у самой сущности типа "ингредиент" могут быть дополнительные атрибуты, такие как "количество" или "комментарий". И тут уже ничего не останется кроме как создавать дополнительные поля. 

3. Использовать поле типа Repeater, в котором вся структура будет храниться в формате JSON (именно этот вариант и рассмотрим).

Недостатки или в каком случае использовать не рекомендуется? 

Поскольку данные хранятся в поле типа JSON, поэтому и недостатки все отсюда вытекающие: по данному типу поля не поддерживается поиск, не будет работать пагинация и т. д. 

Как использовать данный тип поля в October CMS?

Backend

Все действия будут производиться через плагин Builder. 

1. Добавляем поле в таблице через раздел Database. Я создал поле ingredients с типом text.

2. Добавляем поле типа Repeater в разделе Models. Необходимо будет указать название поля и подпись. Дальше, собственно, в самом этом поле необходимо добавить другие поля, которые будут ничем иным как полями в JSON объекте. Как это сделать? Ниже названия поля есть вертикальная черта, а уже справа от неё кнопка "Add control". Вот на нёё и кликаем. Я создал такие поля: 

  • name, тип "Text"; 
  • count, тип "Text".

3. В файл модели добавляем свойство:

protected $jsonable = ['ingredients'];

Собственно, этого будет достаточно, чтобы поле стало доступным для заполнения. 

Frontend

Вывести во view данный тип поля можно так: 

<ul>
{% for ingredient in record.ingredients %}
  <li>
    {{ ingredient.name }} : {{ ingredient.count }}
  </li>
{% endfor %}
</ul>

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.