Главная > Soft > Drupal 8: Как сделать кнопки для социальных сетей

Drupal 8: Как сделать кнопки для социальных сетей

Для одного из проектов захотелось использовать Drupal. «Система уже взрослая, хорошо себя зарекомендовавшая, много готовых модулей», — думал я. Но технологии меняются. Drupal 7 уже устаревает. На смену ему приходит Drupal 8, и  многие модули тоже становятся неактуальными. Да и попытка найти толковый и простой модуль для добавления закладок для социальных сетей завершилась неудачей. Есть варианты, но они не включаются главную сеть в СНГ — vk.com. Поэтому и возникает задача написать свой модуль.

Drupal 8: Как сделать кнопки для социальных сетей

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

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.

Categories: Soft Tags: ,
  1. Алексей
    1 Сентябрь 2017 в 12:19 | #1

    Добрый день!

    Большое спасибо за модуль, всё работает! Есть правда один вопрос, что нужно изменить, чтобы на главной странице кнопки не отображались? Хочу отобразить только в самом материале




    0



    0
  2. Admin
    1 Сентябрь 2017 в 22:33 | #2

    @Алексей
    Спасибо за вопрос. Смотрю, что можно попробовать проверять $view_mode. Судя по коду, эта переменная имеет значение «full» для полной статьи и «teaser» для урезанной (когда на главной).

    if ($display->getComponent(‘sharebuttons’) && $node->isPublished() && $view_mode == ‘full’) {




    1



    0
  3. Алексей
    4 Сентябрь 2017 в 14:10 | #3

    @Admin
    Спасибо! Всё именно так, как хотел)

    Кстати, чтобы показать/исключить у определенного типа материала, то добавляем:
    $node->bundle() !== ‘page’
    в условие, где ‘page’ машинное имя типа материала (в моем случае исключаем «Страницы»).

    if ($display->getComponent(‘sharebuttons’) && $node->isPublished() && $node->bundle() !== ‘page’ && $view_mode == ‘full’) {

    Ps. Оставлю тут, вдруг кому пригодится, мне как новичку друпала такая инфа на глаза не попадалась :)




    0



    0
  1. Пока что нет уведомлений.