Категория:
Опубликовано:

Как добавить протокол в filter_protocols

В 8ке - любую ссылку не соорудить.

Например, если нужно добавить ссылку на чатик телеграм (или viber, или watsup, или любой другой с нестандартным протоколом):

<a href="tg://join?invite=invite_link">Join Group</a>
<a href="viber://add?number=phone_number">
<a href="whatsapp://send?text=message">

Такие ссылки Drupal нам сделать не даст.

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

Дефолтный список находится в /core/core.services.yml, секция parameters, свойство filter_protocols.

Вот все что "из коробки":

- http
- https
- ftp
- news
- nntp
- tel
- telnet
- mailto
- irc
- ssh
- sftp
- webcal
- rtsp

В принципе, не плохо, но нам не хватит )))

Внести дополнительные протоколы можно 2мя способами:

1. Внести нужные значения в дефолтные сервисы (файл файл должен находится в /sites/default/services.yml, или его мультисайтовые аналоги). Если у Вас еще нет такого файла - скопируйте файл /sites/default/default.services.yml.

2. И второй вариант - программно подправить список фильтров:

// Получаем список доступных протоколов
$allowedProtocols = UrlHelper::getAllowedProtocols();

// Проверяем его, и если нужного нет ..
if (!in_array($settingType, $allowedProtocols)) {
  // .. добавляем
  $allowedProtocols[] = $settingType;
  UrlHelper::setAllowedProtocols($allowedProtocols);
}

ЗЫ - не забываем заюзать UrlHelper:

use Drupal\Component\Utility\UrlHelper;

Вот так, не хитро, можно добавить нужный фильтр протоколов в Drupal 8+.

Успехов!

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

Комментарии

Увы, но этот способ не работает.
При попытке сохранить текст с новым протоколом, белый экран смерти "Непредвиденная ошибка".

"Белый экран смерти" - ни о чем не говорит, смотрите лог.

Во-первых, вы не указали, что для включения services.yml нужно прописать строчку в settings.php

$settings['container_yamls'][] = __DIR__ . '/services.yml';

Во-вторых, лог ошибок ничего особого не даёт

Drupal\Component\Plugin\Exception\PluginNotFoundException: The "" entity type does not exist. in Drupal\Core\Entity\EntityTypeManager->getDefinition() (line 133 of /home/c/cs59319/public_html/core/lib/Drupal/Core/Entity/EntityTypeManager.php).

Drupal\Core\Entity\EntityStorageException: The "" entity type does not exist. in Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (line 783 of /home/c/cs59319/public_html/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php).

Во-первых, это очевидно.

Во-вторых, ошибки не относятся к протоколам.

<blockquote>Во-первых, это очевидно.</blockquote>
Нет.

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

Добавить комментарий