Друпал 8 модуль связанный с админкой. Модули Drupal для работы с мультимедиа. Модули Drupal для работы с контентом

29.12.2015

Релиз Drupal 8 состоялся и теперь, имеет смысл более детально рассматривать данную систему. Все нововведения самого движка, мы естественно здесь не будем рассматривать, а перейдем сразу к практике. Одним из важных моментов для разработчиков, является написание кастомных модулей, ибо ни один более или менее сложный проект не обходится без написания своих модулей.

Сама структура написания модуля достаточно сильно изменилась по сравнению со своим предшественником (Drupal 7). Как всегда, процесс обучения будет проходить на практике, а именно создадим страницу, на которой будем выводить последние опубликованные статьи сайта и создадим пункт в меню на данную страницу.

Приступим. Начнем с файловой структуры. Теперь, все кастомные модули должны находиться по пути:

modules/custom/

Мой модуль будет называться как – my_module. Создаем папку с именем my_module по пути указанному выше. Само название файлов, так же претерпело изменения.

Файл my_module.info.yml

Создадим файл в корне нашего модуля - my_module.info.yml . Как вы могли догадаться, данный файл пришел на смену – my_module.info из 7 ветки, но он так же несет в себе лишь описания для модуля. В моем случае - данный файл выглядит так:

    name: "My module"

    description: "Create page in drupal 8"

Здесь особо рассказывать нечего, из файла понятно, что за что отвечает. После создания данного файла, мы можем увидеть наш модуль на странице модулей:

Который, мы естественно активируем.

Хочу заметить, что теперь нельзя отключить модуль. Есть только два состояния, установить и удалить.

Естественно, после активации модуля мы не увидим ничего, кроме галочки напротив нашего модуля, которая обозначает, что он установлен. Теперь переходим к созданию страницы. В Drupal 8 мы теперь не можем определить hook_menu и создать новую страницу на сайте. На смену ему пришли роутинги (routing [маршруты]) в формате yml.

Файл my_module.routing.yml

Создадим файл my_module.routing.yml в корне нашего модуля. Данный файл служит для описания маршрута по базовому шаблону. В качестве параметров маршрута выступают такие значения как:

  • Заголовок страницы
  • URL страницы
  • Котроллер
  • Права доступа
  • И т.д.

В нашем случае, этих параметров будет достаточно, что бы описать страницу.

    my_module.routing:

    path: "/my_module"

  1. Title: "My Module"

    Controller: "\Drupal\my_module\Controller\MyModuleController::test"

  2. Permission: "access content"

Каждое название роутинга должно быть уникальное (my_module.routing). Список параметров:

  • path – URL будущей страницы
  • defaults – содержит значения по умолчанию. Все значения начинаются с префиксов «_»
  • _title – Заголовок страницы
  • _controller – путь до контроллера, где далее указываются класс и метод контроллера (MyModuleController::test)
  • requirements – содержит значения зависимостей. Все значения так же начинаются с префиксов «_»
  • _permission – определяет доступ к странице, в нашем случае «Для всех пользователей, которые имеют право просматривать контент»

Хочу заметить, что в ранних версиях Drupal 8 использовался «_content», вместо «_controller». Убедитесь, что вы используете стабильную версию Drupal 8.

С маршрутами определились. Теперь займемся самим контроллером, который мы указали в параметре «_defaults» значение «_controller».

Все контроллеры модуля должны находиться по пути

modules//src/Controller

Создайте необходимые папки внутри вашего модуля.

Файл MyModuleController.php

Создадим файл MyModuleController.php в корне папки Controller . Теперь, как вы могли заметить, мы имеем дело с ООП. В данном файле нам необходимо определить наш класс MyModuleController и его метод test . Названия класса и метода, мы так же забираем из файла my_module.routing.yml . В нашем случае, данный файл выглядит так:

Как вы могли заметить, метод test отдает последние опубликованные статьи на сайте, с помощью функций node_load_multiple() и node_view_multiple() – данные функции никуда не исчезли и остались от Drupal 7.

Хочу заметить, что метод test должен всегда отдавать массив.

Так же мы использовали namespace , не стоит забывать про него, если не хотите получить проблемы в будущем. Если кто не знает, позволяет нам избавиться от 2х одинаково именованных классов.

С контроллером мы так же определились. Теперь чистим кеш сайта, переходим по пути

sitename/my_module

Теперь, нам осталось добавить пункт меню в основное меню сайта. Для этого, в корне нашего модуля, создадим файл my_module.links.menu.yml , в котором мы и будем описывать пункт меню. В нашем случае, данный файл будет выглядеть так.

Эта статья является второй из трех частей серии о том, как построить модуль Drupal 8 .
Как построить модуль Drupal 8:

В статье этого цикла мы начали с азов. Мы рассмотрели, какие файлы необходимы, чтобы сообщить Drupal о нашем модуле, как работает процесс маршрутизации и как программно создать ссылки меню в качестве конфигурации.

В этой статье мы продолжим работу с нашим модулем, который вы можете посмотреть в этом хранилище , и рассмотрим два других важных функциональных элемента: блоки и формы.

Для этого мы создадим пользовательский блок, который возвращает некоторый настраиваемый текст. После этого, мы создадим простую форму, используемую для вывода на экран введенных пользователем данных.

Блоки Drupal 8

Крутым нововведением в Drupal 8 стали более наглядные блоки, что практически преобразовало их в плагины (новая концепция бренда ). То есть теперь они представляют собой функциональные элементы, которые можно использовать в разных местах.

Вы можете создать в пользовательском интерфейсе блок и использовать его по всему сайту — вы больше не ограничены в использовании блока только одним местом применения.

Давайте продолжим и создадим простой тип блока, который выводит на экран по умолчанию «Привет, Мир! «. Все, что нам понадобится — это один файл классов, расположенный в папке src/Plugin/Block корневой директории нашего модуля.

Давайте назовем наш новый тип блока DemoBlock , и, естественно, он должен будет содержаться в файле с именем DemoBlock.php . В этот файл мы для начала можем добавить следующее:

$this->t("Привет, Мир!"),); } /** * {@inheritdoc} */ public function access(AccountInterface $account) { return $account->hasPermission("access content"); } }

Как и для любого другого файла классов, мы начинаем с определения области имен нашего класса. Затем мы используем класс BlockBase , так чтобы мы могли расширить его, а также класс AccountInterface , так чтобы мы могли получить доступ к текущему активному пользователю. Затем следует то, с чем вы определенно не встречались в Drupal 7 : аннотации.

Аннотации являются инструментом пояснения PHP , они расположены в блоке комментариев того же файла, в котором определяется класс. Используя аннотации, мы сообщаем Drupal , что мы хотим зарегистрировать новый тип блока (@Block ) с идентификатором demo_block и admin_label — Demo block (передаваемым через систему перевода ).

Далее, мы расширяем класс BlockBase в наш собственный DemoBlock , внутри которого мы реализуем два метода (наиболее распространенные из них мы будем рассматривать подробно позже). Метод build() — наиболее важный из них, так как он возвращает отображаемый массив, который будет выводить блок. Метод access() контролирует права доступа для просмотра этого блока.

Параметр, передаваемый в него, является экземпляром объекта класса AccountInterface , в качестве которого в этом случае будет выступать текущий пользователь.

Еще одна интересная вещь, которую я хочу отметить. Мы больше не используем для перевода глобально функцию t() , а ссылаемся на метод t() , реализованный в родительском классе.

Вот и все. Теперь вы можете очистить кэш и перейти на страницу конфигурации Block layout . Здорово, что типы блоков располагаются справа (где вы можете их отфильтровать ), и вы можете разместить один или несколько из этих типов блоков в различных местах на вашем сайте.

Конфигурация блока Drupal 8

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

Мы сделаем так, чтобы вы могли отредактировать блок, указать в текстовом поле имя, после чего блок будет говорить «Привет » не миру, а этому имени.

Во-первых, мы должны определить форму, содержащую текстовое поле. Так в нашем классе DemoBlock мы можем добавить новый метод blockForm() :

/** * {@inheritdoc} */ public function blockForm($form, &$form_state) { $form = parent::blockForm($form, $form_state); $config = $this->getConfiguration(); $form["demo_block_settings"] = array("#type" => "textfield", "#title" => $this->t("Who"), "#description" => $this->t("Кому Вы хотите сказать "Привет"?"), "#default_value" => isset($config["demo_block_settings"]) ? $config["demo_block_settings"] : "",); return $form; }

Эта форма реализации API очень похожа на Drupal 7 . Однако есть и определенные новые элементы. Во-первых, мы извлекаем массив $form из родительского класса (так мы создаем свою форму на базе существующей, добавляя собственное поле).

Это элементы стандарта OOP . Затем мы извлекаем и сохраняем конфигурацию этого блока.

Класс BlockBase определяет метод getConfiguration() , который делает это для нас. И в случае, если он был уже установлен, мы устанавливаем для demo_block_settings значение #default_value .

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

/** * {@inheritdoc} */ public function blockSubmit($form, &$form_state) { $this->setConfigurationValue("demo_block_settings", $form_state["values"]["demo_block_settings"]); }

Этот метод также находится внутри класса DemoBlock , и все, что он делает, это сохраняет значение поля demo_block_settings в качестве нового пункта конфигурации блока (с ключом того же имени для соответствия ).

Наконец, мы должны настроить наш метод build() , так чтобы включить в него имя, которому блок должен говорить «Привет! «:

/** * {@inheritdoc} */ public function build() { $config = $this->getConfiguration(); if (isset($config["demo_block_settings"]) && !empty($config["demo_block_settings"])) { $name = $config["demo_block_settings"]; } else { $name = $this->t("никто"); } return array("#markup" => $this->t("Привет, @name!", array("@name" => $name)),); }

До сих пор все было довольно просто. Мы извлекаем конфигурацию блока и если значение нашего поля установлено, мы используем его в операторе вывода на экран. Если нет, то используется общее выражение. Вы можете очистить кэш и проверить, работает ли блок.

Для этого отредактируйте блок, чтобы назначить ему регион, и добавьте имя, которому блок должен сказать «Привет !»

Следует также иметь в виду, что вам придется еще разобраться с проверкой безопасности данных, которые вводит пользователь для вывода на экран. Я не включил этот этап, чтобы не раздувать статью.

Формы Drupal 8

Последнее, что мы сегодня рассмотрим, это, как создать простую форму. Из-за ограниченных возможностей этой статьи, я не смогу охватить управление ее конфигурацией (хранимые значения конфигурации, представленные через формы ). Я только покажу, как определяются формы, и как веденные значения выводятся на экран.

В Drupal 8 функции определения формы сгруппированы внутри класса. Давайте определим простой класс DemoForm в файле src/Form/DemoForm.php:

"email", "#title" => $this->t("Your .com email address.")); $form["show"] = array("#type" => "submit", "#value" => $this->t("Submit"),); return $form; } /** * {@inheritdoc} */ public function validateForm(array &$form, array &$form_state) { if (strpos($form_state["values"]["email"], ".com") === FALSE) { $this->setFormError("email", $form_state, $this->t("This is not a .com email address.")); } } /** * {@inheritdoc} */ public function submitForm(array &$form, array &$form_state) { drupal_set_message($this->t("Your email address is @email", array("@email" => $form_state["values"]["email"]))); } }

Помимо элементов стандарта ООР , все остальное должно выглядеть для вас очень знакомым по Drupal 7 . Форма API осталась в значительной степени такой же (за исключением добавления некоторых новых элементов формы и этого класса инкапсуляции). Так что же происходит в приведенном выше коде?

Во-первых, мы объявляем область имен класса и используем класс ядра FormBase , чтобы мы могли расширить его нашим собственным классом DemoForm . После этого мы реализуем четыре метода, три из которых должны быть вам знакомы. Метод getFormId() является новым. Его использование обязательно. Он применяется, просто чтобы возвращать машинное имя формы.

Метод buildForm() также обязателен, он создает форму. Как? Так же, как и в Drupal 7 . Метод validateForm() является необязательным, и его предназначение должно быть вам понятно по Drupal 7 . И, наконец, метод submitForm() производит обработку предоставления данных. Все очень логично и организовано.

Так чего мы пытаемся достичь с помощью этой формы? У нас есть поле электронной почты (новый элемент формы в Drupal 8 ), мы хотим, чтобы пользователи заполняли его. По умолчанию Drupal проверяет, является ли входное значение в действительности адресом электронной почты.

Но наша функция проверки определяет, принадлежит ли этот адрес электронной почты серверу с доменом .com , и если нет, то форма выдает ошибку. И в конце обработчик предоставленных данных просто выводит сообщение на странице.

И последнее, что нам нужно сделать, чтобы использовать эту форму, это предоставить для нее маршрут. Поэтому отредактируйте файл demo.routing.yml и добавьте в него следующее:

demo.form: path: "/demo/form" defaults: _form: "DrupaldemoFormDemoForm" _title: "Demo Form" requirements: _permission: "access content"

Этот код должен выглядеть для вас знакомым по , в которой мы рассматривали маршрутизацию для простой страницы. Единственное отличие заключается в том, что вместо _content в блоке defaults , мы используем _form , чтобы указать, что целью является класс формы. И поэтому значением является имя класса, который мы только что создали.

Очистите кэш и перейдите по адресу demo/form , чтобы проверить форму.

Если вы знакомы с drupal_get_form() , и задаетесь вопросом, как вам загрузить форму способом, к которому вы привыкли по Drupal 7 , ответ заключается в глобальном классе Drupal .

Таким образом, чтобы получить форму, вы можете использовать его метод formBuilder() и сделать что-то вроде этого:

$form = Drupal::formBuilder()->getForm("DrupaldemoFormDemoForm");

После этого вы можете вернуть $form , которая будет представлять собой отображаемый массив формы.

После того, как и готов к работе, самое время познакомиться с админкой Drupal. Админка Drupal представляет из себя набор инструментов, с помощью которых вы получаете доступ к функционалу Drupal.

Админка Drupal: Панель управления

В верхней части сайта вы увидите панель управления, реализованную с помощью модуля – «Toolbar», в котором находится все необходимое для работы с сайтом. Панель управления состоит из двух разделов: панель меню (верхняя черная) и панель ярлыков (нижняя серая).

Панель меню

Давайте рассмотрим каждую кнопку панели меню более детально:

Все пункты меню можно редактировать. Вы можете удалять, добавлять и менять их местами. Чтобы это сделать, перейдите в Структура > Меню > Management .

На практике мы видим, что панель меню логически продуманна и не требует никаких особых изменений, советую вам оставить все как есть. А для того, чтобы получить быстрый доступ к определенным опциям на сайте, вы можете воспользоваться ярлыками, поговорим о них чуть ниже.

Мы рассмотрели практически все кнопки панели меню, без внимания остались только: учетная запись пользователя (1), которая показывает текущего активного пользователя, находящегося в данный момент на сайте. И «Выйти» (2), это кнопка, с помощью которой можно выйти с админки Drupal.

Если вы часто посещаете определенный раздел в админке Drupal, то чтобы получить к нему быстрый доступ, можете воспользоваться ярлыками. Ярлыки будут помещены ниже, под панелью меню.

Для того, чтобы создать свой ярлык, в открывшемся окне нажмите – «Добавить ярлык».

Пишем название ярлыка (1), и ниже указываем путь к странице, куда будет вести созданный ярлык (2). В примере я создам ярлык на страницу добавления новой статьи на сайт.

Мы видим, что у нас на панели управления появился новый ярлык – «Добавить статью».

Если вы вышли и не знаете как зайти в админку Drupal, то вы можете воспользоваться блоком – «Вход на сайт». Указываете свой логин и пароль администратора и нажимаете кнопку «Войти».

Если блок «Вход на сайт» отключен, то чтобы зайти в админку Drupal, введите в адресной строке браузера: http://имя_вашего_сайта/user. На открывшей странице появится форма входа, введите логин и пароль администратора и нажмите кнопку «Войти».

Для того, чтобы с админкой Drupal было удобнее работать, существуют два модуля – Administration menu и Module Filter, о них мы поговорим в следующих уроках.

Самые необходимые модули для проектов на Друпал.

Ниже привожу свой список так называемых "Must have" модулей, без которых вряд ли обходится хоть один из моих проектов.

Со временем пост будет обновляться, буду добавлять новые модули.

Содержимое:

Модули Drupal для администрирования:

  • Administration menu - Удобное выпадающее меню вверху страницы. Быстрый доступ ко всем административным страницам, в любой момент. Минимум настроек.
  • Module Filter - Переопределяет страницу модулей в более удобную. Добавляет динамический фильтр по названию модуля. Когда модулей становится много - без него никак.
  • Localization update - Автоматический перевод модулей и ядра Drupal.

Модули Drupal для работы с контентом:

  • Add another - Кнопка добавления еще одного материала. Сохраняет материал и загружает страницу создания нового материала того же типа. Удобно если добавляешь несколько нод подряд.
  • Entityforms - Модуль для создания пользовательских форм. Пришел на замену устаревающему Webform .
  • Entityform Anonymous - Позволяет заполнять формы созданные модулем Entityforms не авторизировавшимся пользователям.
  • Field collection - Добавляет возможность создавать мультиполя для сущностей. Сами поля представлены в качестве отдельной сущности, в которую соответственно можно добавить любое количество полей всех типов, поддерживаемых сайтом. Возможно расширить дополнительными модулями: Field Collection Table - отображение коллекции полей таблицей, и Field collection views - для поддержки модулем Views.
  • Field Group - Добавляет возможность группировать поля всевозможными способами: отдельными блоками, HTML5-элементами, jQuery-аккордионом или вкладками (горизонтальные/вертикальные).
  • Views - Вывод любой информации из БД. Очень много настроек. Можно вывести все - пользователей, ноды, таксономию, любые сущности... Вывод таблиц, неформатированных данных, с помощью дополнительных модулей возможно расширение способов вывода. Например можно сделать страницу экспорта сущностей и их полей. Гипкая настройка отображений с возможностью дополнительной темизации. Очень мощный модуль! С 8-й версии Drupal будет включен в ядро.
  • Chaos tool suite (Ctools) - Набор инструментов для работы с данными. Требуется для множества модулей.
  • CKEditor - WYSIWYG (визуальный HTML) редактор с большим количеством настроек.
  • Colorbox Node - Отображение контента в popup-окне без регионов темы. Удобно для, например, отображения WEB-форм или пользовательского соглашения во всплывающем окне.
  • Database Optimization - Модуль добавляет возможность автоматической (по расписанию Cronetab) очистки кеша и оптимизацию базы данных (вручную).
  • Panels - Очень гибкая настройка вывода информации. Интегрирована с Views. Имеет собственные настройки контекста для отображения данных. Встроенный шаблонизатор (настройка макетов отображения). Возможность создавать и настраивать собственные макеты. Позволяет выводить представления, блоки, любые сущности и собственную информацию. Настройка селекторов отображаемой информации.
  • Display Suite - Позволяет переопределить шаблон вывода сущностей. Обладает множеством настроек для дополнительной темизации. Очень много полезных функций, например: имеет встроенный шаблонизатор (работает по аналогии с Panels , в том числе поддерживает макеты Panels ), позволяет настраивать отображение заголовка, дает возможность переопределить классы отдельно поля/лейбла и общий вид отображения поля, включать в шаблон ноды поле с представлением (Views) или блоком, и многое другое.

Модули Drupal для работы с мультимедиа:

  • Colorbox - Удобный "litebox" плагин, для просмотра изображений (и, в принципе, любого контента) во всплывающем (popup) окне.

Модули Drupal для автоматизации:

  • Rules - Пользовательский интерфейс, позволяющий создавать правила поведения сайта, при определенных событиях. Очень мощный модуль. Возможно самое разнообразное применение: от рассылки почты, до автоматического формирования цены в интернет-магазинах. Используя этот модуль можно добиться уникального функционала даже без знания языков программирования.
  • Conditional Rules - Модуль расширяет функционал модуля Rules . Позволяет использовать условия в действиях правила. Упрощает написание правил, добавляет возможность проверки непосредственно в правиле.
  • Token - Доступ к статическим данным, а также переменным сущностей, с помощью вставки специальных строк (Токенов ) в текст. Используется множеством модулей. Необходим для формирования логических ЧПУ и т.д.
  • Pathauto - Настройка шаблонов автоматической генерации путей страниц (ЧПУ). Работает с модулем Token .

Reading Time: 4 minutes

M odules are essential components of Drupal that add extended functionality to the website and turn a simple website into a very powerful beast!

One of the best features of Drupal 8 is that it integrates several essential modules into the core of the CMS. This is a major improvement over Drupal 7! In this article, I will highlight several Drupal 8 ready modules for different use cases.

Admin Modules

A responsive admin menu with extra functionality always comes handy when managing a Drupal site. Here are some Drupal 8 modules for your Admin menu.

Admin Toolbar

This module replaces the original admin menu with a responsive version that greatly improves the original menu’s functionality by adding drop-down menus. This speeds up the access to all administration pages. You could extend the functionality further by adding extra links for flushing cache and running Cron jobs.

Field Group

The field group module allows easier organization of the content by grouping the fields together in either vertical or horizontal tabs, divs, accordions etc. This module greatly enhances the user experience for content editors.

Linkit

This is an extremely useful module that allows auto-complete feature for all internal and external links. Now, the content producers do not have to remember the exact URL. Adding the URL and the process of hyperlinking is now easy because of the very user-friendly UI of the module.

PathAuto

Relevant and easy to remember URLs are an essential practice for website’s SEO. This module automatically generates relevant and easy to remember URL according to your web page. These URLs ensure that the pages on the website rank better in search engines and that the pages perform well in SERP.

Drupal 8 Modules for Website Builders

BigPipe

Page load time is one of the most important parameters for both the users and search engines. If the page does not load quickly, the users will abandon the website and search engine might penalize your website! With the use of the right Drupal 8 modules, you will never have to compromise on performance metrics.

This module implements BigPipe caching, originally introduced by Facebook, in order to speed up the website. The module first renders the cached components of the page and then loads up the dynamic components. This way, the page load speed increases dramatically.

This module allows you to transfer and use your website’s configurations and components to other websites without any major issues.

Drupal 8 Blog Modules

Blog

The Blog module used to be a core Drupal 7 module, but has been removed from the core of Drupal 8 to a contributed Drupal 8 module. This module, as the name suggests, allows the website administrators to build and maintain a blog.

For a blogger, increasing the online reach is the top priority at all times. Social media remains the most important aspect of any strategy of increasing the reach of the blog. This module allows you to add social sharing buttons that let the visitors on the blog quickly share the content across their social media profiles.

Drupal 8 Newsletter Modules

MailSystem

The Newsletter Module for Drupal 7 has, unfortunately, not been ported over to Drupal 8. However, the MailSystem module can be used as a workaround. This module allows you to set the templates and themes for the outgoing mail. You could also send regular newsletters to your subscribers through the module.

Drupal 8 Picture Modules

The Drupal 8 core includes the responsive_image module into the core of the CMS.