Использование поля типа 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>
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()