2017-10-11 8 views
0

안녕하세요 모두 Drupal 8 EventSubscriber 클래스는 DrupalSettings를 Drupal 8 JavaScript 설정에 연결해야합니다. 하지만 불행히도이 \ Drupal :: service ('renderer') -> renderRoot ($ js_data); drupal 자바 스크립트 설정을 첨부하지 않습니다.Drupal 8 #attached는 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 솔루션을 찾지 못했습니다. 귀하의 경우 논리 양식을 customoid 메서드를 hook_js_settings_alterejectorseat.module 파일에있는 HOOK에 배치하면됩니다. 이렇게하면 drupalSettings 객체에서 모든 변수를 사용할 수 있습니다. 단지 시연

예컨대 :

<?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; 

}