Друпалургия

Drupal 8 -> Знакомимся с консолью (Drupal Console)

Drupal в рунете - чт, 09/11/2017 - 17:34
Что такое Drupal консоль?

Это интерфейс командной строки(CLI), предназначенный для генерации стандартного кода, взаимодействия и отладки Drupal.
Изначально проект задумывался как утилита скаффолда, но потом консоль выросла в полноценную CLI утилиту.
Drupal консоль делает использование Symfony консоли и других сторонних компонентов, которые позволяют автоматически генерировать большую часть кода необходимую для модуля Drupal 8. В дополнению к этому консоль позволяет взаимодействовать с Вашим Drupal проектом.

Почему мне стоит ознакомиться с этим?

Drupal 8 намного более технически развит чем его предшественники и освоить сложность некоторых задач могло бы обескуражить кого угодно. Drupal консоль - это набор утилит, позволяющий сильно упростить жизнь разработчика. Написание модуля для Drupal 8 требует больше шаблонного кода и много чего нужно знать, чтобы просто начать создавать новый модуль. Эти задачи могут быть рутинными и скучными, и поэтому приводить к увеличению потенциальных ошибок. К счастью, большое количество нового кода может быть автоматически сгенерировано, используя Drupal консоль, без возможных рисков и копи-паста ошибок и траты кучи ценного времени.

Как Drupal консоль помогает?
  • Генерация кода и файлов необходимых для модуля Drupal 8.
  • Исследовать и отлаживать систему.
  • Взаимодействовать с инсталляцией Drupal.
  • Изучать Drupal 8 (для этого используется ключ --learning)
Где мне найти проект? Главная страница проекта

http://drupalconsole.com

Репозиторий Github

https://github.com/hechoendrupal/drupal-console

Документация

https://docs.drupalconsole.com/

Чат поддержки

https://gitter.im/hechoendrupal/DrupalConsole

Больше информации на странице поддержки Drupal.org

https://drupal.org/project/console

Получение проекта

Вам нужно установить 2 вещи, чтобы DrupalConsole заработала:

  1. DrupalConsole Launcher
  2. DrupalConsole itself
Зачем мне Launcher?

Это глобальное приложение, позволяющее Вам запустить команду drupal из любой поддиректории Вашего проекта. Без этого Вам прийдется запускать команду только из корневой директории сайта.

Установка DrupalConsole для каждого из Ваших проектов

Начиная с Drupal 8 RC DrupalConsole должна устанавливаться для каждого сайта.

Использование проекта

Drupal консоль предоставляет два типа команд:

  1. Глобальные команды лаунчера: эти команды могут запускаться за пределами корневой директории Drupal 8.
  2. Команды имеющие отношение к конкретному сайту: эти команды должны быть выполнены внутри корневой директории Drupal 8.
Выполнение команд Drupal консоли вне корневой директории сайта

Вы можете выполнить команды Drupal консоли из любой директории в вашей системе, используя ключ --root, чтобы задать корневую директорию Drupal.

drupal --root=/var/www/drupal8.dev cr all

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

Как копировать конфигурационные файлы?

Первой задачей, которую Вам нужно будет сделать после установки Drupal консоли - это запустить команду init. Эта команда скопирует конфигурационные файлы проекта на Ваш компьютер. Изменяя значений в этих файлах Вы сможете изменить поведение Drupal консоли.

drupal init [--override]

Первым вопросом, который вы увидите после запуска этой команды будет Select destination to copy configuration(выберите путь назначения для копирования конфигурации) и набор опций будет меняться в зависимости от директории где Вы запустили эту команду:

Запуская эту команду не из корневой директории сайта Вы увидите:

Select destination to copy configuration:
  [0] /etc/console/
  [1] /Users/username/.console/
 >

Запуская эту команду из корневой директории сайта.

 Select destination to copy configuration:
  [0] /etc/console/
  [1] /Users/username/.console/
  [2] /path/to/drupal8.dev
 >

Остальная часть опций не зависит от директории в которой была запущена команда.

Как скачивать, установить и обслуживать Drupal 8?

Наиболее простым способом потестировать Drupal 8 на вашей машине является следующая команда:
drupal quick:start

Обратите внимание, что перед этим нужно выполнить drupal init чтобы скопировать ~/.console/chain/quick-start.yml в Вашу локальную систему.

Команда  chain поможет автоматизировать запуск команды, давая возможность задать внешний YAML файл, содержащий описание, опции и аргументы нескольких команд и запустить этот список команд в соответствии с последовательностью их описания в файле.

Содержимое предоставляемого файла ~/.console/chain/quick-start.yml следующее:

# How to use
# quick:start --directory="/path/to/drupal-project/"
# quick:start --directory="/path/to/drupal-project/" --profile="minimal"
# quick:start --repository="acquia/lightning-project:^8.1" --directory="/path/to/drupal-project/" --profile="lightning"
command:
  name: quick:start
  description: 'Download, install and serve a new Drupal project'
vars:
  repository:
    - drupal-composer/drupal-project:8.x-dev
    - acquia/lightning-project
    - acquia/reservoir-project
  profile: standard
commands:
  # Create Drupal project using DrupalComposer
  - command: exec
    arguments:
      bin: composer create-project %{{repository}} %{{directory}} --prefer-dist --no-progress --no-interaction
  # Install Drupal
  - command: exec
    arguments:
      bin: drupal site:install %{{profile}} --root=%{{directory}} --db-type="sqlite" --no-interaction
  # Start PHP built-in server
  - command: exec
    arguments:
      bin: drupal server --root=%{{directory}}ß

Данная конфигурация запустит несколько команд, которые скачают и установят Drupal используя SQLite, и в конце запустят встроенный PHP сервер. Теперь Вам необходимо только открыть в браузере следующий URL 127.0.0.1:8088.

Вы можете продублировать или сделать изменения в YAML файле для загрузки модулей: module:download, установки модулей: module:install, импорта конфигураций: config:import и восстановления Вашей базы данных database:restore или любую другую команду, которая предоставляется Drupal консолью, или пользовательскую команду предоставляемую Вашим собственным модулем.

Как использовать Drupal консоль в мултисайтовой установке?

Drupal Console предоставляет поддержку мульти-сайтовых установок. Для отладки мульти-сайтов используется команда debug:multisite и опция --uri для взаимодействия с мульти-сайтовыми установками.

Как вывести все известные сайты при использовании мультисайта?

Drupal консоль использует файл sites/sites.php для определения мультисайтовой конфигурации. Для примера смотрите файл sites/example.site.php

drupal debug:multisite

+---------------------+--------------------------------+
| Site                | Directory                      |
+---------------------+--------------------------------+
| drupal8.dev         | /var/www/drupal8.dev/default   |
| drupal8.multi.dev   | /var/www/drupal8.dev/multi.dev |
+---------------------+--------------------------------+

 Sites are written using the format: <port>.<domain>.<path>

Как запускать команды при мультисайтинге? drupal --uri=http://drupal8.multi.dev cr all
drupal --uri=drupal8.multi.dev cr all Использование псевдонимов сайтов(alias)

Drupal консоль позволяет Вам запускать команды на Вашем локальном сервере, но фактически Вы запускаете их на локальном, удаленном или виртуальном (VM, Docker) Drupal сайте используя псевдонимы.

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

Для определения удаленного сайта используется type: ssh. В этом случае команда ssh будет использоваться для запуска команд на удаленном сервере.

Псевдонимы сайтов можно получить используя следующие пути:

  • Глобально: ~/.console/sites/
  • Для каждого сайта: /path/to/site/console/sites/
Допустимые опции для псевдонимов сайтов

root: корневая директория Drupal проекта.
host: Доменное имя удаленной системы, не является объязательным для локальных сайтов.
port: Порт, который используется при соединении по ssh протоколу. По умолчанию используется порт 22.
user: Имя пользователя для соединения по ssh.
options: Массив допустимых опций Drupal консоли.
arguments: Массив аргументов Drupal консоли.
extra-options: Используется только если необходимы дополнительные опции, например, метод аутенификации и/или альтернативный идентификационный файл.
type: Тип сайта с которым будет происходить взаимодействие. Допустимые опции local, ssh, container. Опция local используется по умолчанию.

Настройка локального рабочего окружения

Использование псевдонимов сайтов требует определенной локальной настройки.

Глобальная конфигурация

Глобальная конфигурация может быть предоставлена копией этого файла ~/.console/config.yml. Эта информация сгруппирована по ключу  remote

application:
  ...
  remote:
    user: drupal
    port: 22
    options:
    arguments:
    type: ssh Конфигурация специфического сайта

Конфигурация псевдонима сайта может быть предоставлена добавлением YAML файла /path/to/site/console/sites/sample.yml или ~/.console/sites/sample.yml

local:
  root: /var/www/drupal8.dev
 type: local
dev:
  root: /var/www/html/drupal
  host: 140.211.10.62
  user: drupal
  type: ssh
prod:
  root: /var/www/html/docroot
  host: live.drupal.org
  user: drupal
  type: ssh Отладка сайтов

Все известные псевдонимы сайтов могут быть получены с помощью команды debug:site

drupal debug:site

+--------------------+-----------------+------------------------+
| Site               | Host            | Root                   |
+--------------------+-----------------+------------------------+
| sample.local       | local           | /var/www/drupal8.dev   |
| sample.dev         | 140.211.10.62   | /var/www/html/drupal   |
| sample.prod        | live.drupal.org | /var/www/html/docroot  |
+--------------------+-----------------+------------------------+

Детали конфигурации могут быть получены указанием имени сайта в качестве аргумента команды debug:site

drupal debug:site sample.dev

user: drupal
port: 22
options:
arguments:
root: /var/www/html/drupal
host: 140.211.10.62
type: ssh

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

Как использовать Drupal консоль для удаленной версии сайта?

Псевдонимы сайтов могут быть указаны с помощью параметра --target и имени сайта с которым Вы хотите взаимодействовать.

drupal --target=sample.dev cr all

Также псевдонимы сайта можно указать используя устаревший @ идентификатор:
drupal @sample.dev cr all

Подключение к виртуальному рабочему окружению

Вы можете подсоединиться к виртуальной машине или Докеру передавая значения для ключей extra-options и  type .

Пример для DrupalVM dev:
  root: /var/www/drupalvm/drupal
  host: 192.168.88.88
  user: vagrant
  extra-options: '-o PasswordAuthentication=no -i ~/.vagrant.d/insecure_private_key'
  type: ssh Пример для Drupal4Docker dev:
  root: /var/www/html
  extra-options: docker-compose exec --user=82 php
  type: container

Когда используется type: container, то необходимо указать значения для  host и  user .

Что дальше?

Это было описание основных возможностей Drupal консоли, достаточно мощного и удобного инструмента. За более подробной информацией советую обратиться к официальной документации, которую можно найти здесь: https://hechoendrupal.gitbooks.io/drupal-console/content/en/index.html.

P.S.: Взято отсюда http://stillfinder.net/ru/blog/drupal-8-znakomimsya-s-konsolyu-console

Модули и темы: console Ключевые слова: drupal console Тип материала: Предлагаю решение Версия Drupal: Drupal 8.* Форумы: Программирование 3 Thanks
Категории: Друпалургия

Релиз drupal.ru 6 Ноября 2017

Drupal в рунете - пн, 06/11/2017 - 04:20


Дело движется хорошо! Завершён следующий релиз 6-ое Ноября 2017, в котором ребята проделали невероятную работу! В этот раз мы увидим ещё больше улучшений:

* DevOps задачи, которые находятся в процессе реализации.



Вот, так список! С каждым разом, разработчиков становится всё больше. Каждый реализовывает то, что хочет и заслуживает отдельной благодарности! Конечно, вчитываться в эти задачи не хочется, а по ссылкам бегать лень. Оно и понятно. Поэтому разберём некоторые улучшения.

Что нового?

Появился дополнительный пункт меню, который позволяет создать "Запись в блог", "Событие" или "Компанию" из любого места на сайте. Здесь стоит сказать, что всё верхнее меню было координально переработано и упрощено, несмотря на то, что внешний вид его почти не изменился.
Новый блок с полезными ссылками позволит быстро взглянуть на правила сайта или отправить сообщение администрации сайта.
А жалобы и их решения больше не будут отвлекать на себя внимание, занимая в 10 раз больше места, чем сам комментарий. Теперь такая информация будет скрыта, но доступна, благодаря новым, стильным popover'ам.

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

Не смотря на то, что следующие задачи всё ещё в процессе выполнения, они уже опробованы на сервере разработки:

  • Добавление SSL-сертификата и включение https протокола
  • Включение http2

Сайт становится защищённей и быстрей! Вжух!
На самом деле, здесь каждая задача может быть описана, но мы остановимся на последней: все владельцы компаний теперь могут размещать рекламу о своей компании на сайте, в разделе Компании. При проверке, ко всем компаниям будет применяться только одно правило: предоставление услуг связанных с CMS Drupal: разработка, поддержка, хостинг, тренинги, проведение мероприятий. Не смотря на то, что публикация информации бесплатная, мы всё же встроили форму для пожертвования, для тех кто хочет поддержать проект. Таким образом, мы сможем продолжать улучшать площадку и информацию о Вашей компании увидит большее количество людей.

В разработке участвовали Кроме того, на благо сайта трудились

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

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

Ключевые слова: drupal.ru релиз проекта Форумы: Сайт и проект Drupal.ru 7 Thanks
Категории: Друпалургия

Релиз drupal.ru 6 Ноября 2017

Drupal в рунете - пн, 06/11/2017 - 04:20


Дело движется хорошо! Завершён следующий релиз 6-ое Ноября 2017, в котором ребята проделали невероятную работу! В этот раз мы увидим ещё больше улучшений:

* DevOps задачи, которые находятся в процессе реализации.



Вот, так список! С каждым разом, разработчиков становится всё больше. Каждый реализовывает то, что хочет и заслуживает отдельной благодарности! Конечно, вчитываться в эти задачи не хочется, а по ссылкам бегать лень. Оно и понятно. Поэтому разберём некоторые улучшения.

Что нового?

Появился дополнительный пункт меню, который позволяет создать "Запись в блог", "Событие" или "Компанию" из любого места на сайте. Здесь стоит сказать, что всё верхнее меню было координально переработано и упрощено, несмотря на то, что внешний вид его почти не изменился.
Новый блок с полезными ссылками позволит быстро взглянуть на правила сайта или отправить сообщение администрации сайта.
А жалобы и их решения больше не будут отвлекать на себя внимание, занимая в 10 раз больше места, чем сам комментарий. Теперь такая информация будет скрыта, но доступна, благодаря новым, стильным popover'ам.

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

Не смотря на то, что следующие задачи всё ещё в процессе выполнения, они уже опробованы на сервере разработки:

  • Добавление SSL-сертификата и включение https протокола
  • Включение http2

Сайт становится защищённей и быстрей! Вжух!
На самом деле, здесь каждая задача может быть описана, но мы остановимся на последней: все владельцы компаний теперь могут размещать рекламу о своей компании на сайте, в разделе Компании. При проверке, ко всем компаниям будет применяться только одно правило: предоставление услуг связанных с CMS Drupal: разработка, поддержка, хостинг, тренинги, проведение мероприятий. Не смотря на то, что публикация информации бесплатная, мы всё же встроили форму для пожертвования, для тех кто хочет поддержать проект. Таким образом, мы сможем продолжать улучшать площадку и информацию о Вашей компании увидит большее количество людей.

В разработке участвовали Кроме того, на благо сайта трудились

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

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

Ключевые слова: drupal.ru релиз проекта Форумы: Сайт и проект Drupal.ru 0 Thanks
Категории: Друпалургия

Drupal: Изменить расположение public и private директорий в инсталляционном профиле

Задача — изменить расположение public:// и private:// директорий при инсталляции друпала из свое профиля.

Сложность — эти директории теперь прописываются только в settings.php и менять их нужно на самой ранней стадии установки друпала.

Решение — в hook_install_tasks_alter() добавляем свой таск, копируем файл настроек при необходимости, изменяем его, сбрасываем кэш:

// profilename.install   use Drupal\Component\Utility\OpCodeCache; use Drupal\Core\Site\Settings;   /** * Implements hook_install_tasks_alter(). */

Читать дальше →

Похожие записи:

Категории: Друпалургия

Обновление Drupal (новая версия Drupal 8.4.2)

Drupal в рунете - пт, 03/11/2017 - 22:28


Примечания к выпуску:

Обновления с безопасностью отсутствуют.

Выпущена готовая к использованию версия Drupal 8.4.2

В этом релизе Drupal'а изменена, включенная в ядро, версия библиотеки ckeditor (с 4.7.3 до 4.7.2), в противном случае библиотека идентична Drupal 8.4.1

Если вы еще не обновили свой проект до версии ядра 8.4.0, то прочитайте об Drupal 8.4.0 перед обновлением.

Подробнее об этой версии Drupal

Ключевые слова: Drupal 8.4.2 Версия Drupal: Drupal 8.* Форумы: Безопасность 0 Thanks
Категории: Друпалургия

Обновление Drupal (новая версия Drupal 8.4.2)

Drupal в рунете - пт, 03/11/2017 - 22:28


Примечания к выпуску:

Обновления с безопасностью отсутствуют.

Выпущена готовая к использованию версия Drupal 8.4.2

В этом релизе Drupal'а изменена, включенная в ядро, версия библиотеки ckeditor (с 4.7.3 до 4.7.2), в противном случае библиотека идентична Drupal 8.4.1

Если вы еще не обновили свой проект до версии ядра 8.4.0, то прочитайте об Drupal 8.4.0 перед обновлением.

Подробнее об этой версии Drupal

Ключевые слова: Drupal 8.4.2 Версия Drupal: Drupal 8.* Форумы: Безопасность 0 Спасибо
Категории: Друпалургия

Обновление Drupal (новая версия Drupal 8.4.1)

Drupal в рунете - чт, 02/11/2017 - 13:59



Примечания к выпуску:

Обновления с безопасностью отсутствуют.

Выпущена готовая к использованию версия Drupal 8.4.1

Если вы еще не обновили свой проект до версии ядра 8.4.0, то прочитайте об Drupal 8.4.0 перед обновлением.

Ниже перечислены исправления, добавленные в Drupal 8.4.1 (в дополнение к десяткам других исправлений в Drupal 8.4.0):

Подробнее об этой версии Drupal

Ключевые слова: Drupal 8.4.1 Версия Drupal: Drupal 8.* Форумы: Безопасность 2 Thanks
Категории: Друпалургия

Обновление Drupal (новая версия Drupal 8.4.1)

Drupal в рунете - чт, 02/11/2017 - 13:59


Примечания к выпуску:

Обновления с безопасностью отсутствуют.

Выпущена готовая к использованию версия Drupal 8.4.1

Если вы еще не обновили свой проект до версии ядра 8.4.0, то прочитайте об Drupal 8.4.0 перед обновлением.

Ниже перечислены исправления, добавленные в Drupal 8.4.1 (в дополнение к десяткам других исправлений в Drupal 8.4.0):

Подробнее об этой версии Drupal

Ключевые слова: Drupal 8.4.1 Версия Drupal: Drupal 8.* Форумы: Безопасность 1 Спасибо
Категории: Друпалургия

Drupal: Установка Drupal 8 с помощью Composer и бубна

Всё чаще стали предлагать работу на Drupal 8, а я ещё толком за него и не брался. Дай думаю для начала создам свой профиль и переведу блог на восьмёрку, благо совсем недавно вышла версия 8.4.

Читать дальше →

Похожие записи:

Категории: Друпалургия

Расширение промо-страницы why.drupal.ru

Drupal в рунете - чт, 26/10/2017 - 16:04
Вводная

В России несколько удивительная ситуация (мы про Битрикс преимущественно). В том плане, что проприетарные CMS, которые далеки от концепта "приятный читаемый и безопасный код", вкладываясь в маркетинг могут у широкой аудитории создавать мнение "Друпал и другие CMS использовать нельзя, они небезопасны, а Битрикс можно ". К сожалению эта позиция стала уже, видимо, "маркетинговой политикой партии", т.к. битрикс-продавцы замечены с этим аргументом в разных городах в разное время. Что иногда вызывает проблемы с продажей Drupal'а.

Что хотим

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

Кому это нужно

Всем кто продает Drupal. Собственно запрос на эту страницу поступил от Анатолия Полицина, одного из спонсоров самой промо-страницы (еще раз спасибо! https://drupal.dru.io/thanks ). Ну и всех донатеров на странице благодарностей обязательно разместим.

Как помочь?

Деньгами и/или временем.

Если собственные ресурсы времени на создание сейчас нет возможности выделить, а ждать пока найдется время или человек со временем не хочется - тут хорошо работает краудфандинг. Сильно повышает шанс что через месяц-два решение будет (вспомним тот же https://www.drupal.org/association/d8accelerate ).

http://yasobe.ru/na/drupalpromo - страница для сбора средств. https://github.com/dru-io/promo/issues - тут можно помочь кодом/контентом/дизайном.

Ключевые слова: drupal promotion Тип материала: Предлагаю решение Форумы: Решение проблем 2 Thanks
Категории: Друпалургия

Расширение промо-страницы why.drupal.ru

Drupal в рунете - чт, 26/10/2017 - 16:04
Вводная

В России несколько удивительная ситуация (мы про Битрикс преимущественно). В том плане, что проприетарные CMS, которые далеки от концепта "приятный читаемый и безопасный код", вкладываясь в маркетинг могут у широкой аудитории создавать мнение "Друпал и другие CMS использовать нельзя, они небезопасны, а Битрикс можно ". К сожалению эта позиция стала уже, видимо, "маркетинговой политикой партии", т.к. битрикс-продавцы замечены с этим аргументом в разных городах в разное время. Что иногда вызывает проблемы с продажей Drupal'а.

Что хотим

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

Кому это нужно

Всем кто продает Drupal. Собственно запрос на эту страницу поступил от Анатолия Полицина, одного из спонсоров самой промо-страницы (еще раз спасибо! https://drupal.dru.io/thanks ). Ну и всех донатеров на странице благодарностей обязательно разместим.

Как помочь?

Деньгами и/или временем.

Если собственные ресурсы времени на создание сейчас нет возможности выделить, а ждать пока найдется время или человек со временем не хочется - тут хорошо работает краудфандинг. Сильно повышает шанс что через месяц-два решение будет (вспомним тот же https://www.drupal.org/association/d8accelerate ).

http://yasobe.ru/na/drupalpromo - страница для сбора средств. https://github.com/dru-io/promo/issues - тут можно помочь кодом/контентом/дизайном.

Ключевые слова: drupal promotion Тип материала: Предлагаю решение Форумы: Решение проблем 2 Спасибо
Категории: Друпалургия

Ошибки Drush в Drupal 8 и как их лечить

Drupal в рунете - вт, 24/10/2017 - 22:05

Если вы работаете с Drupal и видите ошибки при выполнении Drush команд похожие на эту:

PHP Fatal error:  Declaration of Drush\Command\DrushInputAdapter::hasParameterOption() must be compatible with Symfony\Component\Console\Input\InputInterface::hasParameterOption($values, $onlyParams = false) in /Applications/DevDesktop/tools/vendor/drush/drush/lib/Drush/Command/DrushInputAdapter.php on line 27

Fatal error: Declaration of Drush\Command\DrushInputAdapter::hasParameterOption() must be compatible with Symfony\Component\Console\Input\InputInterface::hasParameterOption($values, $onlyParams = false) in /Applications/DevDesktop/tools/vendor/drush/drush/lib/Drush/Command/DrushInputAdapter.php on line 27
Drush command terminated abnormally due to an unrecoverable error.   [error]
Error: Declaration of
Drush\Command\DrushInputAdapter::hasParameterOption() must be
compatible with
Symfony\Component\Console\Input\InputInterface::hasParameterOption($values,
$onlyParams = false) in
/Applications/DevDesktop/tools/vendor/drush/drush/lib/Drush/Command/DrushInputAdapter.php,
line 27

Причиной является то, что в Drupal minor релизе (8.4.х) компоненты Symfony были обновлены до версии 3.2.
Это вызывает конфликт, который исправляется обновлением Drush до версии 9. Для этого нужно выполнить следующую команду:

composer require drush/drush:9.*

Оригинал здесь

Ключевые слова: drupal 8 Тип материала: Предлагаю решение Версия Drupal: Drupal 8.* Drupal 7.* Форумы: Решение проблем 2 Thanks
Категории: Друпалургия

Ошибки Drush в Drupal 8 и как их лечить

Drupal в рунете - вт, 24/10/2017 - 22:05

Если вы работаете с Drupal и видите ошибки при выполнении Drush команд похожие на эту:

PHP Fatal error:  Declaration of Drush\Command\DrushInputAdapter::hasParameterOption() must be compatible with Symfony\Component\Console\Input\InputInterface::hasParameterOption($values, $onlyParams = false) in /Applications/DevDesktop/tools/vendor/drush/drush/lib/Drush/Command/DrushInputAdapter.php on line 27

Fatal error: Declaration of Drush\Command\DrushInputAdapter::hasParameterOption() must be compatible with Symfony\Component\Console\Input\InputInterface::hasParameterOption($values, $onlyParams = false) in /Applications/DevDesktop/tools/vendor/drush/drush/lib/Drush/Command/DrushInputAdapter.php on line 27
Drush command terminated abnormally due to an unrecoverable error.   [error]
Error: Declaration of
Drush\Command\DrushInputAdapter::hasParameterOption() must be
compatible with
Symfony\Component\Console\Input\InputInterface::hasParameterOption($values,
$onlyParams = false) in
/Applications/DevDesktop/tools/vendor/drush/drush/lib/Drush/Command/DrushInputAdapter.php,
line 27

Причиной является то, что в Drupal minor релизе (8.4.х) компоненты Symfony были обновлены до версии 3.2.
Это вызывает конфликт, который исправляется обновлением Drush до версии 9. Для этого нужно выполнить следующую команду:

composer require drush/drush:9.*

Оригинал здесь

Ключевые слова: drupal 8 Тип материала: Предлагаю решение Версия Drupal: Drupal 8.* Drupal 7.* Форумы: Решение проблем 2 Спасибо
Категории: Друпалургия

Drupal 8 -> Блоки и конфигурация

Drupal в рунете - вт, 24/10/2017 - 22:04

Block API в Drupal 8 была изменена таким образом, что сейчас блоки являются плагинами(plugins) и сущностями(entities) одновременно. Блоки в Drupal 8 совмещают в себе две разных API структуры: Block Plugin API, которое является автономным повторно используемым API, и Block Entity API, которое представляет собой конкретный вариант использования блока и управление его видимости. Это означает, что блоки теперь являются объектами с полями и работают с новой системой плагинов введенной в Drupal 8. То есть теперь Вы можете создавать новые сущности, добавлять в них поля, и отображать их по разному.

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

Далее в этой статье мы будем использовать модуль block_example из проекта Examples.

Блоки в Drupal 8

Вместо использования до 4-х разных хуков, чтобы определить блок (как это делалось в Drupal 7), система плагинов позволяет сделать следующее:

  • Использовать один файл для каждого блока.
  • Если у Вас есть новый блок, то Вы можете скопировать и вставить содержимое файла в новый файл и обновить метаданные и реализацию, и Вы получите новый блок.
  • Вместо работы с 4-я разными функциями в четырех разных местах, в одном или двух файлах, Вам нужен только один файл для каждого блока.
  • Вся необходимая логика находиться под рукой.
  • Метаданные объявляются в том же месте.
  • Вам не прийдется переходить в какой-либо файл и объявлять путь к Вашему классу, так-как есть автозагрузка.
  • Все содержится и инкапсулируется в одном файле.
Создание простого блока

В проекте Examples Вы найдете модуль block_example, который содержит три примера для разных типов блоков в директории src/Plugin/Block. Мы попробуем протестировать самый простой пример в котором создается пустой блок. Новый блок называется ExampleEmptyBlock, и его реализация находится в файле ExampleEmptyBlock.php.

Классы и аннотации

Все файлы классов должны начинаться с объявления пространства имен(namespace) класса. После создания пространства имен для класса мы расширим класс ядра Drupal BlockBase для создания класса ExampleEmptyBlock. С этим мы можем использовать Drupal аннотацию, которая появилась с версии Drupal 8.

Общие PHP аннотации - это закомментированный текст, который позволяет автоматически находить мета-данные и информацию, относящуюся к файлу класса. Пример описанный выше содержит аннотации специально для блока Example: empty block, размещенные во втором комментарии. Используя аннотации, мы сообщаем Drupal-у, что мы хотим зарегистрировать новый тип блока (@Block), с id example_empty и административным названием Example: empty block, что пройдет через систему переводов перед использованием в системе.

Аннотация {@inheritdoc} может быть использована в классе, когда вы переопределяете его функцию. Эта аннотация сообщает системе, что необходимо использовать документации класса-родителя.

Обратите внимание, что Drupal не сможет найти блок до тех пор, пока не будет правильной аннотации.

Это расширяет класс BlockBase в наш ExampleEmptyBlock, внутри которого мы реализуем метод build(). Это один из наиболее важных методов, так-как он возвращает массив готовый для рендера и вывода блока.

Очистите все кэши, перейдите на страницу конфигурации /admin/structure/block и кликните на Place Block для выбора Вашего нового блока.

Добавляем форму конфигурации к блоку

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

Дополнительные настойки конфигурации обрабатываются следующим образом:

  • Используя метод blockForm(), в котором Вы можете добавить элементы к получаемому массиву $form.
  • Используя метод blockSubmit() где вы сможете сохранить данные введенные пользователем.
  • Используя метод defaultConfiguration(), который задает значения конфигурации по умолчанию, отображаемые пользователю в момент первого открытия конфигурации.
Создание блока для формы

В этом примере мы будем использовать модуль block_example из проекта Examples. Код конфигурируемого блока размещается в файле block_example/src/Plugin/Block/ExampleConfigurableTextBlock.php.

Давайте рассмотрим новые возможности и функции:

  • Избегайте глобальных функций
    В Drupal 8 каждая часть кода содержит в себе все что может нам понадобиться. Это означает, что большинство функций содержатся в классах вместо глобальной видимости, то есть функции l() или t(), которые повсеместно использовались в Drupal 7 больше не рекомендованы. Их функциональность предоставляется классами через систему, называемую внедрение зависимости(dependency injection), которую мы обсудим в отдельной статье.
  • Расширение базовых классов
    Большинство компонентов, таких как блоки и контроллеры, используют шаблон в котором мы расширяем базовый класс. Базовый класс содержит большинство необходимого функционала, как например функцию t(). По этой причине, когда это возможно, полезно расширять базовый класс.

    В нашем примере мы создаем блок, который расширяет существующий класс BlockBase, что позволяет использовать метод класса $this->t(), делающий то же самое, что и функция t() в Drupal 7. Это дает нам возможность получить доступ к функции t() через вызов метода $this->t()

  • Трейты
    По сути трейт выполняет ту же роль, что и include, которая часто использовалась в Drupal 7. Он предоставляет дополнительные методы, которые могут быть включены в любой класс. Включая StringTranslationTrait в BlockBase, мы можем использовать любые методы трейта StringTranslationTrait как будто они являются частью BlockBase.

При написании статьи использовались следующие материалы:

Тип материала: Предлагаю решение Версия Drupal: Drupal 8.* Drupal 7.* Форумы: Программирование 3 Thanks
Категории: Друпалургия

Drupal 8 -> Блоки и конфигурация

Drupal в рунете - вт, 24/10/2017 - 22:04

Block API в Drupal 8 была изменена таким образом, что сейчас блоки являются плагинами(plugins) и сущностями(entities) одновременно. Блоки в Drupal 8 совмещают в себе две разных API структуры: Block Plugin API, которое является автономным повторно используемым API, и Block Entity API, которое представляет собой конкретный вариант использования блока и управление его видимости. Это означает, что блоки теперь являются объектами с полями и работают с новой системой плагинов введенной в Drupal 8. То есть теперь Вы можете создавать новые сущности, добавлять в них поля, и отображать их по разному.

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

Далее в этой статье мы будем использовать модуль block_example из проекта Examples.

Блоки в Drupal 8

Вместо использования до 4-х разных хуков, чтобы определить блок (как это делалось в Drupal 7), система плагинов позволяет сделать следующее:

  • Использовать один файл для каждого блока.
  • Если у Вас есть новый блок, то Вы можете скопировать и вставить содержимое файла в новый файл и обновить метаданные и реализацию, и Вы получите новый блок.
  • Вместо работы с 4-я разными функциями в четырех разных местах, в одном или двух файлах, Вам нужен только один файл для каждого блока.
  • Вся необходимая логика находиться под рукой.
  • Метаданные объявляются в том же месте.
  • Вам не прийдется переходить в какой-либо файл и объявлять путь к Вашему классу, так-как есть автозагрузка.
  • Все содержится и инкапсулируется в одном файле.
Создание простого блока

В проекте Examples Вы найдете модуль block_example, который содержит три примера для разных типов блоков в директории src/Plugin/Block. Мы попробуем протестировать самый простой пример в котором создается пустой блок. Новый блок называется ExampleEmptyBlock, и его реализация находится в файле ExampleEmptyBlock.php.

Классы и аннотации

Все файлы классов должны начинаться с объявления пространства имен(namespace) класса. После создания пространства имен для класса мы расширим класс ядра Drupal BlockBase для создания класса ExampleEmptyBlock. С этим мы можем использовать Drupal аннотацию, которая появилась с версии Drupal 8.

Общие PHP аннотации - это закомментированный текст, который позволяет автоматически находить мета-данные и информацию, относящуюся к файлу класса. Пример описанный выше содержит аннотации специально для блока Example: empty block, размещенные во втором комментарии. Используя аннотации, мы сообщаем Drupal-у, что мы хотим зарегистрировать новый тип блока (@Block), с id example_empty и административным названием Example: empty block, что пройдет через систему переводов перед использованием в системе.

Аннотация {@inheritdoc} может быть использована в классе, когда вы переопределяете его функцию. Эта аннотация сообщает системе, что необходимо использовать документации класса-родителя.

Обратите внимание, что Drupal не сможет найти блок до тех пор, пока не будет правильной аннотации.

Это расширяет класс BlockBase в наш ExampleEmptyBlock, внутри которого мы реализуем метод build(). Это один из наиболее важных методов, так-как он возвращает массив готовый для рендера и вывода блока.

Очистите все кэши, перейдите на страницу конфигурации /admin/structure/block и кликните на Place Block для выбора Вашего нового блока.

Добавляем форму конфигурации к блоку

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

Дополнительные настойки конфигурации обрабатываются следующим образом:

  • Используя метод blockForm(), в котором Вы можете добавить элементы к получаемому массиву $form.
  • Используя метод blockSubmit() где вы сможете сохранить данные введенные пользователем.
  • Используя метод defaultConfiguration(), который задает значения конфигурации по умолчанию, отображаемые пользователю в момент первого открытия конфигурации.
Создание блока для формы

В этом примере мы будем использовать модуль block_example из проекта Examples. Код конфигурируемого блока размещается в файле block_example/src/Plugin/Block/ExampleConfigurableTextBlock.php.

Давайте рассмотрим новые возможности и функции:

  • Избегайте глобальных функций
    В Drupal 8 каждая часть кода содержит в себе все что может нам понадобиться. Это означает, что большинство функций содержатся в классах вместо глобальной видимости, то есть функции l() или t(), которые повсеместно использовались в Drupal 7 больше не рекомендованы. Их функциональность предоставляется классами через систему, называемую внедрение зависимости(dependency injection), которую мы обсудим в отдельной статье.
  • Расширение базовых классов
    Большинство компонентов, таких как блоки и контроллеры, используют шаблон в котором мы расширяем базовый класс. Базовый класс содержит большинство необходимого функционала, как например функцию t(). По этой причине, когда это возможно, полезно расширять базовый класс.

    В нашем примере мы создаем блок, который расширяет существующий класс BlockBase, что позволяет использовать метод класса $this->t(), делающий то же самое, что и функция t() в Drupal 7. Это дает нам возможность получить доступ к функции t() через вызов метода $this->t()

  • Трейты
    По сути трейт выполняет ту же роль, что и include, которая часто использовалась в Drupal 7. Он предоставляет дополнительные методы, которые могут быть включены в любой класс. Включая StringTranslationTrait в BlockBase, мы можем использовать любые методы трейта StringTranslationTrait как будто они являются частью BlockBase.

При написании статьи использовались следующие материалы:

Тип материала: Предлагаю решение Версия Drupal: Drupal 8.* Drupal 7.* Форумы: Программирование 2 Спасибо
Категории: Друпалургия

Drupal 8 в 2 шага

Drupal в рунете - вт, 24/10/2017 - 21:59

Drupal 8 - это последняя стабильная версия Drupal, современная, которая использует PHP 5.4+, REST совместимая, объектно-ориентированная. Концепция осталась прежней, но подход изменился. Drupal 8 использует возможности объектно-ориентированного программирования(ООП) для большинства подсистем, благодаря фреймворку Symfony 3.

Как мне объявить модуль?

В Drupal 8 для объявления модуля нужен только файл YAML (.info.yml):

name: D8 Test Module
description: D8 Test Module
type: module
core: 8.x
package: Custom

В Drupal 8 файл .module больше не является обязательным, таким образом, только файл .info.yml необходим для того, чтобы можно было включить модуль.

Как мне создать страницу

Создайте контроллер, который наследуется/расширяет ControllerBase класс и возвращает вывод страницы:
/modules/d8_example_module/src/Controller/D8ExampleModuleController.php

<?php
namespace Drupal\d8_example_module\Controller;

use 

Drupal\Core\Controller\ControllerBase;

class 

D8ExampleModuleController extends ControllerBase {

  public function 

test_page($from, $to) {
    $message = $this->t('%from to %to', [
      '%from' => $from,
      '%to' => $to,
    ]);

    return [

'#markup' => $message];
  }
}
?>

После того как это сделано, совместно с файлом .routing.yml мы можем задать путь, контроллер, заголовок и права доступа:

/modules/d8_example_module/d8_example_module.routing.yml

d8_example_module.test_page:
  path: '/test-page/{from}/{to}'
  defaults:
    _controller: 'Drupal\d8_example_module\Controller\D8ExampleModuleController::test_page'
    _title: 'Test Page!'
  requirements:
    _permission: 'access content' Как мне сделать контент темизируемым?

У нас до сих пор доступна функция hook_theme():

/modules/d8_example_module/d8_example_module.module

<?php
/**
 * Implements hook_theme().
 */
function d8_example_module_theme() {
  $theme['d8_example_module_page_theme'] = [
    'variables' => ['from' => NULL, 'to' => NULL],
    'template' => 'd8-theme-page',
  ];

  return 

$theme;
}
?>

Для темизации Drupal 8 использует Twig - система шаблонизации используемая в основном проектами на PHP. Для того, чтобы узнать больше про Twig ознакомьтесь с Twig in Drupal 8. Одной из полезных особенностей Twig является подсистема перевода строк:

/modules/d8_example_module/template/d8-theme-page.html.twig

<section>
  {% trans %}
    <strong>{{ from }}</strong> to <em>{{ to }}</em>
  {% endtrans %}
</section>

А потом связываем тему оформления со страницей:

/modules/d8_example_module/src/Controller/D8ExampleModuleController.php

<?php
namespace Drupal\d8_example_module\Controller;

use 

Drupal\Core\Controller\ControllerBase;

class 

D8ExampleModuleController extends ControllerBase {

  public function 

test_page($from, $to) {
    return [
      '#theme' => 'd8_example_module_page_theme',
      '#from' => $from,
      '#to' => $to,
    ];
  }
}
?> Как мне объявить переменную?

В Drupal 8 есть полностью новая система поддержки конфигураций, которая сохраняет конфигурации в YAML (.yml) файлах. Для дополнительной информации смотрите Managing configuration in Drupal 8.

Мы зададим переменные в config/install/*.settings.yml:

/modules/d8_example_module/config/install/d8_example_module.settings.yml

default_count: 3

Переменные будут сохранены в базе данных во время инсталляции модуля. Мы задаем схему для переменных в config/schema/*.settings.yml:

/modules/d8_example_module/config/schema/d8_example_module.settings.yml

d8_example_module.settings:
  type: mapping
  label: 'D8 Example Module settings'
  mapping:
    default_count:
      type: integer
      label: 'Default count' Как мне создать форму?

Для создания формы мы расширим базовый класс ConfigFormBase:

/modules/d8_example_module/src/Form/TestForm.php

<?php
namespace Drupal\d8_example_module\Form;

use 

Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

class 

TestForm extends ConfigFormBase {
  public function getFormId() {
    return 'test_form';
  }

  public function 

buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('d8_example_module.settings');

    

$form['default_count'] = [
      '#type' => 'number',
      '#title' => $this->t('Default count'),
      '#default_value' => $config->get('default_count'),
    ];
    return parent::buildForm($form, $form_state);
  }

  public function 

submitForm(array &$form, FormStateInterface $form_state) {
    $config = $this->config('d8_example_module.settings');
    $config->set('default_count', $form_state->getValue('default_count'));
    $config->save();
    parent::submitForm($form, $form_state);
  }
}
?>

Далее, используя файл .routing.yml мы можем задать путь, форму, заголовок и права доступа:

/modules/d8_example_module/d8_example_module.routing.yml

d8_example_module.test_form:
  path: /admin/config/system/test-form
  defaults:
    _form: 'Drupal\d8_example_module\Form\TestForm'
    _title: 'Test Form'
  requirements:
    _permission: 'configure_form'

Мы будем использовать друго YAML файл (.permissions.yml) для объявления прав доступа:

/modules/d8_example_module/d8_example_module.permissions.yml

'configure_form':
  title: 'Access to Test Form'
  description: 'Set the Default Count variable'

Также, мы используем еще один YAML файл (.links.menu.yml) для того, чтобы задать ссылки меню:

/modules/d8_example_module/d8_example_module.links.menu.yml

d8_example_module.test_form:
  title: 'Test Form'
  description: 'Set the Default Count variable'
  route_name: d8_example_module.test_form
  parent: system.admin_config_system Как мне создать блок?

Для создания блока мы расширим класс ConfigFormBase:

/modules/d8_example_module/src/Plugin/Block/TestBlock.php

<?php
namespace Drupal\d8_example_module\Plugin\Block;

use 

Drupal\Core\Block\BlockBase;

/**
 * Test Block.
 *
 * @Block(
 *   id = "test_block",
 *   admin_label = @Translation("Test Block"),
 *   category = @Translation("System")
 * )
 */
class TestBlock extends BlockBase {

  public function 

build() {
    return [
      '#markup' => $this->t('Block content...'),
    ];
  }
}
?>

После этого блок будет доступен для изменения конфигурации в CMS(/admin/structure/block). Далее следует пример более сложного блока:

<?php
namespace Drupal\d8_example_module\Plugin\Block;

use 

Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Test Block.
 *
 * @Block(
 *   id = "test_block",
 *   admin_label = @Translation("Test Block"),
 *   category = @Translation("System")
 * )
 */
class TestBlock extends BlockBase {

  public function 

defaultConfiguration() {
    return ['enabled' => 1];
  }

  public function 

blockForm($form, FormStateInterface $form_state) {
    $form['enabled'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Configuration enabled'),
      '#default_value' => $this->configuration['enabled'],
    ];

    return 

$form;
  }

  public function 

blockSubmit($form, FormStateInterface $form_state) {
    $this->configuration['enabled'] = (bool)$form_state->getValue('enabled');
  }

  public function 

build() {
    if ($this->configuration['enabled']) {
      $message = $this->t('Configuration enabled');
    }
    else {
      $message = $this->t('Configuration disabled');
    }
    return [
      '#markup' => $message,
    ];
  }
}
?> Структура модуля

Структура модуля должна выглядеть как в примере d8_example_module:

d8_example_module/
 |
 |- config/
   |
   |- install/
     |
     |- d8_example_module.setting.yaml
     |
     |- schema/
       |
       |- d8_example_module.settings.yaml
 |
 |- src/
   |
   |- Controller/
     |
     |- D8ExampleModuleController.php
   |
   |- Form/
     |
     |- TestForm.php
   |
   |- Plugin/
     |
     |- Block/
       |
       |- TestBlock.php
 |
 |- templates/
   |
   |- d8-theme-page.html.twig
 |
 |- d8_example_module.info.yml
 |
 |- d8_example_module.links.menu.yml
 |
 |- d8_example_module.module
 |
 |- d8_example_module.permissions.yml
 |
 |- d8_example_module.routing.yml Материалы Ключевые слова: drupal 8 Тип материала: Предлагаю решение Версия Drupal: Drupal 8.* Drupal 7.* Форумы: Программирование 4 Thanks
Категории: Друпалургия

Drupal 8 в 2 шага

Drupal в рунете - вт, 24/10/2017 - 21:59

Drupal 8 - это последняя стабильная версия Drupal, современная, которая использует PHP 5.4+, REST совместимая, объектно-ориентированная. Концепция осталась прежней, но подход изменился. Drupal 8 использует возможности объектно-ориентированного программирования(ООП) для большинства подсистем, благодаря фреймворку Symfony 2.

Как мне объявить модуль?

В Drupal 8 для объявления модуля нужен только файл YAML (.info.yml):

name: D8 Test Module
description: D8 Test Module
type: module
core: 8.x
package: Custom

В Drupal 8 файл .module больше не является обязательным, таким образом, только файл .info.yml необходим для того, чтобы можно было включить модуль.

Как мне создать страницу

Создайте контроллер, который наследуется/расширяет ControllerBase класс и возвращает вывод страницы:
/modules/d8_example_module/src/Controller/D8ExampleModuleController.php

<?php
namespace Drupal\d8_example_module\Controller;

use Drupal\Core\Controller\ControllerBase;

class D8ExampleModuleController extends ControllerBase {

  public function test_page($from, $to) {
    $message = $this->t('%from to %to', [
      '%from' => $from,
      '%to' => $to,
    ]);

    return ['#markup' => $message];
  }
}
?>

После того как это сделано, совместно с файлом .routing.yml мы можем задать путь, контроллер, заголовок и права доступа:

/modules/d8_example_module/d8_example_module.routing.yml

d8_example_module.test_page:
  path: '/test-page/{from}/{to}'
  defaults:
    _controller: 'Drupal\d8_example_module\Controller\D8ExampleModuleController::test_page'
    _title: 'Test Page!'
  requirements:
    _permission: 'access content' Как мне сделать контент темизируемым?

У нас до сих пор доступна функция hook_theme():

/modules/d8_example_module/d8_example_module.module

<?php
/**
 * Implements hook_theme().
 */
function d8_example_module_theme() {
  $theme['d8_example_module_page_theme'] = [
    'variables' => ['from' => NULL, 'to' => NULL],
    'template' => 'd8-theme-page',
  ];

  return $theme;
}
?>

Для темизации Drupal 8 использует Twig - система шаблонизации используемая в основном проектами на PHP. Для того, чтобы узнать больше про Twig ознакомьтесь с Twig in Drupal 8. Одной из полезных особенностей Twig является подсистема перевода строк:

/modules/d8_example_module/template/d8-theme-page.html.twig

<section>
  {% trans %}
    <strong>{{ from }}</strong> to <em>{{ to }}</em>
  {% endtrans %}
</section>

А потом связываем тему оформления со страницей:

/modules/d8_example_module/src/Controller/D8ExampleModuleController.php

<?php
namespace Drupal\d8_example_module\Controller;

use Drupal\Core\Controller\ControllerBase;

class D8ExampleModuleController extends ControllerBase {

  public function test_page($from, $to) {
    return [
      '#theme' => 'd8_example_module_page_theme',
      '#from' => $from,
      '#to' => $to,
    ];
  }
}
?> Как мне объявить переменную?

В Drupal 8 есть полностью новая система поддержки конфигураций, которая сохраняет конфигурации в YAML (.yml) файлах. Для дополнительной информации смотрите Managing configuration in Drupal 8.

Мы зададим переменные в config/install/*.settings.yml:

/modules/d8_example_module/config/install/d8_example_module.settings.yml

default_count: 3

Переменные будут сохранены в базе данных во время инсталляции модуля. Мы задаем схему для переменных в config/schema/*.settings.yml:

/modules/d8_example_module/config/schema/d8_example_module.settings.yml

d8_example_module.settings:
  type: mapping
  label: 'D8 Example Module settings'
  mapping:
    default_count:
      type: integer
      label: 'Default count' Как мне создать форму?

Для создания формы мы расширим базовый класс ConfigFormBase:

/modules/d8_example_module/src/Form/TestForm.php

<?php
namespace Drupal\d8_example_module\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

class TestForm extends ConfigFormBase {
  public function getFormId() {
    return 'test_form';
  }

  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('d8_example_module.settings');

    $form['default_count'] = [
      '#type' => 'number',
      '#title' => $this->t('Default count'),
      '#default_value' => $config->get('default_count'),
    ];
    return parent::buildForm($form, $form_state);
  }

  public function submitForm(array &$form, FormStateInterface $form_state) {
    $config = $this->config('d8_example_module.settings');
    $config->set('default_count', $form_state->getValue('default_count'));
    $config->save();
    parent::submitForm($form, $form_state);
  }
}
?>

Далее, используя файл .routing.yml мы можем задать путь, форму, заголовок и права доступа:

/modules/d8_example_module/d8_example_module.routing.yml

d8_example_module.test_form:
  path: /admin/config/system/test-form
  defaults:
    _form: 'Drupal\d8_example_module\Form\TestForm'
    _title: 'Test Form'
  requirements:
    _permission: 'configure_form'

Мы будем использовать друго YAML файл (.permissions.yml) для объявления прав доступа:

/modules/d8_example_module/d8_example_module.permissions.yml

'configure_form':
  title: 'Access to Test Form'
  description: 'Set the Default Count variable'

Также, мы используем еще один YAML файл (.links.menu.yml) для того, чтобы задать ссылки меню:

/modules/d8_example_module/d8_example_module.links.menu.yml

d8_example_module.test_form:
  title: 'Test Form'
  description: 'Set the Default Count variable'
  route_name: d8_example_module.test_form
  parent: system.admin_config_system Как мне создать блок?

Для создания блока мы расширим класс ConfigFormBase:

/modules/d8_example_module/src/Plugin/Block/TestBlock.php

<?php
namespace Drupal\d8_example_module\Plugin\Block;

use Drupal\Core\Block\BlockBase;

/**
 * Test Block.
 *
 * @Block(
 *   id = "test_block",
 *   admin_label = @Translation("Test Block"),
 *   category = @Translation("System")
 * )
 */
class TestBlock extends BlockBase {

  public function build() {
    return [
      '#markup' => $this->t('Block content...'),
    ];
  }
}
?>

После этого блок будет доступен для изменения конфигурации в CMS(/admin/structure/block). Далее следует пример более сложного блока:

<?php
namespace Drupal\d8_example_module\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Test Block.
 *
 * @Block(
 *   id = "test_block",
 *   admin_label = @Translation("Test Block"),
 *   category = @Translation("System")
 * )
 */
class TestBlock extends BlockBase {

  public function defaultConfiguration() {
    return ['enabled' => 1];
  }

  public function blockForm($form, FormStateInterface $form_state) {
    $form['enabled'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Configuration enabled'),
      '#default_value' => $this->configuration['enabled'],
    ];

    return $form;
  }

  public function blockSubmit($form, FormStateInterface $form_state) {
    $this->configuration['enabled'] = (bool)$form_state->getValue('enabled');
  }

  public function build() {
    if ($this->configuration['enabled']) {
      $message = $this->t('Configuration enabled');
    }
    else {
      $message = $this->t('Configuration disabled');
    }
    return [
      '#markup' => $message,
    ];
  }
}
?> Структура модуля

Структура модуля должна выглядеть как в примере d8_example_module:

d8_example_module/
 |
 |- config/
   |
   |- install/
     |
     |- d8_example_module.setting.yaml
     |
     |- schema/
       |
       |- d8_example_module.settings.yaml
 |
 |- src/
   |
   |- Controller/
     |
     |- D8ExampleModuleController.php
   |
   |- Form/
     |
     |- TestForm.php
   |
   |- Plugin/
     |
     |- Block/
       |
       |- TestBlock.php
 |
 |- templates/
   |
   |- d8-theme-page.html.twig
 |
 |- d8_example_module.info.yml
 |
 |- d8_example_module.links.menu.yml
 |
 |- d8_example_module.module
 |
 |- d8_example_module.permissions.yml
 |
 |- d8_example_module.routing.yml Материалы Ключевые слова: drupal 8 Тип материала: Предлагаю решение Версия Drupal: Drupal 8.* Drupal 7.* Форумы: Программирование 2 Спасибо
Категории: Друпалургия

Drupal-школа - двенадцатое занятие: продвижение сайта на Drupal

Drupal в рунете - вс, 15/10/2017 - 20:28

Разбираем основы продвижения сайтов, в частности сайта на Drupal 8.

Версия Drupal: Drupal 8.* Форумы: DrupalSib 2 Thanks
Категории: Друпалургия

Drupal-школа - двенадцатое занятие: продвижение сайта на Drupal

Drupal в рунете - вс, 15/10/2017 - 20:28

Разбираем основы продвижения сайтов, в частности сайта на Drupal 8.

Тип материала: Есть вопрос Версия Drupal: Drupal 8.* Форумы: DrupalSib 0 Спасибо
Категории: Друпалургия

Обновление Drupal (новая версия Drupal 8.4.0)

Drupal в рунете - вс, 08/10/2017 - 02:16

Оригинал (опубликован Gábor Hojtsy 4 октября 2017 года): Drupal 8.4.0 is now available

Что нового в Drupal 8.4.0?

Новая версия является важной вехой стабильности для Drupal 8. Она добавляет неявные улучшения, для обеспечения стабильных выпусков контриб модулей для макетов, мультимедиа и календаря. Многие другие экспериментальные модули включенные в ядро, также стали стабильными в этом выпуске, включая модули для строчного отображения ошибок формы и управления рабочими процессами.

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

Загрузить Drupal 8.4.0

Важная информация: Если вы используете Drush для управления Drupal, обязательно обновите Drush до версии 8.1.12 или выше перед обновлением Drupal. Обновление до Drupal 8.4.0 с помощью Drush 8.1.11 или более ранней версии завершится с ошибками. (Всегда тщательно проверяйте минорные версии обновлений до применения на рабочей версии сайта.)

Inline Form Errors

Модуль Inline Form Errors предоставляет сводку любых ошибок проверки в верхней части формы и помещает отдельные сообщения об ошибках рядом с самими элементами формы. Это помогает пользователям понять, какие записи нужно исправлять, и как это сделать. Inline Form Errors был представлен в качестве экспериментального модуля в Drupal 8.0.0, но теперь он стабилен и достаточно отшлифован для использования.

Datetime Range

Модуль Datetime Range предоставляет тип поля, который позволяет конечным датам поддерживать дополнительные модули, такие как Calendar. Этот стабильный выпуск обратно совместим с экспериментальной версией Drupal 8.3.x и использует целостный API с другими полями Datetime. Будущие выпуски могут улучшить поддержку Views, юзабилити, проверку поля Datetime Range и поддержку REST.

Layout Discovery API

Модуль Layout Discovery предоставляет API для модулей или тем для регистрации макетов, а также пять общих макетов. Предоставление этого API в ядре позволяет быть совместимыми друг с другом модулям работы с макетами в ядре и сторонним модулям, таким как Panels и Display Suite. Этот стабильный выпуск обратно совместим с экспериментальной версией 8.3.x и вводит поддержку атрибутов для отдельных регионов.

Media API

Новый модуль ядра Media предоставляет API для многократного использования сущностей медиаданных и ссылок. Он основан на контриб модуле Media Entity.

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

Обратите внимание, что модуль Media в ядре помечен скрытым и не виден на странице «Расширения» (модуль администрирования). (Включение модуля, который зависит от основного модуля Media, автоматически включит Media.) Модуль будет отображаться для разработчиков сайтов, когда проблемы связанные с пользовательским опытом будут устранены в будущей версии.

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

Улучшения в управлении контентом и администрировании сайта

Выпадающая кнопка «Сохранить и опубликовать / Сохранить неопубликованным» была заменена на чекбокс «Опубликовано» и отдельную кнопку «Сохранить». Выпадающая кнопка «Сохранить ...» была частью нового дизайна в Drupal 8, но пользователи сочли его запутанным, поэтому мы восстановили дизайн, который больше похож на интерфейс пользователя для Drupal 7 и более ранних версий.

Страницы администрирования «Комментарии» на «/admin/content/comment» и отчет «Последние записи журнала», формируемый dblog теперь являются настраиваемыми представлениями. Это позволяет разработчикам сайтов легко настраивать, заменять или клонировать данные представления.

Обновленные миграции

Этот релиз добавляет поддержку дат и связанных нод для миграций с Drupal 6 на Drupal 8. Ядро предоставляет миграции для большинства данных в Drupal 6 и может использоваться для переноса сайтов с Drupal 6 на Drupal 8, миграции Drupal 6-8 находятся в состоянии близком к бета стабильности. Остаются некоторые пробелы, в частности, некоторые данные интернационализации. Миграция с Drupal 7 на Drupal 8 является неполной, но подходит для разработчиков, которые хотели бы помочь улучшить миграции и может использоваться для тестирования обновления простых сайтов на Drupal 7. Наиболее важные миграции доступны.

Модерация и рабочие процессы

Модуль Workflows теперь также стабильный, однако он представляет только фреймворк для управления рабочими процессами и не является полезным непосредственно. Экспериментальный модуль Content Moderation позволяет применить рабочие процессы к контенту и в настоящее время находится в состоянии бета стабильности. Рабочие процессы управления контентом теперь можно применять к любому типу сущностей, которые поддерживают ревизии, также многочисленные проблемы и критические ошибки исправлены в этом выпуске.

Возможности платформы для веб-сервисов

Drupal 8.4 продолжает расширять в Drupal поддержку веб-сервисов, ориентированных для автономных сайтов и приложений, включая 15% повышение производительности для аутентифицированных REST запросов, расширенную REST функциональность и улучшения для разработчиков.

Более подробная информация о каждом разделе изложена в заметках к релизу 8.4.0.

Что это означает для меня? Владельцы сайтов на Drupal 8

Обновите Drupal до версии 8.4.0, чтобы продолжать получать исправления ошибок и безопасности. Следующий bugfix релиз (8.4.1) запланирован на 1 ноября 2017 года.

Обновление вашего сайта с 8.3.7 до 8.4.0 через update.php точно такое же, как и обновление с 8.3.6 до 8.3.7. Если вы используете Drush, обязательно обновите Drush до версии 8.1.12 или выше перед тем как использовать его для обновления Drupal с версии 8.3.7 до 8.4.0. Drupal 8.4.0 также включает мажорные обновления для нескольких зависимостей, включая Symfony, jQuery и jQuery UI. Модулям, темам и переводам может понадобиться обновление для этих и прочих изменений в данной минорной версии, поэтому, перед обновлением рабочего сайта тщательно протестируйте обновление.

Владельцы сайтов на Drupal 7

Drupal 7 все еще полностью поддерживается и будет продолжать получать исправления ошибок и безопасности на протяжении всех минорных релизов Drupal 8.

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

Владельцы сайтов на Drupal 6

Drupal 6 больше не поддерживается. Создайте сайт на Drupal 8 и попытайтесь перенести данные в него как можно скорее. Ваш сайт Drupal 6 может по-прежнему работать во время тестирования переноса данных с Drupal 6 в ваш новый сайт на Drupal 8. Ядро теперь предоставляет миграции для большинства данных Drupal 6, но, в частности, миграции многоязычных функций не являются завершенными. Если вы нашли не описанную в известных проблемах ошибку в экспериментальном наборе модулей миграции, ваш подробный отчёт с шагами для воспроизведения будет большой помощью!

Контрибьюторы переводов, модулей и тем оформления

Минорные релизы, такие как Drupal 8.4.0, включают обратно совместимые дополнения API для разработчиков, а также новые функции. Читайте заметки о выпуске 8.4.0 для получения более подробной информации об усовершенствованиях для разработчиков в этом выпуске.

Так как минорные релизы обратно совместимы, модули, темы и переводы, которые поддерживали Drupal 8.3.x и ранее, будут также совместимы с 8.4.x. Однако новая версия включают в себя некоторые изменения в строках, пользовательском интерфейсе и внутренних API (а также более значительные изменения в экспериментальных модулях). Это означает, что могут потребоваться небольшие обновления для ваших переводов, модулей и тем оформления. Смотрите объявление о релиз-кандидате 8.4.0 для получения дополнительной справочной информации.

Ключевые слова: release Версия Drupal: Drupal 8.* Форумы: Безопасность 8 Thanks
Категории: Друпалургия

Страницы

Подписка на Друпалургия сбор новостей - Друпалургия