View source
<?php
namespace Drupal\disqus\Element;
use Drupal\Core\Render\Element\RenderElement;
class Disqus extends RenderElement {
public function getInfo() {
return [
'#title' => '',
'#url' => '',
'#identifier' => '',
'#callbacks' => [],
'#attributes' => [
'id' => 'disqus_thread',
],
'#pre_render' => [
get_class() . '::generatePlaceholder',
],
];
}
public static function generatePlaceholder(array $element) {
if (\Drupal::currentUser()
->hasPermission('view disqus comments')) {
$element[] = [
'#lazy_builder' => [
get_class() . '::displayDisqusComments',
[
$element['#title'],
$element['#url'],
$element['#identifier'],
serialize($element['#callbacks']),
],
],
'#create_placeholder' => TRUE,
];
}
return $element;
}
public static function displayDisqusComments($title, $url, $identifier, $callbacks) {
$disqus_settings = \Drupal::config('disqus.settings');
$renderer = \Drupal::service('renderer');
$element = [
'#theme_wrappers' => [
'disqus_noscript',
'container',
],
'#attributes' => [
'id' => 'disqus_thread',
],
];
$renderer
->addCacheableDependency($element, $disqus_settings);
$disqus = [
'domain' => $disqus_settings
->get('disqus_domain'),
'url' => $url,
'title' => $title,
'identifier' => $identifier,
];
$account = \Drupal::currentUser();
if ($disqus_settings
->get('behavior.disqus_inherit_login') && !$account
->isAnonymous()) {
$renderer
->addCacheableDependency($element, $account);
$disqus['name'] = $account
->getAccountName();
$disqus['email'] = $account
->getEmail();
}
if ($disqus_settings
->get('behavior.disqus_localization')) {
$disqus['language'] = \Drupal::languageManager()
->getCurrentLanguage()
->getId();
}
if ($disqus_settings
->get('advanced.sso.disqus_sso')) {
$disqus += \Drupal::service('disqus.manager')
->ssoSettings();
}
$callbacks = unserialize($callbacks);
if (!empty($callbacks)) {
$disqus['callbacks'] = $callbacks;
}
if ($disqus_settings
->get('behavior.disqus_track_newcomment_ga')) {
$disqus['callbacks']['onNewComment'][] = 'Drupal.disqus.disqusTrackNewComment';
$element['#attached']['library'][] = 'disqus/ga';
}
$element['#attached']['library'][] = 'disqus/disqus';
$element['#attached']['drupalSettings']['disqus'] = $disqus;
return $element;
}
}