• урок
  • pantey

Drupal 8 - Cоздание страниц администрирования (реализация локальных задач)

10.07.2017

При разработке не стандартного функционала сайта, как правило, реализуется кастомный модуль, а чем сложнее функционал, тем больше настроек (страниц администрирования) будет иметь данный модуль. Мы с вами уже знаем, как создавать свою страницу, сегодня же рассмотрим создание страниц администрирования, попутно разберемся с локальными задачами и как всегда из кастомного модуля, в моем случае он будет называться 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),
    );
  }
  
}

Теперь проверим, что наши страницы доступны по указанным путям из файла маршрутизации

Страница со списком

create_administration_page_in_drupal_8.png

Страница с настройками

create_administration_page_in_drupal_8_1.png

Отлично, все работает.

Теперь определимся, какая из 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

Проверим, что ссылка добавилась

create_administration_page_in_drupal_8_2.png

Как видим - все работает.

Реализация локальных задач.

Теперь нам необходимо сгруппировать эти 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

Проверим

create_administration_page_in_drupal_8_3.png

Отлично, с этим мы тоже справились. Как вы наверно уже замечали, некоторые страницы (в большинстве случаев страницы администрирования) имеют 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й уровень.

Проверяем

create_administration_page_in_drupal_8_4.png

Отлично с задачей справились.

Скачать модуль используемый в примере

Скачать

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (6)

Profile picture for user 1541
Александр
25.08.2017

Поправьте, пожалуйста, название файла. Должно быть ex_admin_page.links.menu.yml

Файл – ex_admin_page.links.yml

Немного провозился пока не понял, что у меня не так и почему не отображается "Страница со списком".

Profile picture for user pantey
pantey
25.08.2017

да, конечно - ошибка. В прикрепленном модуле все корректно.

Profile picture for user 1541
Александр
25.08.2017

Почему, когда я меняю base_route на ex_admin_page.settings, то по дефолту все равна первой отображается вкладка Список, а не Настройки?

Profile picture for user pantey
pantey
28.08.2017

Кэш чистили ? в route_name что указывали при смене base_route ?

Profile picture for user 1541
Александр
29.08.2017

Разобрался. Для того, чтобы по дефолту первой открывалась страница с Настройками, а не со списком нужно изменить не 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 так и не понял.

Profile picture for user pantey
pantey
29.08.2017

По сути base_route - указывает на родителя, и он должен присутствовать во всех определения локальных задач, кроме тех, которые используют 2 уровня вложенности (которые имеют parent_id). Возможно оф. документация даст вам большее представление о работе с локальными задачами