2017-10-11 100 views
0

大家好下面Drupal 8 EventSubscriber類應該將drupalSettings附加到Drupal 8 JavaScript設置。但不幸的是這個\ Drupal :: service('renderer') - > renderRoot($ js_data);不附加drupal的JavaScript設置。Drupal 8#附加不工作裏面eventsubscriber

namespace Drupal\ejectorseat\EventSubscriber; 

use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Drupal\Core\Url; 

class EjectorseatSubscriber implements EventSubscriberInterface { 

    public function customEjector(GetResponseEvent $event) { 
     $account = \Drupal::currentUser(); 
     $ejectorseat_interval = \Drupal::config('ejectorseat.settings')->get('ejectorseat_interval'); 
     if(empty($ejectorseat_interval)){ 
     $ejectorseat_interval = 60; 
     } 
     $ejectorseat_background = \Drupal::config('ejectorseat.settings')->get('ejectorseat_background'); 
     if(empty($ejectorseat_background)){ 
     $ejectorseat_background = 0; 
     } 

     if ($account->id() > 0 && (int) $ejectorseat_interval) { 
      $js_data = array(); 
      $js_data['#attached']['drupalSettings']['ejectorSeat']['interval'] = $ejectorseat_interval; 
      $js_data['#attached']['drupalSettings']['ejectorSeat']['url'] = Url::fromRoute('ejectorseat/check'); 
      $js_data['#attached']['drupalSettings']['ejectorSeat']['ignoreFocus'] = $ejectorseat_background ? TRUE : FALSE; 
      \Drupal::service('renderer')->renderRoot($js_data); 
     } 
    } 

    public static function getSubscribedEvents() { 
    $events[KernelEvents::REQUEST][] = array('customEjector'); 
    return $events; 
    } 
} 

回答

0

我面臨同樣的問題,我沒有找到OOP解決方案。 在您的情況下,只需將您的邏輯形式的自定義彈出方法放在您的ejectorseat.module文件中的一個名爲的hook_js_settings_alter中。這樣你可以確定所有的變量都可以在drupalSettings對象中使用。

E.g只是爲了演示:

<?php 
/** 
* Implements hook_js_settings_alter(). 
* 
*/ 
function ejectorseat_js_settings_alter(array &$settings, 
    \Drupal\Core\Asset\AttachedAssetsInterface $assets 
) { 
    ... 

     $settings['all_settings'] = $globalSettings->getAll(); 
     //if you want to push only a single value 
     $settings['custom_link'] = $globalSettings->get('custom_link') 
     $settings['ejectorSeat']['interval'] = $ejectorseat_interval; 
     $settings['ejectorSeat']['url'] = Url::fromRoute('ejectorseat/check'); 
     $settings['ejectorSeat']['ejectorSeat']['ignoreFocus'] = $ejectorseat_background ? TRUE : FALSE; 

}