Друпалургия

CSS: Компиляция SASS/SCSS в PhpStorm с помощью Dart Sass

С недавних пор Dart Sass стал основным компилятором SASS/SCSS файлов, а остальные реализации, вроде популярного libsass, стали deprecated и новые фичи в них под вопросом. Поэтому самое время переходить на Dart.

Процесс интеграции PhpStorm с Dart Sass:

1. Либо скачиваем бинарник компилятора с гитхаба (есть как под Linux, так и под Windows), либо ставим его с помощью nmp:

npm install -g sass

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

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

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

Drupal: Необязательное значение одной из дат в раскрытом фильтре по дате с оператором BETWEEN

По умолчанию, если в раскрытом фильтре по дате с оператором between оставить одно из значений пустым, то фильтр просто игнорируется. Виноват в таком поведении метод \Drupal\views\Plugin\views\filter\Date::acceptExposedInput, который возвращает FALSE если хоть одно значение пустое.

Один из способов решить эту проблему:

// src/Plugin/views/filter/DateOptionalFilter.php   namespace Drupal\MODULENAME\Plugin\views\filter;   use Drupal\views\Plugin\views\filter\Date;   class DateOptionalFilter extends Date {   /** * {@inheritDoc} */

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

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

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

Drupal: Добавляем на страницу управления отображением материала поле "Заголовок"

// MODULENAME.module   /** * Implements hook_entity_base_field_info_alter(). */ function MODULENAME_entity_base_field_info_alter(array &$fields, EntityTypeInterface $entity_type): void { if ($entity_type->id() == 'node') { $fields['title']->setDisplayConfigurable('view', TRUE); } }   /** * Implements hook_entity_type_build(). */ function MODULENAME_entity_type_build(array &$entity_types): void { // See https://www.drupal.org/node/3043840 $entity_types['node']->set('enable_base_field_custom_preprocess_skipping', TRUE); }

Результат:

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

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

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

Drupal Global Contribution Weekend 2021Q1

Drupal в рунете - ср, 27/01/2021 - 16:35

Привет!

На этих выходных организуем Drupal Global Contribution Weekend.

В течение трех дней — с 19:00 пятницы (29 января) до 20:00 воскресенья (31 января) предлагаю присоединиться к участию в решении нескольких вопросов:

1. Судьба Drui.io

Шесть лет назад dru.io создавался как попытка оживить и встряхнуть русскоязычное Drupal-сообщество во времена, когда drupal.ru был заброшен. Время шло, сейчас у сообщества есть возможность заниматься drupal.ru и есть те, кто этим занимается. Сейчас заброшенным становится уже drui.io.

Обсудим что делать с dru.io, так как просто взять и отключить сервер — значит потерять знания, накопленные на сайте за 6 лет.

2. Маркетинговые материалы для продвижения Drupal в России и СНГ

У меня есть частично завершенная презентация о Drupal на русском языке, и на выходных я планирую её доделать. Презентацию делаю в Figmа. В пятницу вечером опубликую ссылку на документ. Буду рад, если подключитесь и оставите комментарии к презентации или поработаете со мной вместе. Для комментариев и совместной работы в Figma вам потребуется зарегистрироваться в figma.com (это бесплатно).

Еще у нашего сообщества есть специальный промо-сайт о Drupal — why.drupal.ru, созданный несколько лет назад, дизайн и разработку которого спонсировала инициативная группа. На выходных обсудим, что стоит улучшить на этом промо-сайте.

3. Планы на будущее и прочие вопросы

В свободной форме обсудим текущее состояние и развитие Drupal в Рунете, нашего сообщества и drupal.ru.

В пятницу дополню пост о том, что будет использоваться для онлайн-общения и будет ли стрим в Youtube.

  • Есть вопрос
  • Сайт и проект Drupal.ru
  • Категории: Друпалургия

    Drupal: Плагин блока, генерящий контент с помощью #lazy_builder

    Пример плагина блока, выводящий текущее время. Блок будет закэширован один раз, но контент при этом будет всегда актуальный (за исключением случая, когда включён модуль Internal Page Cache и страницу открыл аноним).

    // src/Plugin/Block/CurrentDateBlock.php   namespace Drupal\mymodule\Plugin\Block;   use Drupal\Core\Block\BlockBase; use Drupal\Core\Security\TrustedCallbackInterface;   /** * @Block( * id = "current_date", * admin_label = @Translation("Current date"), * category = @Translation("Custom"), * ) */

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

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

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

    Модуль Russian currencies rates для Drupal 8/9

    Drupal в рунете - чт, 14/01/2021 - 15:09

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

    Модуль Russian currencies rates предназначен для получения курса валют (на данный момент американский доллар и евро) по отношению к русскому рублю.

    Возможности:

    • С помощью drush-команды "drush rcr-getrates" получать курсы валют с сайта ЦБР и записывать их в конфиг модуля
    • Модуль имеет готовый блок для вывода курса валют
    • Можно в вашем кастомном модуле получить курсы валют из конфигов и использовать их где и как угодно
    • Модуль не зависит от commerce, его можно использовать и на сайтах, которые не являются магазинами

    Поддержки веб-крона пока нет, только drush-команда для запуска кроном сервера.

  • Drupal9
  • Drupal8
  • Предлагаю решение
  • Выставка модулей
  • Категории: Друпалургия

    Drupal: AJAX команда для сброса значений полей формы

    // src/Ajax/FormResetCommand.php   namespace Drupal\modulename\Ajax;   use Drupal\Core\Ajax\CommandInterface;   class FormResetCommand implements CommandInterface {   protected string $form_selector;   public function __construct(string $form_selector) { $this->form_selector = $form_selector; }   public function render(): array { return [ 'command' => 'invoke', 'selector' => $this->form_selector, 'method' => 'trigger', 'args' => ['reset'], ]; }   }

    Использование:

    $response = new AjaxResponse();

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

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

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

    Миграция метатегов из Drupal 7 в Drupal 8/9

    Drupal в рунете - чт, 07/01/2021 - 17:49

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

    1. Используем для экспорта метатегов модуль metatag_import_export_csv. Он позволяет делать экспорт как одного типи материала, так и сразу всех. Есть GUI и drush-команда. В каталоге files будет создан каталог metatag_import_export_csv и в нём будут файлы экспорта.

    2. Затем нужно отредактировать файл как вам нужно. В моём случае понадобилось только 3 поля, nid, description и keywords.

    3. Для импорта используем модуль feeds. На момент написания этой заметки нужно было использовать dev-версию, потому что вот этот коммит еще не попал в релиз, а он нужен нам, чтобы указывать в какие nid загружать метатеги.

    4. Для модуля metatag понадобится патч из этого issue для интеграции с feeds.

    5. Создаём в feeds потоки данных для импорта и импортируем данные из нашего файлы экспорта. Этот процесс я не буду расписывать, он тянет на отдельную статью.

  • Drupal9
  • Drupal8
  • Drupal7
  • Разработчикам Автор ivnish Drupal FullStack Developer
    Категории: Друпалургия

    Миграция метатегов из модуля metatags_quick в модуль metatag (Drupal 7)

    Drupal в рунете - ср, 06/01/2021 - 15:30

    Задача: миграция метатегов из модуля metatags_quick в модуль metatag

    У модуля metatag для Drupal 7 есть субмодуль metatag import, однако я не увидел в нем кнопку для миграции метатегов из модуля metatags_quick. Есть только кнопки для миграции из модулей nodewords и page_title. Поиск в гугле привёл меня в этот коммит, где и обнаружилась уже добавленная в модуль metatag drush-команда для миграции метатегов из модуля metatags_quick в модуль metatag.

    Запускаем команду drush mtcmq и она перенесёт метатеги. После этого можно удалить поля модуля metatags_quick из типа материала и запустить крон для их полного удаления.

  • Drupal7
  • Разработчикам Автор ivnish Drupal FullStack Developer
    Категории: Друпалургия

    Модуль Poll для Drupal 8/9 - фейковые голоса

    Drupal в рунете - пт, 18/12/2020 - 19:50

    Кто работал с муниципальными/государственными заказчиками знает, что опросы проводимые на сайтах в большинстве своём "липовые". Если окажется, что население недовольно оказываемыми услугами учреждения, то тут же в дело вмешается прокуратура. Поэтому отчеты типа "Удовлетворены ли вы работой учреждения" имеют результаты сопоставимые с рейтингами тоталитарных лидеров (> 80%)

    Выяснилось, что модуль опросов poll для Drupal 8/9 такой важной функциональности не имеет. Предложенный на drupal.org патч сначала работал, потом при добавлении фейковых голосов стала вываливаться ошибка БД и опрос перестал сохраняться.

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

    • Добавляет "fake_votes" поле в таблицу "poll_choice"
    • Добавляет "fake_votes" поле в форму редактирования опроса
    • Вы пишете сколько голосов нужно добавить к настоящим и это число сохраняется в БД при сохранении опроса
    • При выводе результатов к реальным голосам плюсуются фейковые

    Патч применяется к последней стабильной версии модуля poll 1.4

    Ссылка на issue https://www.drupal.org/project/poll/issues/3035898
    Прямая ссылка на патч https://www.drupal.org/files/issues/2020-12-18/poll-3035898-8.patch

  • Drupal9
  • Drupal8
  • Веб-мастерам и владельцам сайтов Автор ivnish Drupal FullStack Developer в компании Abventor
    Категории: Друпалургия

    Новый модуль для форматирования изображений (image effect).

    Drupal в рунете - вс, 06/12/2020 - 06:14

    Примерно полгода назад, столкнувшись с невозможностью выполнить несложные требования по форматированию изображений с помощью имеющихся преобразований (image effects), я написал модуль Ratio Crop, который реализует следующее преобразование: картинка обрезается по "выступающей" стороне таким образом, чтобы соотношение сторон соответствовало заданному. Другая сторона остаётся неизменной.

    Откуда возникла потребность: допустим, мы хотим показывать на странице с жёсткой разбивкой картинки (для наглядности, одну картинку), которую можем разглядывать как бы в увеличительное стекло. Для такого "увеличительного стекла" существует полно скриптов, вот, например: JQuery Zoom. Такой скрипт загружает на страницу исходную картинку, при отображении страницы масштабирует её под размер контейнера, а при наведении курсора (или другом действии пользователя) отображает картинку в исходном разрешении в рамках того же контейнера, передвигая её в ответ на движения курсора.
    Скриншоты зума в действии:
    Картинка на странице масштабирована под размер контейнера

    При наведении курсора картинка отображается в полный размер, но не выходит за пределы контейнера

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

    Для наглядности возьмём две картинки немного разного размера и отношения сторон:
    Первая - 769x424px, отношение сторон 1.8

    750x500, отношение сторон 1.5

    Приведём их к формату 4:3
    Получились размеры 565х424 и 667х500

    Размеры разные, но отношение сторон одинаково.

    Как ни странно, добиться такого результата имеющимися преобразованиями (Crop, Resize, Scale, Scale & Crop) не получилось. Crop обрезает, а Resize сжимает под фиксированный размер, нам это сразу не подходит. Scale сохраняет исходное отношение сторон, это как раз, что нам не надо. Ближе всего к желаемому эффекту Scale and Crop, но оно тоже подгоняет под фиксированный размер.

    К счастью, в 8м Друпале выход всегда есть - написать свой плагин (как легко догадаться, преобразования изображений - это именно плагины). Примеры в ядре достаточно наглядны и показательны, поэтому в реализации особых проблем не возникло, заняло это дело несколько часов. Следует отметить, что плагинов на самом деле не один, а два: один (ImageEffect) предоставляет весь интерфейс, производит первичную обработку входных данных и вызывает непосредственно обработчик изображения, то есть второй плагин (ImageToolkitOperation). Второй плагин должен быть реализован для каждой графической библиотеки отдельно, у меня, как и большинства, я думаю, GD, поэтому я сделал только для GD. Писать тесты тоже поленился, хотя они бы пригодились - редкий случай, когда предельно ясно, что и как тестировать.

    Интерфейс преобразования простой и интуитивно понятный:

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

    На данный момент drupal.org считает, что модуль установлен на 55 сайтах.

    Пользуйтесь на здоровье, предлагайте усовершенствования, делитесь сценариями использования. Всегда рад обратной связи.

  • Drupal9
  • Drupal8
  • Предлагаю решение
  • Выставка модулей
  • Категории: Друпалургия

    Как ускорить миграцию файлов с Drupal 7 на Drupal 8/9, если у вас уже есть архив с файлами

    Drupal в рунете - сб, 05/12/2020 - 14:56

    Этот материал будет Вам полезен, если совпали следующие условия:

    1. Файлов очень много и их объем занимает десятки гигабайт
    2. Канал передачи файлов имеет низкую скорость
    3. У вас уже есть архив с файлами старого сайта
    4. Новый сайт в докере и вам лень создавать для файлов дополнительные контейнеры или монтировать их внутрь имеющихся контейнеров

    Всё что нужно сделать, это положить файлы в корень проекта вот так

    После чего при миграции указать путь /var/www

    Теперь мигратор будет брать локальные файлы и копировать их в web/sites/default/files с большой скоростью

    После окончания миграции файлы из корня проекта можно удалить

  • Drupal9
  • Drupal8
  • Drupal7
  • Разработчикам Автор ivnish Drupal FullStack Developer в компании Abventor
    Категории: Друпалургия

    Быстрая миграция Webform с Drupal 7 на Drupal 8/9

    Drupal в рунете - ср, 02/12/2020 - 12:52

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

    В поисках информации я наткнулся на репозиторий https://github.com/JAyenGreen/webform_d7_to_d8

    Это модуль для Drupal 8. Я кинул его в /modules/custom и включил на сайте. Далее по шагам:

    1) Прописываем в settings.php или в settings.local.php ваши данные для базы старого сайта, например

    $databases['upgrade']['default'] = array (
    'database' => 'drupal7database',
    'username' => 'drupal7user',
    'password' => 'drupal7password',
    'prefix' => '',
    'host' => 'drupal7host',
    'port' => '3306',
    'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
    'driver' => 'mysql',
    );

    2) Смотрим NID вашей вебформы на старом сайте, у меня это 3114

    3) Запускаем миграцию в режиме симуляции

    drush ev 'webform_d7_to_d8(["nid" => 3114, "simulate" => TRUE])'

    У меня вывалилась куча ошибок связанная с миграцией отправлений "submissions". Они мне не нужны на новом сайте, поэтому исключаем их из миграций

    drush ev 'webform_d7_to_d8(["nid" => 3114, "max_submissions" => 0])'

    4) Готово! На новом сайте появилась новая вебформа

    Поделитесь своим опытом миграций в комментариях

  • Drupal9
  • Drupal8
  • Drupal7
  • Разработчикам Автор ivnish Drupal FullStack Developer в компании Abventor
    Категории: Друпалургия

    Галлерея Isotope в drupal 9

    Drupal в рунете - ср, 02/12/2020 - 02:18
    Вступление

    данная инструкция создана по горячим следам работы с реальным проектом. Отдельная благодарность Ивану Абраменко и его уроку Галерея Isotope для Drupal 8. Инструкция делалась для себя, чтобы потом не тратить лишнее время на воспроизводство, т. к. довольно редкий кейс. Инструкция предполагает определенный уровень знаний особенностей работы с Drupal.

    Задачи
    • создать галерею изображений на базе media
    • изображения должны создаваться в одном материале (одно окно)
    • изображения должны иметь привязку к нескольким категориям
    • максимально обойтись возможностями админки drupal
    • тема css не рассматривается

    Пример того, что должно получиться на выходе

    Процесс 1. Необходимые модули и js-скрипты

    Не будем рассматривать процесс установки модулей и их библиотек. Все стандартно. Исключение — photoswipe (на его страничке все подробно описано) и сам isotope (о нем подробнее ниже).

    - media — входит в ядро

    - paragraphs:

    - photoswipe (модуль и его библиотека):

    Библиотека после установки (через composer), должна появиться в папке libraries:

    Проверяем статус библиотеки photoswipe в системе — /admin/reports/status

    - isotope:

    1.1. файл isotope.pkgd.min.js размещаем в папке js вашей темы. Там же создаем файл инициализации — isotope_init.js

    1.2. прописываем isotope в библиотеках темы — у меня это файл mytheme.libraries.yml

    isotope_lib:
      js:
        js/isotope.pkgd.min.js: {}
        js/isotope_init.js: {}

    подключать саму библиотеку в дальнейшем будем в twig того блока, где она должна работать.

    2. Настройки и создание необходимых справочников и материалов

    2.1. Создаем справочник Категорий (/admin/structure/taxonomy/add) — у меня его машинное имя categories. Заполняем его терминами.

    2.2. Создаем новый тип Медиа - /admin/structure/media/add, где прописываем необходимое поле:

    Все настройки — на ваше усмотрение.

    2.3. Создаем новый тип параграфа Photo (/admin/structure/paragraphs_type/add), где прописываем необходимые поля:

    поле категорий (field_category_img) предполагает выбор опции:

    «Допустимое количество значений» - неограниченно

    2.4. Добавляем новый тип материалов Photos (/admin/structure/types/add), где создаем поле:

    опция «Допустимое количество значений» - неограниченно.

    2.5. Переходим в content (содержимое) и создаем новый материал, тип Photos (/node/add/photos). Заполняем картинками с указанием на их категории:

    3. Создание представления по выводу картинок и его предварительная настройка

    3.1. Создаем представление по выводу картинок в виде галлереи (/admin/structure/views/add). У меня это «Лучшие Проекты» с машинным именем best_projects.

    3.2. Сохраняем и переходим на страницу работы с полями и фильтрами.

    3.3. Сначала прописываем необходимые связи. Цель — получить прямой доступ к картинке (она у нас загружена через медиа)

    3.4. Добавляем поля категорий и картинки в блоке «Поля»:

    3.5. Во время настройки поля Категории есть 3 момента:

    • выбираем Форматер — «идентификатор сущности»
    • оставляем «Настройка множественного фильтра» — по умолчанию
    • в «Перезаписать результаты» подставляем шаблон нашего поля. Цель — получить вывод в формате «cat-77» идентификаторы всех категорий, привязанных к картинке
    • исключаем из вывода данное поле

    3.6. Настройка поля картинки заключается в выборе форматера и прописывании его опций.

    3.7. Для подключения режима галереи к блоку фотографий, необходимо в настройках общего класса указать photoswipe-gallery

    3.8. На данном этапе оканчиваем настройку этого представления прописыванием в настройках раздела "Формат" в классе строки шаблон нашего поля категорий:

    Это обеспечивает вывод в html в классах картинки перечня из её категорий, что важно для работы скрипта isotope.

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

    4. Создание представления по выводу фильтров и его настройка

    4.1. Создаем представление для вывода фильтров (выбираем блок)

    4.2. Сохраняем и переходим на страницу настроек полей и фильтров.
    К полю наименование термина добавляем второе поле — его id. Сразу же исключаем его из вывода.

    4.3. Для ограничения списка терминов только теми, по которым есть привязка к фотографиям, в связях выбираем:

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

    Для устранения дублирования некоторых категорий включаем агрегацию (Расширенное-Другое):

    4.4. В завершение в настройках Формата классу сроки присваиваем класс «views-button»

    4.5. Сохраняем представление и переходим к файлу mytheme.theme для написания препроцесс-функции:

    <?php
    // projects photos block - make filters buttons
    function mytheme_preprocess_views_view_field(&$variables) {
      $view = $variables['view'];
      if ($view->id() == 'projects_filters') {
        $term = $variables['row']->{'_entity'};
        $tid = $term->id();
        $name = $variables['row']->{'_entity'}->getName();
        $variables['category'] = '. $tid . '">' . $name . '';
      }
    }
    ?>

    4.6. Создаем в папке темплейтов twig блока фильтров views-view-field—projects-filters—block-1—name.html, где:

    • подключаем нашу isotope — библиотеку
    • выводим кнопки фильтров (см. в препроцессоре переменная category )

    5. Возвращаемся к доработке представления

    «Лучшие Проекты» с машинным именем best_projects) и подключаем в шапке «Область представления» и выбираем наше представление фильтров.

    Итоговая форма представления картинок

    6. Скрипт инициализации isotope

    Прописываем следующий код:

    (function ($) {
        Drupal.behaviors.portfolioBlock = {
          attach: function (context, settings) {

            $('.view-projects-filters > .view-content').once('add-all').prepend('Все');

            // init Isotope
            var $grid = $('.view-best-projects > .view-content').isotope({
              itemSelector: '.best-projects-photo',
              layoutMode: 'fitRows'
            });

            // bind filter button click
            $('.view-projects-filters').once().on( 'click', 'button', function() {
              var filterValue = $( this ).attr('data-filter');
              $grid.isotope({ filter: filterValue });
            });

            $('.view-projects-filters .button').on('click', function () {
              var activeGallery = ($(this).data('filter')); //get the current filter
              $(".photoswipe-gallery .best-projects-photo a").each(function () {
                  $(this).removeClass('photoswipe'); //remove all photoswipe classes
              });
              $(".photoswipe-gallery .best-projects-photo" + activeGallery +" a").each(function () {
                  $(this).addClass('photoswipe');  //add photoswipe class only for active images
              });
          });
          }
        };
      })(jQuery);

    Который состоит из условных 2 частей:

    • инициализация isotope
    • устранение косяка, когда во всплывающее окно подгружались все картинки страницы, а не только те, которые отфильтровались.

    Всё.

  • Drupal9
  • Веб-мастерам и владельцам сайтов Автор crazy_boy
    Категории: Друпалургия

    Drupal: Добавляем возможность использовать токены в адресе получателя контактной формы

    Скоро будет 12 лет, как на drupal.org весит незакрытое ишью с просьбой добавить возможность использовать токены в контактных формах, но воз и ныне там. По традиции фиксим самостоятельно:

    // MODULENAME.module   /** * Implements hook_form_BASE_FORM_ID_alter(): contact_form_form. */ function MODULENAME_form_contact_form_form_alter(array &$form, FormStateInterface $form_state) { $form['recipients_new'] = [ '#type' => 'textfield', '#title' => $form['recipients']['#title'],

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

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

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

    Drupal: Программное добавление сущностей

    Контент-сущности

    Узнать список доступных полей у конкретной контент-сущности можно заглянув в её метод baseFieldDefinitions().

    Нода:
    $node = \Drupal\node\Entity\Node::create([ // Required fields 'type' => 'page', // Node type id 'title' => 'Example node', // Optional fields 'status' => \Drupal\node\NodeInterface::PUBLISHED, 'uid' => 0, 'created' => time(), 'changed' => time(), 'promote' => \Drupal\node\NodeInterface::NOT_PROMOTED, 'sticky' => \Drupal\node\NodeInterface::NOT_STICKY, // Custom fields

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

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

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

    Social Sharing: новый модуль для шеринга в соцсети

    Drupal в рунете - пн, 09/11/2020 - 11:56

    Рассказывает автор модуля Александр Левицкий, backend-разработчик студии ADCI Solutions.

    Большинство модулей для шеринга веб-страниц в социальные медиа, которые лежат на drupal.org - это друпальные блоки, в которых эти соцмедиа предопределённы заранее. И никакие другие добавить в эти модули нельзя, разве что хакнув их.

    На одном из проектов я разработал принципиально другой модуль для этих целей. Название у него - понятнее некуда: Social Sharing.

    Предыстория

    В работе широко известного сервиса для шеринга веб-страниц в соцсети AddToAny есть момент, ставший принципиальным для нашего клиента.

    Так выглядит обычный URL шеринга страницы в Twitter:
    https://twitter.com/intent/tweet?text=Hello%20world

    А вот тот же шеринг той же страницы, но выполненный через AddToAny:
    https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.addtoa...

    Мы видим, что сначала запрос проходит через AddToAny, там обрабатывается и уже потом расшаривается в Twitter. Хотя контент, который шерится, подразумевается как публичный, клиент не хотел, чтобы трафик шёл где-то ещё. Ну, потому что.

    Нужно было что-то гибкое и кастомное. MVP такого модуля я сделал для клиента, а доработанную версию, которой и является Social Sharing, выкатил на drupal.org. От модуля, который использовался на проекте осталось примерно 20%, буквально одна лишь основная идея.

    Что изменилось:

    1. переработан кастомный тип плагина, который отвечает за социальные медиа;
    2. переработано поле и его составляющие - виджет и форматтер. Теперь URL шеринга динамический, и его можно менять для каждой ноды;
    3. добавлен тип блока с социальными медиа;
    4. добавлен extrafield со своими настройками (для каких сущностей будет использоваться и какие сервисы доступны);
    5. добавлен views-field;
    6. добавлена поддержка токенов для URL шеринга, что теперь позволяет шерить контент из любого филда ноды;
    7. добавлено 25 новых сервисов для шеринга: Blogger, Diaspora, Douban, Evernote, Flipboard, Getpocket, Gmail, Google Bookmarks, Hacker News, InstaPaper, LineMe, LiveJournal, Одноклассники, Pinterest, QZone, Reddit, RenRen, Skype, Telegram, Tumblr, Vk, Weibo, WhatsApp, Xing, Yahoo.

    Теперь подробно и по порядку.

    Почему стоит выбирать Social Sharing
    1. Он гибкий. В основе модуля лежит система плагинов Drupal, на которых вся восьмая версия CMS и построена. Это значит, что любой разработчик, не залезая в функциональность модуля, сможет добавить свою соцсеть для шеринга, если её нет в текущей версии.
    2. Он реализует стабильно работающую функциональность. Другие модули этого не делают - я ковырял те, которые находил. Был всего один, который по рисерчу кода был сделан так же, с плагинами, но он не практичный и я не смог заставить его нормально работать. Идея, видать, была похожая, но не доведённая до конца.
    3. У Social Sharing динамический URL для шеринга и поддержка токенов. Много модулей позволяют использовать шеринг не как блок на странице, а как филд в контенте. Для этого нужно добавить к любому типу контента этот филд. Наш модуль может так же, но с гораздо большими возможностями. Для каждой страницы можно индивидуально задать именно ту информацию, которую пользователь хочет расшарить: не только тайтл страницы с URL-адресом, а вообще любой контент c этой страницы.
    Настройка и работа модуля Social Sharing

    Теперь поговорим подробнее о конфигурации различных фич.

    Extrafield configuration
    Если для разных сущностей на сайте нужны одинаковые ссылки шеринга с одинаковым контентом, который будет шериться, то можно воспользоваться Extrafield. Для него есть отдельная страница конфигурации, где пользователь может настроить:

    • типы сущностей, для которых это поле будет доступно;
    • соцсети, которые будут доступны;
    • контент, который будет шериться.



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

    Entity field configuration
    Ниже приведены примеры конфигурации нового типа поля. В отличии от extrafield это поле может быть настроено для каждой сущности отдельно. Можно задать общие настройки по умолчанию и при необходимости переопределить эти настройки для каждой единицы этой сущности.


    Рассмотрим на примере. У нас есть тип сущности Node. У этой сущности могут быть различные бандлы (Article, Basic page, Blogpost и т. д.). Для каждого бандла мы можем добавить поле типа Social sharing и задать индивидуальные настройки по умолчанию для каждого из бандлов. Далее мы будет создавать контент на нашем сайте - добавлять ноды для этих бандлов. В каждой отдельной ноде пользователь может выбрать, оставить настройки для шеринга, заданные по умолчанию, или переопределить их для текущей ноды (см. скриншот ниже).

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

    Block Configuration
    С блоком все так же довольно просто. Пользователь может добавить блок в любой регион на сайте, выбрать сервисы для шеринга и задать URL для шеринга, либо оставить предложенный по умолчанию.

    Displaying the links (Block and entity field)
    Ниже приведён пример отображения ссылок на шеринг в блоке и в качестве поля для текущей ноды. Может возникнуть резонный вопрос: “А почему же нет иконок?”. За весь мой опыт работы мне не встретился ни один проект где были бы использованы стандартные иконки с какого-то сервиса (например, Fontawesome). Всегда есть дизайн и всегда в дизайне есть эти иконки, которые добавляются фронтенд-разработчиком во время темизации. Но в планах дальнейшего развития модуля есть пункт о добавлении различных пресетов иконок.

    Добавление соцсети, которой нет в модуле

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

    Пример файла path-to-custom-modules/mymodule/src/Plugin/ShareService.php

    Заключение

    У каких-то известных до сих пор модулей есть только блок, у каких-то только филд, где-то есть и филд, и блок, но поменять или добавить сервисы нельзя, и почти нигде с модулем не интегрирован views и нет поддержки токенов, что ограничивает выбор контента при шеринге. Модуль Social Sharing собирает разрозненную функциональность большинства модулей и в ключевых местах значительно её улучшает, что делает его лидером среди всех остальных.

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

  • Drupal9
  • Предлагаю решение
  • Выставка модулей
  • Категории: Друпалургия

    Разработка сайта для Общества научных исследований имени Макса Планка

    Drupal в рунете - вт, 03/11/2020 - 11:48

    О клиенте

    Институт истории науки входит в состав некоммерческой организации «Общество Макса Планка». Он был основан в 1994 году и является одним из более чем 80 научно-исследовательских институтов Общества.

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

    Цели

    Институту требовался сайт для исследовательской группы Epistemes of Modern Acoustics, изучающей акустику одновременно как объект и инструмент познания. Сайт должен:

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

    Что мы сделали:

    • разработали cайт на Drupal 8,
    • сделали админ-панель с удобным UI,
    • внедрили инструменты для работы с библиографическими данными и цитированием,
    • использовали несколько кастомных решений.
    Почему Drupal и почему именно Drupal 8

    У информации на сайте есть своя специфика. Это и наличие библиографических данных, и обилие специфических полей различного типа, и кастомные поля, и связи между контентом. Это создало у администраторов потребность в особых рабочих инструментах. Drupal оказался наиболее подходящей для этого CMS.

    У исследовательской группы уже был сайт, но в продакшн он не попал. В его основе лежала CMS Drupal 7, а для работы с библиографическими данными использовался модуль Bibliography. Со временем выяснилось, что такая комбинация технологий утыкается в ограничения и не может покрыть всех нужд группы. Его представители обратили внимание на молодой (для своего времени) и перспективный Drupal 8. Однако на тот момент модуль Bibliography не имел версии, совместимой с этой версией CMS, и планов по её реализации тоже не было. Тут-то и пригодился наш проект Bibliography & Citation, который стал альтернативной Bibliography.

    Что такое Bibliography & Citation

    Проект Bibliography & Citation (или BibCite), созданный в ADCI Solutions, помогает организовывать, систематизировать и хранить библиографические данные о контенте в спектре от интернет-страниц до научных работ и оформлять цитирование этих источников согласно множеству стандартов, принятых в разное время и в разных организациях.

    По данным drupal.org, на момент публикации кейса проект используется на более чем 282 сайтах. Его задачи уникальны, поэтому каждое использование — с высокой долей вероятности осмысленное. Будучи компанией-создателем проекта, мы это очень ценим.

    О том, кто и как использует проект, читайте в статье Five use cases that highlight the benefits of the Bibliography & Citation project.

    Контент

    Drupal — это прежде всего одна из самых удобных и безопасных систем управления контентом. И в процессе работы мы задействовали весь свой опыт, чтобы поддержать доброе имя Drupal: создали типы контента, перенесли содержимое старого сайта на новый, внедрили специальные инструменты для работы с библиографическими данными и переработали UI админ-панели с помощью виджетов Inline Entity Form, Field Group и других. И клиент, и администраторы сайта остались довольны.

    ТИПЫ КОНТЕНТА

    Структура контента, которого на сайте очень много, играла важнейшую роль. Многие из типов контента прямо связаны с научной работой, поэтому необходимы. Кроме таких привычных типов, как «текст», «изображения», «аудио» и «видео» включили типы «личность», «эксперимент», «инструмент», «локация», «эссе».

    МИГРАЦИЯ КОНТЕНТА

    Перенести огромное количество контента с одного сайта на другой помог встроенный в Drupal 8 модуль Migrate и вспомогательные модули Migrate Tools и Migrate Plus.

    ОТОБРАЖЕНИЕ КОНТЕНТА

    Модуль Display Suite помог фронтенд-разработчику создать страницы с учётом дизайнерских макетов. Другой модуль, Field Group, даёт возможность объединять поля в группы по какому-либо признаку. Блок «Оглавление», помогающий быстро перемещаться между разным частями контента на странице, построен на модулях TOC API и TOC Filter. Всё вместе упрощает фронтенд-разработчику работу со стилями.

    ПОИСК

    Самая часто используемая функция. Работает на модуле Search API, поисковой платформе Solr на серверной стороне и модуле Facets.

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

    Модерация контента

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

    Если вам нужна такая же функциональность, в ядре Drupal есть модуль Content Moderation.

    Научные данные и цитирование

    Библиографические данные хранятся в сущностях Reference, Contributor и Keyword. За хранение данных отвечает модуль Bibliography & Citation — Entity. Обращаем внимание, что библиографические данные отделены от контента, но в определённых случаях они могут легко ссылаться друг на друга с помощью поля Entity Reference.

    Модуль Inline Entity Form уменьшает количество действий, которые администратор должен тратить на работу с контентом и библиографическими данными. Благодаря модулю он может создавать и редактировать библиографические данные в форме с тем самым контентом, к которому эти библиографические данные относятся.

    Сборка сайта из готовых программных решений

    Планировалось, что некоторые функциональные части сайта, типы контента и т. д. будут заново использоваться на других сайтах института. Для этого необходимо держать соответствующие настройки не только в базе данных, но и в коде. Вообще же экспорт в кодовую базу разных настроек вроде типов контента с полями, пользовательских ролей с правами доступа, представлений, макетов страниц и т. д. — очень распространённая практика в Drupal, дающая кучу преимуществ.
    Эти возможности были реализованы как с помощью функциональности Configuration Management из ядра Drupal, так и с помощью дополнительного модуля Features. Этот модуль позволяет запаковывать связанные конфигурации (например, контент-тип и привязанные к нему поля, отображения контента типа Teaser или Full View и т. д.) в обычные Drupal-модули. Эти модули содержит в себе необходимые конфигурации и при установке на Drupal-сайте разворачивают содержащийся в нём кусок функциональности.

    Кастомные решения

    Для каждой страницы с научным материалом создан QR-код со ссылкой, ведущей на соответствующую страницу. QR-код можно скачать в виде изображения и вставлять в документы.

    Администраторам нужна была функциональность для связывания разных типов контента. В результате связанный контент отображается в секции Related Objects на страницах контента.

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

    Для удобства навигации по странице мы расширили функциональность модуля TOC Filter. Этот модуль нужен для создания оглавления, и по умолчанию он использует для этого встречающиеся в тексте заголовки H2 и H3. Мы же сделали так, чтобы TOC Filter выводил якоря и на другие поля и группы полей типа категорий, связанного контента и т. д.

    Вклад в Drupal

    Этот проект показал, как проектом Bibliography & Citation пользуются на самом деле, что позволило улучшить его работу и написать дополнения. В частности, несколько дополнений было сделано к модулю Bibliography & Citation — Migrate. Модули Field Group, Search API sorts и TOC API тоже лишились ряда недостатков после того, как мы предложили их разработчикам исправления.

    Заключение

    Drupal 8 идеально подходит для сайтов с обилием контента: даёт для авторов большие возможности из коробки и расширяется для любых нужд. Проект Bibliography & Citation получил толчок в развитии, мы собрали обратную связь по его работе, а сообщество отреагировало всплеском интереса к нему.

  • Drupal8
  • Предлагаю решение
  • Решение проблем
  • Категории: Друпалургия

    Drupal: Добавляем возможность указывать тип прогрессбара для ajax ссылок

    Небольшой костыль, который позволит указывать тип прогрессбара ajax-ссылки в атрибуте data-progress-type.

    // MODULENAME.js   (function ($, Drupal) {   /** * Override AJAX "beforeSend" callback. */ var originalAjaxBeforeSend = Drupal.Ajax.prototype.beforeSend; Drupal.Ajax.prototype.beforeSend = function (xmlhttprequest, options) { var $element = $(this.element);   // Set progress type from "data-progress-type" attribute // @TODO Remove after close issue https://www.drupal.org/project/drupal/issues/2818463

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

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

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

    Страницы

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