Drupal 8 создаем свой модуль

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

By Jay Callicott

October 26, 2016

Editor"s Note: For the latest and greatest in Drupal 8, check out Jay"s most recent top Drupal 8 modules list.

Introduction

Welcome back to another Drupal t op modules blog post from Mediacurrent. Last year, I wrote the but never fear, we are back again with some great modules for Drupal 8. These are modules I strongly recommend because I use them on most new builds.

One thing worth mentioning is that this list is shorter than usual. One reason is that Drupal 8 is still fairly new (about a year old) and there aren’t as many stable modules in the wild as there are for Drupal 7. For a more extensive list, you can search most installed modules on Drupal.org.

The other reason for this being a shorter list is a good one - Drupal 8 provides a lot more functionality out of the box. With Drupal 8 you can launch production-ready sites with fewer contributed modules than ever. This is a win in my view.

For some context, I added some notes towards the end of the post that mention why some modules were left off this list. Some modules were ported to Drupal 8, some are in D8 limbo, others didn’t make the list for other reasons.

Finally, for this blog, I added Beginner/Intermediate/Advanced labels for each module listed to help you sort through which modules are the best fit for your own level of expertise.

Enjoy! Send your feedback and hate mail to my Twitter account @drupalninja or leave a comment below.

Jay "s Best Drupal 8 Modules List

  1. Admin Toolbar (Beginner) - The admin toolbar module effectively replaces the popular admin menu module in Drupal 8. You will still get your rollover menus but now the entire menu is responsive.
  2. Backup and Migrate (Beginner) - Backup and migrate is still a useful module to easily schedule database backups for your Drupal site.
  3. Components (Intermediate) - If you are doing any Twig theming this module is going to help you with your Twig file includes.
  4. Config Installer (Advanced) - The config installer module allows you to install a new site using existing configuration. Without this module Drupal would complain about UUIDs not matching. If you are an experienced developer writing custom install profiles this module will be very useful for you. Eventually this logic will be moved into core.
  5. Devel (Intermediate) - Devel has been around a long time and is still a great module for developer debugging.
  6. Field Group (Beginner) - This is a helpful module for cleaning up your content types. You can organize fields into tabs, accordions, etc. to give your content editors a better experience.
  7. Google Analytics (Beginner) - This simple module allows site admins the ability to easily configure Google Analytics in Drupal.
  8. Linkit (Beginner) - Still a great module for linking content with a nice interface for editors.
  9. Metatag (Beginner) - Maintained by Mediacurrent’s very own , this module is a must have for configuring your site’s meta tags.
  10. Panels / CTools / Page Manager (Intermediate) - Panels has been around for quite a while and has now been completely rebuilt for Drupal 8. If you are going to use one of these modules you are probably using all three. Panels gives you more control over page layouts than you are going to get with the core block layout page.
  11. Paragraphs / Entity Reference Revisions (Intermediate) - The paragraphs module is a Mediacurrent favorite for a couple of reasons. First, it will let you wave goodbye to field collections . Second, it will let you build a more robust content architecture. Paragraphs are like mini-content types that can handle a variety of use cases.
  12. Pathauto / Token (Beginner) - The pathauto module is a must-have module for configuring page path patterns.
  13. Redirect (Beginner) - Almost every new site needs to incorporate 301 redirects for old page URLs. The redirect module gives site admins an easy interface for creating those redirects in Drupal.
  14. Search API (Intermediate) - The Search API suite of modules is a fantastic way to configure your site searches. Now the Drupal 8 module includes the DB API which makes it even easier to get started.
  15. View unpublished (Beginner) - This is a small but handy module that fills a common permissions void in Drupal. Almost every site we do has a role without complete content editing privileges. That role still needs to be able to view unpublished content which you can’t really configure out of the box in Drupal 8.
  16. Simple Sitemap (Intermediate) - A pretty easy to configure module for creating XML sitemaps for search engines.

Modules removed from previous list

The following modules were either ported to Drupal 8 core or replaced by similar functionality in core:

Other notable mentions

    Address field - Replaced by Address in Drupal 8. I haven’t found myself using this module lately.

    Commerce - Still a must-have module for commerce sites. I haven’t done as many e-commerce sites lately.

    Features / Strongarm - With Drupal 8 configuration management you don’t really need the Features module. There is still a Drupal 8 module but we have replaced it on our projects with D8 configuration and the config_installer profile.

    File entity - Still available in Drupal 8. A must-have if you need to add fields to files like images.

    Global Redirect - No Drupal 8 module. Some functionality has been ported to the Redirect module.

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.

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

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

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

Панель меню

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

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

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

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

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

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

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

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

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

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

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