Files
site_tools/docs/share-links.md
Quintino A. G. Souza 0e839574ab Initial commit
Módulo site_tools com ferramentas utilitárias para outros módulos:
- Bloco ShareLinks para compartilhamento em redes sociais
- Seção "Local Modules" no menu de configuração do Drupal

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 07:48:36 -03:00

6.8 KiB

Share Links Block

O módulo Site Tools fornece um bloco de compartilhamento (Share Links) que exibe links para compartilhar o conteúdo atual em redes sociais ou outros canais.

O bloco funciona como um container de design que coleta e exibe links fornecidos por outros módulos através de hooks.

Instalação

  1. Copie o módulo para modules/custom/site_tools
  2. Ative o módulo: drush en site_tools
  3. Posicione o bloco "Share Links" na região desejada em /admin/structure/block

Para adicionar links ao bloco, implemente hook_site_tools_share_links() no seu módulo.

Estrutura do Hook

/**
 * Implements hook_site_tools_share_links().
 */
function meu_modulo_site_tools_share_links(): array {
  $links = [];

  // Cada link é identificado por uma chave única.
  $links['minha_rede'] = [
    // Obrigatório: render array ou markup HTML.
    'content' => [
      '#type' => 'link',
      '#title' => t('Compartilhar'),
      '#url' => \Drupal\Core\Url::fromUri('https://exemplo.com/share'),
    ],
    // Opcional: peso para ordenação (menor = aparece primeiro).
    'weight' => 0,
    // Opcional: identificação do módulo provedor.
    'provider' => 'meu_modulo',
  ];

  return $links;
}
/**
 * Implements hook_site_tools_share_links().
 */
function meu_modulo_site_tools_share_links(): array {
  $request = \Drupal::request();
  $current_url = $request->getUri();

  // Obtém o título da página atual.
  $title = \Drupal::service('title_resolver')->getTitle(
    $request,
    \Drupal::routeMatch()->getRouteObject()
  );

  return [
    'email' => [
      'content' => [
        '#type' => 'link',
        '#title' => t('Email'),
        '#url' => \Drupal\Core\Url::fromUri('mailto:', [
          'query' => [
            'subject' => $title,
            'body' => t('Confira este conteúdo: @url', ['@url' => $current_url]),
          ],
        ]),
        '#attributes' => [
          'class' => ['share-link', 'share-link--email'],
          'title' => t('Compartilhar por email'),
        ],
      ],
      'weight' => 100,
      'provider' => 'meu_modulo',
    ],
  ];
}

Exemplo: Integração com AddToAny

/**
 * Implements hook_site_tools_share_links().
 */
function meu_modulo_site_tools_share_links(): array {
  // Verifica se o módulo AddToAny está disponível.
  if (!\Drupal::moduleHandler()->moduleExists('addtoany')) {
    return [];
  }

  // Renderiza o bloco do AddToAny.
  $block_manager = \Drupal::service('plugin.manager.block');
  $plugin_block = $block_manager->createInstance('addtoany_block', []);
  $render = $plugin_block->build();

  return [
    'addtoany' => [
      'content' => $render,
      'weight' => 0,
      'provider' => 'addtoany',
    ],
  ];
}
/**
 * Implements hook_site_tools_share_links().
 */
function meu_modulo_site_tools_share_links(): array {
  $current_url = \Drupal::request()->getUri();
  $encoded_url = urlencode($current_url);

  $title = \Drupal::service('title_resolver')->getTitle(
    \Drupal::request(),
    \Drupal::routeMatch()->getRouteObject()
  );
  $encoded_title = urlencode($title ?? '');

  return [
    'facebook' => [
      'content' => [
        '#type' => 'link',
        '#title' => t('Facebook'),
        '#url' => \Drupal\Core\Url::fromUri(
          "https://www.facebook.com/sharer/sharer.php?u={$encoded_url}"
        ),
        '#attributes' => [
          'class' => ['share-link', 'share-link--facebook'],
          'target' => '_blank',
          'rel' => 'noopener',
        ],
      ],
      'weight' => 0,
    ],
    'twitter' => [
      'content' => [
        '#type' => 'link',
        '#title' => t('X (Twitter)'),
        '#url' => \Drupal\Core\Url::fromUri(
          "https://twitter.com/intent/tweet?url={$encoded_url}&text={$encoded_title}"
        ),
        '#attributes' => [
          'class' => ['share-link', 'share-link--twitter'],
          'target' => '_blank',
          'rel' => 'noopener',
        ],
      ],
      'weight' => 1,
    ],
    'whatsapp' => [
      'content' => [
        '#type' => 'link',
        '#title' => t('WhatsApp'),
        '#url' => \Drupal\Core\Url::fromUri(
          "https://api.whatsapp.com/send?text={$encoded_title}%20{$encoded_url}"
        ),
        '#attributes' => [
          'class' => ['share-link', 'share-link--whatsapp'],
          'target' => '_blank',
          'rel' => 'noopener',
        ],
      ],
      'weight' => 2,
    ],
  ];
}

Use hook_site_tools_share_links_alter() para modificar ou remover links fornecidos por outros módulos.

/**
 * Implements hook_site_tools_share_links_alter().
 */
function meu_modulo_site_tools_share_links_alter(array &$links): void {
  // Remove um link específico.
  unset($links['twitter']);

  // Altera o peso de um link.
  if (isset($links['facebook'])) {
    $links['facebook']['weight'] = -10;
  }

  // Modifica atributos de um link.
  if (isset($links['email']['content']['#attributes'])) {
    $links['email']['content']['#attributes']['class'][] = 'minha-classe';
  }
}

Personalizando o Template

O bloco usa o template site-tools-share-links.html.twig. Para sobrescrevê-lo no seu tema:

  1. Copie templates/site-tools-share-links.html.twig para o diretório templates/ do seu tema
  2. Limpe o cache: drush cr

Variáveis Disponíveis

Variável Descrição
links Array de links de compartilhamento
links[key].content Render array do link
links[key].weight Peso para ordenação
links[key].provider Módulo que forneceu o link
attributes Atributos HTML do container

Exemplo de Template Customizado

{% if links %}
<div{{ attributes.addClass('share-bar') }}>
  <span class="share-bar__title">{{ 'Compartilhe:'|t }}</span>
  <ul class="share-bar__list">
    {% for key, link in links %}
      <li class="share-bar__item share-bar__item--{{ key }}">
        {{ link.content }}
      </li>
    {% endfor %}
  </ul>
</div>
{% endif %}

CSS

O módulo inclui estilos básicos em css/share-links.css. As classes disponíveis são:

Classe Elemento
.site-tools-share-links Container principal
.site-tools-share-links__label Label "Share:"
.site-tools-share-links__items Container dos links
.site-tools-share-links__item Wrapper de cada link
.site-tools-share-links__item--{key} Modificador por tipo de link

Cache

O bloco possui cache que varia por URL (url.path). Se você precisar invalidar o cache programaticamente:

\Drupal\Core\Cache\Cache::invalidateTags(['site_tools_share_links']);

Referência da API

Consulte site_tools.api.php para documentação completa dos hooks.