Приятно наблюдать как статьи по Друпал 8 постепенно наполняют русскоязычный сегмент сети... Ну что ж, пора и мне вносить свой вклад в это дело. Первые шаги конечно даются нелегко, но на то они и первые. Придется много читать, пробовать, ошибаться и снова искать ответы в сети.
Пример первого модуля на Друпал 8 в сети можно найти без особого труда (например). Вот и я пошел по известному маршруту - Hello World, дамы и господа!
Создадим первый модуль testpage и на нем будем тестировать работу с путями. Структуру модуля описывать уже нет смысла. Смотрите ссылку выше. Там все мега-подробно описано. Просто приведу листинг кода с небольшими комментариями:
#1 - Просто страница HelloWorld
name: Test page
description: 'Hello World - is my first module!'
type: module
core: 8.x
version: 1.0
package: Frantsuzzz
testpage.helloworld1:
path: '/helloworld'
defaults:
_title: 'Hello World'
_controller: '\Drupal\testpage\Controller\TestPageController::renderPage'
requirements:
_permission: 'view content'
/**
* @file
* Contains \Drupal\testpage\Controller\TestPageController.
*/
/**
* Пространство имен нашего контроллера.
*/
namespace Drupal\testpage\Controller;
/**
* Используем друпальный класс ControllerBase.
*/
use Drupal\Core\Controller\ControllerBase;
/**
* Объявляем наш класс-контроллер.
*/
class TestPageController extends ControllerBase {
//Метод, который возвращает render array с содержимым страницы
public function renderPage() {
$output = array();
$output['#title'] = 'Hello world title';
$output['#markup'] = 'Hello World!';
return $output;
}
}
#2 - Страница HelloWorld с настройкой прав
Раньше мы использовали hook_permission. Угадайте, где нужно объявлять права в Друпал 8? Снова создаем .yml файл в корне нашего модуля c названием имя_модуля.permissions.yml.
view testpage:
title: 'View testpage'
description: 'View test page "Hello world".'
restrict access: TRUE
'view testpage' - системное название новых прав доступа. Не должно совпадать с именем модуля, иначе поломается верстка на странице управления правами доступа.
'restrict access' - опция указывает на то, связаны ли данные права с безопасностью сайта. В случае TRUE к описанию прав будет добавлено соответствующее предупреждение.
Незабудьте сбросить кеш на сайте, что бы увидеть изменения на странице admin/people/permissions:
Теперь мы можем внести изменения в маршрут testpage.testpage1:
testpage.testpage1:
path: '/helloworld'
defaults:
_title: 'Hello World'
_controller: '\Drupal\testpage\Controller\TestPageController::renderPage'
requirements:
#Новые права доступа
_permission: 'view testpage'
Подробнее про разрешения можно почитать на drupal.org
#3 - Страница HelloWorld в разделе конфигурации
Замечательно. А теперь представим, что на самом деле страница "Hello World!" - это какая-то страница админки и попробуем вывести ее в разделе конфигурации 'admin/config' в существующем контейнере, например 'Разработка'. Для тестирования данной задачи, я зарегистрирую новый путь, что бы не путаться в примерах.
testpage.testpage3:
path: '/admin/config/development/helloworld'
defaults:
_title: 'Admin Hello World'
_controller: '\Drupal\testpage\Controller\TestPageController::renderPage'
requirements:
_permission: 'access administration pages'
На данный момент у нас появилась страничка helloworld по адресу '/admin/config/development/helloworld'.
Но на панели администрирования ее нет. Дело в том, что список ссылок на данной панели строится на основе иерархии пунктов меню. Наш маршрут - это просто путь. Нет никакой привязки к меню. Поэтому система не может найти данную страницу и не отображает ее в админке. Покажем Друпалу, откуда ноги растут где следует вывести данную страницу. Создадим в корне модуля новый файл testpage.links.menu.yml
testpage.testpage3:
#Заголовок пункта меню
title: 'Hello world admin'
#Описание пункта меню
description: 'Weloworld page for admin page'
#Маршрут (определяет путь ссылки)
route_name: testpage.testpage3
#родительский маршрут (system.admin_config_development - определен в модуле system)
parent: system.admin_config_development
#Вес ссылки в меню
weight: 10
#4 - Страница HelloWorld в разделе конфигурации в новом разделе
Не останавливаемся на достигнутом. Продолжаем эксперименты. Сейчас я хочу, что бы моя ссылка администрирования была не в разделе "Разработка", а в новом разделе, например "Custom settings". Для этого нам нужно создать новый раздел в меню и туда добавить новую ссылку.
#Наш новый раздел на панели конфигурации
testpage.admin_config_custom:
path: '/admin/config/custom'
defaults:
#Контроллер для таких разделов уже определен в модуле system
_controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
_title: 'Custom settings'
requirements:
_permission: 'access administration pages'
#Что бы не путаться в примерах, мы добавим новый маршрут для страницы HelloWorld
testpage.testpage4:
path: '/admin/config/custom/helloworld'
defaults:
_title: 'Admin Custom Hello World'
_controller: '\Drupal\testpage\Controller\TestPageController::renderPage'
requirements:
_permission: 'access administration pages'
testpage.admin_config_custom:
title: 'Custom settings'
route_name: testpage.admin_config_custom
parent: system.admin_config
description: 'Custom panel'
weight: -10
testpage.testpage4:
title: 'Hello world admin (custom)'
description: 'Weloworld page for admin page'
route_name: testpage.testpage4
parent: testpage.admin_config_custom
weight: 10
#5 - Вкладки (Tabs)
Неплохое начало. Теперь попробуем разобраться, как делать вкладки (Tabs). Итак, сейчас мы добавим на страницу #4 новую вкладку "Tab2". Для начала зарегистриуем новый путь для вкладки:
testpage.testpage5:
path: '/admin/config/custom/helloworld/tab2'
defaults:
_title: 'Hello World Tab2'
#в качестве контроллера не будем ничего придумывать, просто используем все тот-же helloworld :-)
_controller: '\Drupal\testpage\Controller\TestPageController::renderPage'
requirements:
_permission: 'access administration pages'
#Опишем вкладку по умолчанию
testpage.tabdefault:
#Имя маршрута (путь для вкладки по умолчанию)
route_name: testpage.testpage4
#Родительский маршрут. Т.к. вкладка по-умолчанию, то используем тот-же маршрут
base_route: testpage.testpage4
title: 'Tab default'
#Вторая вкладка
testpage.tab2:
#Маршрут для второй вкладки
route_name: testpage.testpage5
title: 'Tab2'
#Родительский маршрут - указываем ИМЯ МАРШРУТА, который у нашей основной вкладки
base_route: testpage.testpage4
#6 - Вкладки второго уровня!
testpage.testpage6:
path: '/admin/config/custom/helloworld/tab3/subtab1'
defaults:
_title: 'Hello World Tab2'
_controller: '\Drupal\testpage\Controller\TestPageController::renderPage'
requirements:
_permission: 'access administration pages'
testpage.testpage7:
path: '/admin/config/custom/helloworld/tab3/subtab2'
defaults:
_title: 'Hello World Tab2'
_controller: '\Drupal\testpage\Controller\TestPageController::renderPage'
requirements:
_permission: 'access administration pages'
#Добавляем третью вкладку
testpage.tab3:
route_name: testpage.testpage6
title: 'Tab3'
base_route: testpage.testpage4
#Регистрируем вкладки второго уровня
testpage.tab3sub1:
route_name: testpage.testpage6
title: Sub1
#Имя (id) родительской вкладки
parent_id: testpage.tab3
testpage.tab3sub2:
route_name: testpage.testpage7
title: Sub2
parent_id: testpage.tab3
Вложение | Size |
---|---|
testpage | 2.71 КБ |
- 09.02.2016
- 217 просмотров