Списки
В разделе Списки Вы можете создавать и управлять коллекциями однотипных данных, таких как, например, "Пользователи" или "Товары". Для работы со Списками, знания языков Баз Данных не требуются.
Советуем пройти краткий курс обучения по данному разделу.
Создание списка
При создании нового списка определяется модель данных, населяющих его в будущем.
Поле "Название" несёт косметическую функцию и просто определят описание предназначения списка.
Поле "Ключ" обязательно к указанию и определяет адрес для программного обращения к списку.
Поля элементов списка
Модель данных нового списка содержит несколько стандартных полей:
- name (string) — название элемента
- id (number, только чтение) — уникальный числовой идентификатор по всему сайту, авто-генерируется при создании каждого элемента
- key (string) — условно-уникальный ключ элемента, авто-генерируется при создании каждого элемента
- status (string) — статус доступности и активности элемента
- tags (array of string) — тэги элемента
- created_at (date, только чтение) — дата создания
- updated_at (date, только чтение) — дата последнего изменения
- fields (object) — объект, содержащий дополнительные поля
Каждый элемент любого списка всегда будет снабжён такими полями. Однако, эти поля носят, в основном, утилитарную функцию и для нужд Вашего проекта следует определить дополнительные поля, либо при Создании, либо позднее при Настройке списка.
У каждого дополнительного поля есть несколько параметров:
- Ключ — ключ, для для программного обращения к полю элемента списка
- Название — описание предназначения поля и/или для отображения на сайте
- Тип поля — тип данных, хранимых в данном поле. Возможные варианты:
- Число (number) — числовое значение (цельное или дробное)
- Строка (string) — одиночная текстовая строка
- Текст (string) — полноценный текст, с переносами
- Переключатель (boolean) — бинарное ("да"/"нет") значение
- Файл (string) — путь к файлу
Внимание при удалении поля, безвозвратно удаляются и все значения данного поля по всему списку! Пожалуйста не забывайте делать резервное копирование всей коллекции, перед удалением полей.
Добавление данных
Перейдя по ссылке Ключа или Названия списка, Вы оказываетесь в самом списке, где можно
- Добавить новый элемент вручную
- Импортировать целую коллекцию
- Отредактировать элемент
- Удалить элемент
Выбрав Добавление или Редактирования элемента, Вы оказываетесь в режиме его правки:
Следует отметить, что:
- флаг Публикации изымает элемент из выкладки, если он выставлен на "Скрыто"
- содержание поля Тэги конвертируется в массив строковых значений и представлен, как единая строка лишь для удобства редактирования
- значение поля Ключ не может быть пустым
- значение дополнительного поля типа Файл может быть произвольным URL-адресом. Файл, загруженный в это поле будет доступен в файлах, в поддиректории
/uploads/feed/[имя списка]/[id элемента]/[год]/[месяц]/[число]/
- при сохранении изменений, в файлах, в поддиректории
/versions/feed_item/[id элемента]
будет создана резервная копия данных в формате JSON
Импорт данных
На странице Импорта можно массово мигрировать данные или производить добавление сразу нескольких элементов списка в рамках одной операции. Если Вы желаете перенести Вашу базу данных в Tabula — обратите внимание на формат и структуру данных примера.
Стоит иметь в виду, что значения полей name
и key
будут записаны в корне тела элемента, в то время, как остальные значения полей будут помещены в подобъект fields
, а поля name
и status
будут доступны в обоих контекстах. Так, имея JSON импорта вида
[
{
"name": "Портсигар",
"key": "pagefmsq6bafq0",
"title": "отечественный",
"count": 2,
"available": true,
"img": "uploads/feed/items/4577/2020/12/20/portsigar.png"
},
{
"name": "Куртка",
"key": "page8nu8y9upd5",
"title": "замшевая",
"count": 3,
"available": true,
"img": "uploads/feed/items/4578/2020/12/20/jacket.png"
}
]
результатом импорта станет список элементов с конструкцией:
[
{
"fields": {
"status": "ok",
"name": "Портсигар",
"title": "отечественный",
"count": 2,
"available": true,
"img": "uploads/feed/items/4577/2020/12/20/portsigar.png"
},
"id": 4577,
"key": "pagefmsq6bafq0",
"tags": [],
"status": "ok",
"name": "Портсигар",
"created_at": "2020-12-20T15:55:37Z",
"updated_at": "2020-12-20T16:06:58Z"
},
{
"fields": {
"status": "ok",
"name": "Куртка",
"title": "замшевая",
"count": 3,
"available": true,
"img": "uploads/feed/items/4578/2020/12/20/jacket.png"
},
"id": 4578,
"key": "page8nu8y9upd5",
"tags": [],
"status": "ok",
"name": "Куртка",
"created_at": "2020-12-20T15:55:37Z",
"updated_at": "2020-12-20T16:06:58Z"
}
]
Примите во внимание, что:
- все, определённые в модели списка, поля должны присутствовать в импортируемых объектах данных
- импорт всегда пытается создать новый элемент списка и при попытке импорта элемента с, уже присутствующим в базе, полем
key
будет выдана ошибка
Использование
В основном списки нужны для двух целей: вывода полного перечня данных списка и отображения конкретного элемента списка. Для выполнения этих задач, на каждой странице доступен ряд настроек и переменных.
Вывод полного списка
Что бы иметь возможность вывода списка на странице нужно сперва настроить Динамический Элемент вывода. Для этого на странице редактирования, под Содержанием, добавьте новый элемент, с именем переменной, через которую Вы сможете выводить данные в содержание:
После регистрации элемента он сразу же становится доступным в содержании, но Вы можете, дополнительно, настроить его свойства вывода данных:
- Список — выбор списка, элементы которого будут доступны для вывода
- Фильтр — установка одного или нескольких фильтров по полям
name
,tags
и дополнительным полям элементов списка. Фильтрация осуществляется проверкой тождественности - Номер страницы — начальный номер страницы, при постраничном выводе,
{{page_num}}
, если номер страницы должен быть взят из URL текущей страницы - На странице — количество элементов на одной странице вывода, при постраничном выводе
- Сортировка — по стандартным полям
key
,created_at
,updated_at
и дополнительным полям числового типа - Пагинация — генератор ссылок страниц постраничного вывода. Активно, если Ссылок пагинации выставлено больше, чем 0
- Ссылок пагинации — количество ссылок в пагинации
- До URL — текстовый префикс перед номером странице в ссылке
- После URL — текстовый суффикс после номера страницы в ссылке
- URL первой страницы — URL первой страницы, если её адрес отличен по формату от последующих
Настроив таким образом вывод списка, по его подобъекту .items
теперь возможна итерация в содержании страницы:
<ul>
{{#each items_list.items}}
<li id="{{key}}">
<img src="{{../cdn}}/{{fields.img}}">
<label>{{name}} ×{{fields.count}}</label>
{{#if title}}<span>({{title}})</span>{{/if}}
</li>
{{/each}}
</ul>
<style>
ul {white-space: pre; list-style: none; display: inline-flex;}
ul img {max-width: 100px;}
</style>
Результат:
<ul>
<li id="pagefmsq6bafq0">
<img src="https://t29.tcdn.site/uploads/feed/items/4577/2020/12/20/portsigar.png">
<label>Портсигар ×2</label>
<span>(отечественный)</span>
</li>
<li id="page8nu8y9upd5">
<img src="https://t29.tcdn.site/uploads/feed/items/4578/2020/12/20/jacket.png">
<label>Куртка ×3</label>
<span>(замшевая)</span>
</li>
</ul>
<style>
ul {white-space: pre; list-style: none; display: inline-flex;}
ul img {max-width: 100px;}
</style>
Постраничный вывод
Имея обширную базу данных, её полный вывод на одной странице целиком, как правило, не является целесообразным. И логистически, и с точки зрения удобства для пользователя. Хорошей практикой в таком случае считается постраничный вывод. Платформа Tabula предлагает для этих целей ряд инструментов.
Для начала стоит решить, чем будет передаваться выбор номера страницы при запросе. Это может быть URL, POST- или GET-запрос. Ради простоты и наглядности в этом примере мы воспользуемся URL. Для этого должен быть включен Экспертный режим обработки URL страницы и определена {page_num}
переменная:
Далее, должен быть настроен Динамический элемент с соответствующими опциями пагинации. Важно выставить правильный Список, Номер страницы как {{page_num}}
и Количество ссылок пагинации больше чем 0!
После чего переменная с именем Вашего Динамического элемента (items_list
в данном примере) будет дополнена подобъектом pagination
со следующей структурой:
{
"count": 2, // общее количество страниц
"pages": [ // объекты с данными для генерации ссылок пагинации
{
"num": 1, // номер страницы
"url": "item_list_p1", // URL страницы
"active": true // является ли эта страница текущей
},
{
"url": "item_list_p2",
"num": 2
}
],
"page": 1, // номер текущей страницы
"per_page": 2, // количество элементов списка на одной странице
"next": { // объект с данными для генерации следующей ссылки после текущей
"url": "item_list_p2",
"num": 2
}
}
Этот объект может быть использован для генерации виджета пагинации произвольного вида. В примере ниже это ul#pagination
:
<ul>
{{#each items_list.items}}
<li id="{{key}}">
<img src="{{../cdn}}/{{fields.img}}">
<label>{{name}} ×{{fields.count}}</label>
{{#if title}}<span>({{title}})</span>{{/if}}
</li>
{{/each}}
</ul><br>
<ul id="pagination">
<li>Страница {{items_list.pagination.page}}/{{items_list.pagination.count}}</li>
{{#each items_list.pagination.pages}}
<li id=""><a {{#if active}}{{else}}href="/{{url}}"{{/if}}>{{num}}</a></li>
{{/each}}
</ul>
<style>
ul {white-space: pre; list-style: none; display: inline-flex;margin:0;}
li {padding: 0 .3em;}
ul img {max-width: 100px;}
</style>
Результат:
Вывод элемента списка
Вывести один конкретный элемент списка, как правило для презентации в подробном виде, можно следующим образом:
Как и в предыдущем разделе Вам понадобится Экспертный режим обработки URL страницы, но определена должна быть переменная {feed_key}
.
При соответствии {feed_key}
элементу выбранного списка по ключу key
— в Содержании страницы станет доступна переменная feed_item
со всеми стандартными и дополнительными полями, а также следующими виртуальными:
- site_id — идентификатор Вашего сайта на Tabula
- feed_id — идентификатор списка
Теперь, вокруг этих данных и при помощи шаблонизатора можно выстроить HTML:
<h3>Товар: {{feed_item.name}}</h3>
<img src="{{cdn}}/{{feed_item.fields.img}}">
<ul>
<li><label>Описание</label>: {{feed_item.fields.title}}</li>
<li><label>Доступен</label>: {{#if feed_item.fields.available}}да{{else}}нет{{/if}}</li>
<li><label>Количество</label>: {{feed_item.fields.count}}</li>
</ul>
<style>
ul {float: left; list-style: none;}
li {padding: 0 .3em;}
img {float: left; max-width: 300px;}
</style>
Результат: