Drupal 8: Как сделать кнопки для социальных сетей
Для одного из проектов захотелось использовать Drupal. «Система уже взрослая, хорошо себя зарекомендовавшая, много готовых модулей», — думал я. Но технологии меняются. Drupal 7 уже устаревает. На смену ему приходит Drupal 8, и многие модули тоже становятся неактуальными. Да и попытка найти толковый и простой модуль для добавления закладок для социальных сетей завершилась неудачей. Есть варианты, но они не включаются главную сеть в СНГ — vk.com. Поэтому и возникает задача написать свой модуль.
Модуль будет предельно простым, минимальная конфигурация в админке. Все необходимые изменения можно делать сразу в шаблонах.
1. В <SITE_PATH>/modules сайта создайте папке sharebuttons — это будет наш модуль
2. В папке <SITE_PATH>/modules/sharebuttons создайте файл sharebuttons.info.yml со следующим содержимым. Это будет описание модуля: имя, зависимости, тип.
name: Share buttons for a page description: Share buttons core: 8.x package: Custom dependencies: - node - block type: module
3. В папке <SITE_PATH>/modules/sharebuttons создайте файл sharebuttons.module со следующим содержимым. Здесь мы указываем, какие шаблону и переменные в них будут использоваться (функция sharebuttons_theme), как и что отображать (функция sharebuttons_node_view) и добавление поля в админку для контроля места отображения (функция sharebuttons_entity_extra_field_info)
<?php use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\Display\EntityViewDisplayInterface; use Drupal\Core\Url; use Drupal\Component\Utility\Html; use Drupal\Component\Utility\UrlHelper; use Drupal\node\Entity\NodeType; use Drupal\node\Entity\Node; function sharebuttons_theme() { return array ( 'sharebuttons' => array( 'variables' => array("pageUrl"=>""), 'template' => 'sharebuttons', ) ); } function sharebuttons_entity_extra_field_info() { $extra = array(); /** @var \Drupal\node\NodeTypeInterface $bundle */ foreach (NodeType::loadMultiple() as $bundle) { $extra['node'][$bundle->id()]['display']['sharebuttons'] = array( 'label' => t('LegoClub share'), 'description' => t('Share buttons by LegoClub'), 'weight' => 5, 'visible' => TRUE, ); } return $extra; } function sharebuttons_node_view(array &$build, EntityInterface $node, EntityViewDisplayInterface $display, $view_mode) { if ($display->getComponent('sharebuttons') && $node->isPublished()) { $url = isset($node) ? $node->url('canonical', array('absolute' => true)) : "nothing"; if (!isset($url)) { $url = ($is_front) ? Url::fromRoute('<front>')->setAbsolute()->toString() : Url::fromRoute('<current>')->setAbsolute()->toString(); } else { } $url = urlencode($url); $build['sharebuttons'] = array( '#pageUrl' => $url, '#theme' => 'sharebuttons', ); } }
4. Теперь можно подготовить сам шаблон. Для этого создайте папке templates в <SITE_PATH>/modules/sharebuttons. И в ней файл sharebuttons.html.twig с содержимым:
<a href="http://www.facebook.com/sharer.php?u={{ pageUrl|raw }} " target="_blank" rel="nofollow"> <img src="/sites/default/files/facebook.gif" alt="facebook" style="border:0px;margin:2px;padding:0px;" width="88px" height="25px"> </a> <a href="http://vk.com/share.php?url={{ pageUrl|raw }} " target="_blank" rel="nofollow"> <img src="/sites/default/files/vkontakte.gif" alt="vk" style="border:0px;margin:2px;padding:0px;" width="88px" height="25px"> </a> <a href="https://connect.ok.ru/dk?st.cmd=WidgetSharePreview&service=odnoklassniki&st.shareUrl={{ pageUrl|raw }} " target="_blank" rel="nofollow"> <img src="/sites/default/files/ok.gif" alt="ok" style="border:0px;margin:2px;padding:0px;" width="88px" height="25px"> </a>
Модуль готов. Осталось только подложить картинки и добавить его в Drupal 8.
Добрый день!
Большое спасибо за модуль, всё работает! Есть правда один вопрос, что нужно изменить, чтобы на главной странице кнопки не отображались? Хочу отобразить только в самом материале
0
0
@Алексей
Спасибо за вопрос. Смотрю, что можно попробовать проверять $view_mode. Судя по коду, эта переменная имеет значение «full» для полной статьи и «teaser» для урезанной (когда на главной).
if ($display->getComponent(‘sharebuttons’) && $node->isPublished() && $view_mode == ‘full’) {
1
0
@Admin
Спасибо! Всё именно так, как хотел)
Кстати, чтобы показать/исключить у определенного типа материала, то добавляем:
$node->bundle() !== ‘page’
в условие, где ‘page’ машинное имя типа материала (в моем случае исключаем «Страницы»).
if ($display->getComponent(‘sharebuttons’) && $node->isPublished() && $node->bundle() !== ‘page’ && $view_mode == ‘full’) {
Ps. Оставлю тут, вдруг кому пригодится, мне как новичку друпала такая инфа на глаза не попадалась
0
0
500 ошибка при переходе на ссылку ноды((
0
0