Связи
# Введение
Связи - это модификатор контроллера, которой позволяет управлять сложными отношениями модели на странице.
Для того, чтобы использовать связи, Вы должны указать их в перемененной $implement в классе контроллера. Также должна быть определена переменная $relationConfig, значение которой - YAML файл с настройками.
namespace Acme\Projects\Controllers;
class Projects extends Controller
{
public $implement = [
'Backend.Behaviors.FormController',
'Backend.Behaviors.RelationController',
];
public $formConfig = 'config_form.yaml';
public $relationConfig = 'config_relation.yaml';
}
Важно: Очень часто связи используются вместе с формами.
# Настройка
Файл с настройками, на который ссылается переменная $relationConfig, должен иметь YAML формат и находиться в папке с представлением контроллера.
Рассмотрим модель Invoice:
class Invoice {
public $hasMany = [
'items' => ['Acme\Pay\Models\InvoiceItem'],
];
}
в которой указана связь с моделью InvoiceItem. Эта связь имеет название items, которое также используется в YAML файле с настройками:
# ===================================
# Relation Behavior Config
# ===================================
items:
label: Invoice Line Item
view:
list: $/acme/pay/models/invoiceitem/columns.yaml
toolbarButtons: create|delete
manage:
form: $/acme/pay/models/invoiceitem/fields.yaml
recordsPerPage: 10
Вы можете использовать следующие параметры для настройки связи:
| Параметр | Описание |
|---|---|
| label | метка связи, обязательно. |
| view | параметр определяет вид контейнера, см. ниже. |
| manage | параметр определяет вид модального окна, см. ниже. |
| pivot | ссылка на файл с описанием полей формы, которая используется для связи с таблицей данных. |
| emptyMessage | сообщение при отсутствии связей, необязательно. |
| readOnly | отключает возможность добавлять, обновлять, удалять или создавать отношения. По умолчанию: false |
| deferredBinding | откладывает все обязательные действия, используя ключ сессии когда это возможно. По умолчанию: false |
| Параметр | Тип | Описание |
|---|---|---|
| form | Форма | ссылка на YAML файл с настройками формы. |
| list | Список | ссылка на YAML файл с настройками списка. |
| showSearch | Список | отображает форму для поиска записи. По умолчанию: false |
| showSorting | Список | позволяет сортировать записи. По умолчанию: true |
| defaultSort | Список | указывает столбец и направление для сортировки по умолчанию. Разрешается использование строки или массива, где ключ - column, значение - direction. |
| recordsPerPage | Список | максимальное количество строк на странице. |
| conditions | Список | дополнительное условие фильтрации. |
| scope | Список | определяет метод для изменения запроса. |
| showCheckboxes | Список | отображает чекбокс для каждой строки. |
| recordUrl | Список | добавляет ссылку для каждой строки. Пример: users/update/:id. Где :id - идентификатор записи. |
| recordOnClick | Список | произвольный JavaScript код, который выполняется при клике на запись. |
| toolbarPartial | Форма и Список | ссылка на фрагмент контроллера с тулбаром. Пример: _relation_toolbar.htm. Этот параметр переопределяет toolbarButtons. |
| toolbarButtons | Форма и Список | позволяет отобразить кнопки: add, create, update, delete, remove, link, unlink. Пример: add|remove или false, чтобы ничего не показывать. |
| title | Форма и Список | заголовок модального окна, можно использовать локализацию. |
| context | Форма | контекст отображаемой формы. Строка или массив с ключами: create, update. |
# Типы
Отображение менеджера связей зависит от типа отношений. Каждый тип имеет свои требования к конфигурации, которые выделены жирным шрифтом. Доступны следующие типы связей:
# Has many
- Связанные записи отображаются в виде списка. (view.list).
- При нажатии на запись отобразится форма для редактирования (manage.form).
- При нажатии на кнопку Add на панели инструментов отобразится список выбора (manage.list).
- При нажатии на кнопку Create на панели управления отобразится форма для создания (manage.form).
- При нажатии на кнопку Delete запись/записи удаляется/удаляются.
- При нажатии на кнопку Remove удаляются отношения.
Например, если запись в блоге имеет много комментариев, то в качестве главной модели устанавливается запись, и отображается список комментариев, используя колонки из списка. При нажатии на комментарий отображается всплывающая форма с полями, определенными в форме "Обновить комментарий". Комментарии могут быть созданы таким же образом. Ниже приведен пример конфигурационного файла:
# ===================================
# Relation Behavior Config
# ===================================
comments:
label: Comment
manage:
form: $/acme/blog/models/comment/fields.yaml
list: $/acme/blog/models/comment/columns.yaml
view:
list: $/acme/blog/models/comment/columns.yaml
toolbarButtons: create|delete
# Belongs to many
- Связанные записи отображаются в виде списка (view.list).
- При нажатии на кнопку Add на панели инструментов отобразится список выбора (manage.list).
- При нажатии на кнопку Create на панели управления отобразится форма для создания (manage.form).
- При нажатии на кнопку Delete запись/записи из таблицы удаляется/удаляются.
- При нажатии на кнопку Remove удаляются отношения.
Например, если пользователь принадлежит к нескольким ролям, то в качестве главной модели устанавливается пользователь, и отображается список ролей, используя колонки из списка. Роли пользователя могут быть добавлены или удалены. Ниже приведен пример конфигурационного файла:
# ===================================
# Relation Behavior Config
# ===================================
roles:
label: Role
view:
list: $/acme/user/models/role/columns.yaml
toolbarButtons: add|remove
manage:
list: $/acme/user/models/role/columns.yaml
form: $/acme/user/models/role/fields.yaml
# Belongs to many (with Pivot Data)
- Связанные записи отображаются в виде списка (view.list).
- При нажатии на запись отобразится форма с данными для редактирования (pivot.form).
- При нажатии на кнопку Add на панели инструментов отобразится список (manage.list) выбора и форма для ввода данных (pivot.form).
- При нажатии на кнопку Удалить таблица с данными удаляется.
Рассмотрим предыдущий пример. Роль может иметь ограниченный срок действия. При нажатии на нее отобразится всплывающая форма, которая позволяет изменить дату окончания этого срока. Ниже приведен пример конфигурационного файла:
# ===================================
# Relation Behavior Config
# ===================================
roles:
label: Role
view:
list: $/acme/user/models/role/columns.yaml
manage:
list: $/acme/user/models/role/columns.yaml
pivot:
form: $/acme/user/models/role/fields.yaml
Сводные данные доступны при определении полей формы и столбцов списка через pivot. Пример:
# ===================================
# Relation Behavior Config
# ===================================
teams:
label: Team
view:
list:
columns:
name:
label: Name
pivot[team_color]:
label: Team color
manage:
list:
columns:
name:
label: Name
pivot:
form:
fields:
pivot[team_color]:
label: Team color
Note: Сводные данные (на данный момент) не поддерживаются отолежнным связыванием, таким образом родительская модель должна существовать заранее.
# Belongs to
- Связанная запись отображаются в виде формы предпросмотра (view.form).
- При нажатии на кнопку Create отобразится форма создания (manage.form).
- При нажатии на кнопку Update отобразится форма изменения (manage.form).
- При нажатии на кнопку Link к отобразится список выбора (manage.list).
- При нажатии на кнопку Unlink связь исчезнет.
- При нажатии на кнопку Delete запись удаляется.
Например, если телефон принадлежит человеку, то менеджер связей отобразит форму с определенными полями. При нажатии на кнопку "Link" отобразится список людей, к которым можно привязать телефон. При нажатии на кнопку "Unlink" связь исчезнет.
# ===================================
# Relation Behavior Config
# ===================================
person:
label: Person
view:
form: $/acme/user/models/person/fields.yaml
toolbarButtons: link|unlink
manage:
form: $/acme/user/models/person/fields.yaml
list: $/acme/user/models/person/columns.yaml
# Has one
- Связанная запись отображаются в виде формы предпросмотра (view.form).
- При нажатии на кнопку Create отобразится форма создания (manage.form).
- При нажатии на кнопку Update отобразится форма изменения (manage.form).
- При нажатии на кнопку Link к отобразится список выбора (manage.list).
- При нажатии на кнопку Unlink связь исчезнет.
- При нажатии на кнопку Delete запись удаляется.
Например, если человек имеет один телефонный номер, то менеджер связей отобразит форму с определенными полями. При нажатии на кнопку "Изменить" отобразится форма для редактирования. Если человек уже имеет телефон, то он обновится, иначе будет добавлен новый номер.
# ===================================
# Relation Behavior Config
# ===================================
phone:
label: Phone
view:
form: $/acme/user/models/phone/fields.yaml
toolbarButtons: update|delete
manage:
form: $/acme/user/models/phone/fields.yaml
list: $/acme/user/models/phone/columns.yaml
# Менеджер связей
Целевая модель должна быть сначала инициализирована в контроллере путем вызова метода initRelation() для того, чтобы управлять отношениями на любой странице.
$post = Post::where('id', 7)->first();
$this->initRelation($post);
Note: На страницах Создания, Редактирования и Предпросмотра модель инициализируется автоматически.
Вы можете отобразить менеджер связи на определенной странице при помощи метода relationRender(). Например для страницы Предпросмотра, содержимое файла preview.htm может выглядеть так:
<?= $this->formRenderPreview() ?>
<?= $this->relationRender('comments') ?>
Вы можете отобразить менеджер связи в режиме "только чтение", передав массив ['readOnly' => true] в качестве второго аргумента:
<?= $this->relationRender('comments', ['readOnly' => true]) ?>
← Списки Сортировка →