View source
<?php
namespace Drupal\social_simple\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Controller\TitleResolver;
use Symfony\Component\HttpFoundation\RequestStack;
use Drupal\Core\Routing\CurrentRouteMatch;
use Drupal\social_simple\SocialSimpleGenerator;
use Drupal\Core\Cache\Cache;
class SocialSimpleBlock extends BlockBase implements ContainerFactoryPluginInterface {
protected $titleResolver;
protected $requestStack;
protected $currentRouteMatch;
protected $socialSimpleGenerator;
public function __construct(array $configuration, $plugin_id, $plugin_definition, TitleResolver $title_resolver, RequestStack $request_stack, CurrentRouteMatch $current_route_match, SocialSimpleGenerator $social_simple_generator) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->titleResolver = $title_resolver;
$this->requestStack = $request_stack;
$this->currentRouteMatch = $current_route_match;
$this->socialSimpleGenerator = $social_simple_generator;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('title_resolver'), $container
->get('request_stack'), $container
->get('current_route_match'), $container
->get('social_simple.generator'));
}
public function defaultConfiguration() {
return [
'social_networks' => [],
'social_share_title' => $this
->t('Share on'),
] + parent::defaultConfiguration();
}
public function blockForm($form, FormStateInterface $form_state) {
$form['social_share_title'] = [
'#type' => 'textfield',
'#title' => $this
->t('Social share title'),
'#description' => $this
->t('Set the title to use before the social links displayed'),
'#default_value' => $this->configuration['social_share_title'],
'#maxlength' => 255,
'#size' => 64,
'#weight' => 1,
];
$options = $this->socialSimpleGenerator
->getNetworks();
$form['social_networks'] = [
'#type' => 'checkboxes',
'#title' => $this
->t('Social networks'),
'#description' => $this
->t('Select the social network share link to display'),
'#options' => $options,
'#default_value' => $this->configuration['social_networks'],
'#weight' => 2,
];
return $form;
}
public function blockSubmit($form, FormStateInterface $form_state) {
$this->configuration['social_networks'] = $form_state
->getValue('social_networks');
$this->configuration['social_share_title'] = $form_state
->getValue('social_share_title');
}
public function build() {
$build = [];
$title = $this->configuration['social_share_title'];
$networks = array_filter($this->configuration['social_networks']);
if (empty($networks)) {
return $build;
}
$entity = NULL;
if ($node = $this->currentRouteMatch
->getParameter('node')) {
$entity = $node;
}
elseif ($taxonomy_term = $this->currentRouteMatch
->getParameter('taxonomy_term')) {
$entity = $taxonomy_term;
}
if (!$entity) {
$keys = $this->currentRouteMatch
->getParameters()
->keys();
$entity_type_id = isset($keys[0]) ? $keys[0] : '';
if (!empty($entity_type_id)) {
$current_entity = $this->currentRouteMatch
->getParameter($entity_type_id);
if ($current_entity instanceof ContentEntityInterface) {
$entity = $current_entity;
}
}
}
$build = $this->socialSimpleGenerator
->buildSocialLinks($networks, $title, $entity);
return $build;
}
public function getCacheTags() {
if ($node = $this->currentRouteMatch
->getParameter('node')) {
return Cache::mergeTags(parent::getCacheTags(), $node
->getCacheTags());
}
elseif ($taxonomy_term = $this->currentRouteMatch
->getParameter('taxonomy_term')) {
return Cache::mergeTags(parent::getCacheTags(), $taxonomy_term
->getCacheTags());
}
else {
return parent::getCacheTags();
}
}
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), [
'url.path',
]);
}
}