Чертёж⚓︎
Базовая структура чертежа Flex содержит title
,description
и type
, описывающие тип, и три раздела: config
, blueprints
и form
, описывающие различные аспекты типа каталога.
Основная структура contacts.yaml
:
title: Contacts
description: Simple contact directory with tags.
type: flex-objects # do not change
# Flex Configuration
config: {}
# Flex Directory Forms
blueprints: {}
# Flex Object Form
form: {}
Чтобы создать свой собственный каталог, вам нужно начать с присвоения имени вашему type
(имя файла) и заполненияtitle
и description
.
После создания файла и заполнения основной информации следующим шагом будет либо копирование существующей формы, либо добавление некоторых полей в файл.
Мы предполагаем, что вы уже знаете, как создавать свои собственные формы и чертежи.
Лучше не использовать простой формат списка для описания полей, как указано в секции Создание простой формы. Также не передавайте в этот файл раздел формы process
, он не будет использоваться Flex.
Секция Form⚓︎
В нашем примере с контактами раздел формы выглядит так:
# Flex Object Form
form:
validation: loose
fields:
published:
type: toggle
label: Published
highlight: 1
default: 1
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
required: true
last_name:
type: text
label: Last Name
validate:
required: true
first_name:
type: text
label: First Name
validate:
required: true
email:
type: email
label: Email Address
validate:
required: true
website:
type: url
label: Website URL
tags:
type: selectize
size: large
label: Tags
classes: fancy
validate:
type: commalist
Форма выглядит одинаково независимо от того, была ли она взята со страницы или из файла конфигурации, плагина или чертежа темы. Это основной план для каждого объекта в вашем каталоге, и он должен содержать все поля, определённые в объекте. Подумайте об этом как о форме, отображаемой администратору.
Будьте осторожны при изменении чертежа для существующего типа Flex. Убедитесь, что объекты, которые вы уже сохранили, совместимы с новой версией чертежа — это означает, что вы должны иметь возможность как сохранять, так и отображать старые объекты.
Мы ещё не закончили. Есть ещё две вещи, которые необходимо сделать, чтобы каталог заработал: нам нужно настроить уровень хранения данных и определить поля для отображения в представлении «Список администраторов». Мы можем сделать и то, и другое в секции config
.
Секция Config⚓︎
Раздел конфигурации — самая сложная часть чертежа Flex, хотя большая часть его предназначена только для настройки. Он содержит разделы data
, admin
и site
.
# Flex Configuration
config:
# Data Settings
data: {}
# Admin Settings
admin: {}
# Site Settings
site: {}
Минимальная конфигурация выглядит примерно так:
# Flex Configuration
config:
# Data Settings
data:
storage: user-data://flex-objects/contacts.json
# Admin Settings
admin:
# List view
list:
# List of fields to display
fields:
last_name:
link: edit # Edit link
first_name:
link: edit # Edit link
email:
website:
В конфигурации есть два обязательных раздела: config.data.storage
и config.admin.list.fields
. Последний определяет поля, отображаемые в представлении списка администраторов. С другой стороны, хранилище данных определяет, как данные будут храниться.
Config > Data⚓︎
Flex-каталог легко настраиваемый. Вы можете использовать свои классы object
, collection
и index
для добавления собственного поведения. Кроме того, вы можете настроить уровень хранилища (storage
) в соответствии с вашими потребностями. Справочник также имеет стандартные функции «упорядочивания» (ordering
) и «поиска» (search
).
config:
data:
# Flex Object Class
object: CLASSNAME
# Flex Collection Class
collection: CLASSNAME
# Flex Index Class
index: CLASSNAME
# Storage Options
storage: {}
# Ordering Options
ordering: {}
# Search Options
search: {}
Объект, коллекция и индекс принимают имена классов. Если они не указаны, Grav будет использовать следующую конфигурацию по умолчанию:
config:
data:
object: 'Grav\Common\Flex\Types\Generic\GenericObject'
collection: 'Grav\Common\Flex\Types\Generic\GenericCollection'
index: 'Grav\Common\Flex\Types\Generic\GenericIndex'
Эти классы вместе будут определять поведение вашего типа. Если вы хотите настроить свой собственный тип, это можно сделать, расширив эти классы и передав здесь свои собственные классы.
Одна из наиболее важных частей - определить, где и как хранятся данные:
config:
data:
storage:
class: 'Grav\Framework\Flex\Storage\SimpleStorage'
options:
formatter:
class: 'Grav\Framework\File\Formatter\JsonFormatter'
folder: user-data://flex-objects/contacts.json
Выше частный случай, который также можно записать в краткой форме:
Grav 1.7 предоставляет 3 различных стратегии хранения, хотя вы можете легко создать свою собственную:
Название | Класс | Описание |
---|---|---|
Simple Storage | Grav\Framework\Flex\Storage\SimpleStorage | Все объекты хранятся в одном файле. Не поддерживает медиа. |
File Storage | Grav\Framework\Flex\Storage\FileStorage | Объекты хранятся в отдельных файлах в одной папке. |
Folder Storage | Grav\Framework\Flex\Storage\FolderStorage | Каждый объект хранится в отдельной папке. |
Кроме того, вы можете указать формат файла с options.formatter.class
:
Название | Класс | Описание |
---|---|---|
JSON | Grav\Framework\File\Formatter\JsonFormatter | Использовать формат файла JSON. |
YAML | Grav\Framework\File\Formatter\YamlFormatter | Использовать формат файла YAML. |
Markdown | Grav\Framework\File\Formatter\MarkdownFormatter | Использовать формат файла Grav Markdown с обложкой YAML. |
Serialize | Grav\Framework\File\Formatter\SerializeFormatter | Использовать сериализатор PHP. Быстро, но не читается человеком. |
INI | Grav\Framework\File\Formatter\IniFormatter | Использовать формат файла INI. Не рекомендуется. |
CSV | Grav\Framework\File\Formatter\CsvFormatter | Использовать формат файла CSV. Не рекомендуется. |
Параметры конфигурации (со значениями по умолчанию) для средств форматирования по умолчанию можно найти ниже во вкладках:
# JSON
formatter:
class: 'Grav\Framework\File\Formatter\JsonFormatter'
options:
file_extension: '.json'
encode_options: '' # See https://www.php.net/manual/en/function.json-encode.php (separate options with space)
decode_assoc: true # Decode objects as arrays
decode_depth: 512 # Decode up to 512 levels
decode_options: '' # See https://www.php.net/manual/en/function.json-decode.php (separate options with space)
# YAML
formatter:
class: 'Grav\Framework\File\Formatter\YamlFormatter'
options:
file_extension: '.yaml'
inline: 5 # Save with up to 4 expanded levels
indent: 2 # Indent with 2 spaces
native: true # Use native YAML decoder if available
compat: true # If YAML cannot be decoded, use compatibility mode (SLOW)
Вы также можете установить порядок по умолчанию, который определяется парами key: ASC|DESC
:
Наконец, вы можете добавить поля поиска, которые просматриваются при вызове collection.search()
:
config:
data:
search:
# Fields to be searched
fields:
- last_name
- first_name
- email
# Search Options
options:
- contains: 1 # If field contains the search string, assign weight 1 to the object
Fields содержат список полей для поиска.
Возможные варианты поиска:
Название | Класс | Описание |
---|---|---|
case_sensitive | true или false | Если true, все проверки чувствительны к регистру, по умолчанию false |
same_as | 0 ... 1 | Значение поля должно совпадать со строкой поиска |
starts_with | 0 ... 1 | Значение поля должно начинаться со строки поиска |
ends_with | 0 ... 1 | Значение поля должно заканчиваться строкой поиска |
contains | 0 ... 1 | Значение поля должно содержать строку поиска |
Функция поиска возвращает 0, если поле не совпадает, и вес от 0 до 1, Если есть совпадение. Вес используется для упорядочения результатов поиска. Объект, который получает самое высокое ядро, имеет лучшее совпадение, чем объект с более низким баллом.
В настоящее время поиск не поддерживает наличие различных весов или стратегий для каждого поля.
Config > Admin⚓︎
Раздел Admin содержит различные параметры конфигурации для настройки администрирования каталога. Он содержит несколько основных разделов: router
, actions
, permissions
, menu
, template
и views
.
config:
# Admin Settings
admin:
# Admin router
router: {}
# Allowed admin actions
actions: {}
# Permissions
permissions: {}
# Admin menu
menu: {}
# Admin template type
template: pages
# Admin views
views: {}
Дополнительный раздел router
можно использовать для настройки маршрутов администрирования Flex-каталога. Маршрутизация поддерживает базовый путь, настраиваемые маршруты для каждого действия, а также перенаправление для обработки, например, обратной совместимости. Все пути относятся к базовому URL-адресу администратора.
config:
admin:
# Admin router
router:
path: '/contacts' # Custom path to the directory
actions:
configure: # Action name
path: '/contacts/configure' # New path to the action.
redirects: # List of redirects (from: to)
'/flex-objects/contacts': '/contacts'
Иногда вы хотите ограничить администрирование только отображением записей или, например, разрешить редактировать только существующие. Для этого actions
вы можете настроить разрешенные операции CRUD, чтобы они лучше соответствовали вашим потребностям.
config:
admin:
# Allowed admin actions (for all users, including super user)
actions:
list: true # Needs to be true (may change in the future)
create: true # Set to false to disable creating new objects
read: true # Set to false to disable link to edit / details of the objects
update: false # Set to false to disable saving existing objects
delete: false # Set to false to disable deleting objects
Приведенный выше пример предотвратит сохранение существующих объектов и их удаление для каждого пользователя, включая суперадминистратора.
Раздел разрешений позволяет вам добавлять новые правила разрешений для Grav. Эти правила появятся в администраторе пользователя/группы. Вы можете создать столько правил разрешений, сколько захотите, но вам нужно добавить свою собственную логику или правила авторизации в этот файл, чтобы использовать их.
config:
admin:
# Permissions
permissions:
# Primary permissions (used for the objects)
admin.contacts:
type: crudl # Create, Read, Update, Delete, List
label: Contacts Directory
# Secondary permissions (you need to assign these to a view, otherwise these will not be used)
admin.configuration.contacts:
type: default # Simple permission
label: Contacts Configuration
Если вы не хотите отображать свой каталог в администрировании Flex Objects
, один из вариантов — отобразить пункт меню в основной навигации. Вы можете сделать это в секции menu
.
config:
admin:
# Admin Menu
menu:
list:
hidden: false # If true, hide the menu item.
route: '/contacts' # Alias to `config.admin.router.path` if router path is not set.
title: Контакты
icon: fa-address-card-o
authorize: ['admin.contacts.list', 'admin.super'] # Authorization needed to access the menu item.
priority: 2 # Priority -10 .. 10 (highest goes up)
В приведенном выше примере создается пункт меню Контакты, указывающий на /admin/contacts
.
Когда вы создаете свои собственные каталоги Flex, вам иногда может потребоваться использовать одни и те же шаблоны для всех ваших пользовательских каталогов. Вы можете сделать это с помощью template
:
Flex Admin имеет несколько представлений для объектов. По умолчанию поддерживаются следующие представления: list
, edit
, configure
и необязательные preview
и export
. Также возможно добавить свои собственные представления.
config:
admin:
views:
# List view
list: {}
# Edit view
edit: {}
# Configure view
configure: {}
# Preview
preview: {}
# Data Export
export: {}
Просмотр списка⚓︎
Первое представление, которое вам понадобится — это то, в котором перечислены все ваши объекты. По умолчанию представление list
использует VueTable и AJAX для разбивки объектов на страницы. Ему нужен список «полей» (fields
) для отображения, а также «параметры» (options
), чтобы определить, сколько элементов отображается одновременно, а также поле по умолчанию, используемое для упорядочивания.
config:
admin:
views:
# List view
list:
icon: fa-address-card-o
title: Site Contacts
fields: {} # See below
options:
per_page: 20 # Default number of items per page
order:
by: last_name # Default field used for ordering
dir: asc # Default ordering direction
Icon и Title используются для настройки значка и заголовка страницы со списком. Title также поддерживает использование шаблона Twig в следующем формате:
Fields содержит поля, которые вы хотите отобразить в списке каталогов. У каждого поля есть ключ, который представляет собой имя поля. Значение можно не указывать или оно может содержать следующие параметры конфигурации:
| Название | Значение | Пример | Описание | |------|-------|-------------| | width | integer
| 8 | Ширина поля в пикселях | | alias | string
| 'header.published' | Имя используемого поля формы. VueTable не любит точки в именах, поэтому установите псевдоним для вложенных переменных. | | field | array
| | Переопределение поля формы. Написано так же, как и любое поле формы, но без ключа. | | link | string
| 'edit' | Добавляет ссылку для редактирования в текст. | | search | boolean
| true | Делает поле доступным для поиска в списке администрирования. | | sort | array
| field: 'first_name' | Вы можете указать другое значение, если вы используете другое имя поля при запросе данных на стороне сервера, например first_name. | | title_class | string
| 'center' | Классы CSS, используемые в заголовках. | | data_class | string
| 'left' | Классы CSS, используемые в столбцах данных. |
Редактирование⚓︎
Режим редактирования имеет те же основные параметры конфигурации, что и режим просмотра списка:
config:
admin:
views:
# Edit view
edit:
icon: fa-address-card-o
title:
template: '{{ object.last_name ?? ''Last'' }}, {{ object.first_name ?? ''First Name'' }}'
Настройка⚓︎
Можно добавлять параметры конфигурации каталога в широком диапазоне, которые затем могут быть использованы в файлах шаблонов.
config:
admin:
views:
# Configure view
configure:
hidden: false # Configuration button can be hidden, for example if you have custom tab to replace it, like in Accounts.
authorize: 'admin.configuration.contacts' # Optional custom authorize rule for this view.
file: 'config://flex/contacts.yaml' # Optional file where the configuration is saved.
icon: fa-cog
title:
template: "{{ directory.title }} {{ 'PLUGIN_ADMIN.CONFIGURATION'|tu }}"
Предварительный просмотр⚓︎
Flex также поддерживает предварительный просмотр, хотя сейчас он работает путем отрисовки страницы из внешнего интерфейса, которая может быть определена в файле blueprint.
# Preview View
preview:
enabled: true
route:
template: '/contacts' # Twig template to create URL. In this case we use the list view
icon: fa-address-card-o
title:
template: "{{ object.form.getValue('title') ?? object.title ?? key }}"
Экспорт⚓︎
Все объекты могут быть экспортированы в один файл. Вот пример конфигурации, как экспортировать данные в файл YAML:
# Data Export
export:
enabled: true
method: 'jsonSerialize'
formatter:
class: 'Grav\Framework\File\Formatter\YamlFormatter'
filename: 'contacts'
Config > Site⚓︎
config:
# Site Settings
site:
templates:
collection:
# Lookup for the template layout files for collections of objects
paths:
- 'flex/{TYPE}/collection/{LAYOUT}{EXT}'
object:
# Lookup for the template layout files for objects
paths:
- 'flex/{TYPE}/object/{LAYOUT}{EXT}'
defaults:
# Default template variable {TYPE}; overridden by filename of this blueprint if template folder exists
type: contacts
# Default template variable {LAYOUT}; can be overridden in render calls (usually Twig in templates)
layout: default
Настройки шаблона позволяют настроить пути поиска шаблона и установить тип по умолчанию и имя макета во внешнем интерфейсе.
Чертежи⚓︎
Раздел чертежи определяет общие параметры конфигурации для всего каталога. Эти параметры позволяют настроить общий каталог в соответствии с потребностями сайта, не требуя ручного редактирования файлов.
blueprints:
# Blueprint for configure view.
configure:
# We are inside TABS field.
fields:
# Add our own tab
compatibility:
type: tab
title: Compatibility
fields:
# Fields should be prefixed with object, collection etc..
object.compat.events:
type: toggle
toggleable: true
label: Admin event compatibility
help: Enables onAdminSave and onAdminAfterSave events for plugins
highlight: 1
default: 1
options:
1: PLUGIN_ADMIN.ENABLED
0: PLUGIN_ADMIN.DISABLED
validate:
type: bool
Эти параметры конфигурации могут быть изменены в секции Настройка Администрирования Flex-каталога.
В настоящее время единственные используемые параметры конфигурации находятся внутри раздела кэша. Для ваших пользовательских настроек вам нужно добавить логику, чтобы использовать их самостоятельно.