При разработке не стандартного функционала сайта, как правило, реализуется кастомный модуль, а чем сложнее функционал, тем больше настроек (страниц администрирования) будет иметь данный модуль. Мы с вами уже знаем, как создавать свою страницу, сегодня же рассмотрим создание страниц администрирования, попутно разберемся с локальными задачами и как всегда из кастомного модуля, в моем случае он будет называться ex_admin_page.
Файл - ex_admin_page.info.yml
name: Example create administration page
description: Данный модуль показывает процесс создания страниц администрирования
core: 8.x
package: Drupalfly
type: module
Далее нам необходимо создать сами страницы
Файл маршрутизации - ex_admin_page.routing.yml
# Page list
ex_admin_page.list:
path: '/admin/config/services/ex_admin_page_list'
defaults:
_title: 'Страница со списком'
_controller: '\Drupal\ex_admin_page\Controller\ExAdminPageController::ex_page_list'
requirements:
_permission: 'administer site configuration'
# Page settings
ex_admin_page.settings:
path: '/admin/config/services/ex_admin_page_settings'
defaults:
_title: 'Страница с настройками'
_controller: '\Drupal\ex_admin_page\Controller\ExAdminPageController::ex_page_settings'
requirements:
_permission: 'administer site configuration'
Файл контроллер – ExAdminPageController.php
<?php
namespace Drupal\ex_admin_page\Controller;
class ExAdminPageController {
# List
public function ex_page_list(){
$output = 'Data list';
return array(
'#markup' => render($output),
);
}
# Settings
public function ex_page_settings(){
$output = 'Data settings';
return array(
'#markup' => render($output),
);
}
}
Теперь проверим, что наши страницы доступны по указанным путям из файла маршрутизации
Страница со списком
Страница с настройками
Отлично, все работает.
Теперь определимся, какая из 2х страниц будет открываться по умолчанию, и к какому разделу должны относится данные страницы на странице администрирования, по пути
admin/config
Я выберу раздел «Веб службы», а по умолчанию буду использовать страницу со списком, вы же выбираете, что необходимо вам в вашем конкретном случае.
Для определения страницы, которая будет открываться по умолчанию из страницы администрирования, нам необходимо описать ссылку на данную страницу.
Файл – ex_admin_page.links.menu.yml
ex_admin_page.config:
title: 'Страница со списком'
description: 'Страница со списком'
parent: system.admin_config_services
route_name: ex_admin_page.list
weight: 10
Проверим, что ссылка добавилась
Как видим - все работает.
Реализация локальных задач.
Теперь нам необходимо сгруппировать эти 2 страницы, ибо относятся к одному интерфейсу (модулю), группировка производится через табы. Для реализации табов нам необходимо их так же описать в yml файле. В API данный процесс описывается как «Локальные задачи»
Хочу заметить, что локальные задачи применимы не только к страницам администрирования, но и к любым другим страницам вашего сайта.
Файл – ex_admin_page.links.task.yml
ex_admin_page.list:
title: Список
route_name : ex_admin_page.list
base_route: ex_admin_page.list
weight: 10
ex_admin_page.settinigs:
title: Настройки
route_name: ex_admin_page.settings
base_route: ex_admin_page.list
weight: 20
Проверим
Отлично, с этим мы тоже справились. Как вы наверно уже замечали, некоторые страницы (в большинстве случаев страницы администрирования) имеют 2 уровня вложенности, т.е. внутри табов можно реализовать еще ссылки на страницы, давайте это тоже реализуем. Для этого добавим дополнительный путь в файл маршрутизации
Файл – ex_admin_page.routing.yml
# Page list
ex_admin_page.list:
path: '/admin/config/services/ex_admin_page_list'
defaults:
_title: 'Страница со списком'
_controller: '\Drupal\ex_admin_page\Controller\ExAdminPageController::ex_page_list'
requirements:
_permission: 'administer site configuration'
# Page list
ex_admin_page.list_edit:
path: '/admin/config/services/ex_admin_page_list_edit'
defaults:
_title: 'Страница со списком (редактирование)'
_controller: '\Drupal\ex_admin_page\Controller\ExAdminPageController::ex_page_list_edit'
requirements:
_permission: 'administer site configuration'
# Page settings
ex_admin_page.settings:
path: '/admin/config/services/ex_admin_page_settings'
defaults:
_title: 'Страница с настройками'
_controller: '\Drupal\ex_admin_page\Controller\ExAdminPageController::ex_page_settings'
requirements:
_permission: 'administer site configuration'
Так же добавим дополнительную функцию в файле контроллера.
Файл – ExAdminPageController.php
<?php
namespace Drupal\ex_admin_page\Controller;
class ExAdminPageController {
# List
public function ex_page_list(){
$output = 'Data list';
return array(
'#markup' => render($output),
);
}
# List edit
public function ex_page_list_edit(){
$output = 'Data list edit';
return array(
'#markup' => render($output),
);
}
# Settings
public function ex_page_settings(){
$output = 'Data settings';
return array(
'#markup' => render($output),
);
}
}
И соответственно опишем данный путь в файле локальных задач.
Файл ex_admin_page.links.task.yml
ex_admin_page.list:
title: Список
route_name : ex_admin_page.list
base_route: ex_admin_page.list
weight: 10
ex_admin_page.list_children:
title: Список (Просмотр)
parent_id: ex_admin_page.list
route_name : ex_admin_page.list
weight: 1
ex_admin_page.list_children_sub:
title: Список (Редактирование)
parent_id: ex_admin_page.list
route_name : ex_admin_page.list_edit
weight: 2
ex_admin_page.settinigs:
title: Настройки
route_name: ex_admin_page.settings
base_route: ex_admin_page.list
weight: 20
Хочу заметить, что принцип создания 2го уровня в локальных задах, идентичен первому по принципу действия, т.е. сначала определяется страница по умолчанию (ex_admin_page_list.children) и только потом дополнительная ссылка (ex_admin_page.list_children_sub).
Так же, хочу заметить, при описании 2го уровня локальных задач не нужно использовать свойство base_route. Свойство parent_id – содержит ID первого уровня задач, для которого необходимо реализовать 2й уровень.
Проверяем
Отлично с задачей справились.
Скачать модуль используемый в примере
Комментарии (6)
Поправьте, пожалуйста, название файла. Должно быть ex_admin_page.links.menu.yml
Файл – ex_admin_page.links.yml
Немного провозился пока не понял, что у меня не так и почему не отображается "Страница со списком".
да, конечно - ошибка. В прикрепленном модуле все корректно.
Почему, когда я меняю base_route на ex_admin_page.settings, то по дефолту все равна первой отображается вкладка Список, а не Настройки?
Кэш чистили ? в route_name что указывали при смене base_route ?
Разобрался. Для того, чтобы по дефолту первой открывалась страница с Настройками, а не со списком нужно изменить не base_route в файле ex_admin_page.links.task.yml , а изменить route_name в файле ex_admin_page.links.menu.yml на route_name: ex_admin_page.settings. Тогда первой будет открываться страница с Настройками.
Но зачем служат base_route в файле ex_admin_page.links.task.yml так и не понял.
По сути base_route - указывает на родителя, и он должен присутствовать во всех определения локальных задач, кроме тех, которые используют 2 уровня вложенности (которые имеют parent_id). Возможно оф. документация даст вам большее представление о работе с локальными задачами