Drupal 8将全局变量从settings.php传递给twig和/或js文件

时间:2017-10-19 05:25:09

标签: php symfony drupal drupal-8

我真的想知道如何传递我的变量globaly(页面级别),以便它可以在任何地方使用。

我做了什么:

关于我的论坛vars> dev.yml

link: "www.anylink.com"

关于我的论坛vars> prod.yml

link: "www.anylink-prod.com"

在我的settings.php(j2)

$settings["custom_link"]={{link}};

在我的template.theme

function theme_preprocess_page(&$variables) {
  $variables[theme_link] = Settings::get('custom_link');
}

在我的树枝上     {{theme_link}}

但它确实没有打印我的prod / dev.yml中的任何字符串.. 我想知道出了什么问题?

我这样做的主要目的是

我希望打印的链接取决于我所处的环境。 希望任何人都可以解决这个问题,谢谢你!

2 个答案:

答案 0 :(得分:0)

  1. 对于全球树枝变种:
  2. 不使用HOOK的OOP方式:

    创建一个置于(MY_MODULE / src / Event / Listener)中的RequestListener:

    <?php
    
    namespace Drupal\<MY_MODULE>\Event\Listener;
    
    use Drupal\Core\Site\Settings;
    use Drupal\Core\Template\TwigEnvironment;
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    use Symfony\Component\HttpKernel\KernelEvents;
    
    /**
     * Class MyRequestListener
     *
     */
    class MyRequestListener implements EventSubscriberInterface {
    
      /**
       * @var \Drupal\Core\Template\TwigEnvironment
       */
      protected $twigEnvironment;
    
      /**
       * @var \Drupal\Core\Site\Settings
       */
      protected $settings;
    
    
      /**
       * FdeRequestListener constructor.
       */
      public function __construct(TwigEnvironment $twigEnvironment,
                                  Settings $settings) {
    
        $this->twigEnvironment = $twigEnvironment;
        $this->settings        = $settings;
      }
    
      /**
       * @return mixed
       */
      public static function getSubscribedEvents() {
        $events[KernelEvents::REQUEST][] = ['onRequest'];
        return $events;
      }
    
      /**
       * @param GetResponseEvent $e
       */
      public function onRequest(GetResponseEvent $e) {
        //here you can add everything which is then globally accessible in twig templates like {{ custom_link }}
        $this->twigEnvironment->addGlobal('custom_link', $this->settings->get('custom_link'));
      }
    
    }
    

    你必须在MY_MODULE.service.yml中将其注册为服务,如:

    my_requestlistener:
      class: Drupal\<MY_MODULE>\Event\Listener\MyRequestListener
      arguments:
        - @twig
        - @settings
    
    1. 用于全局JS设置:
    2. 在MY_MODULE.module文件中创建一个钩子:

      <?php
      /**
       * Implements hook_js_settings_alter().
       * - adds "custom_link" to the drupalSettings
       */
      function my_module_js_settings_alter(array &$settings,
          \Drupal\Core\Asset\AttachedAssetsInterface $assets
      ) {
            /* @var $settings Drupal\Core\Site\Settings */
            $globalSettings = \Drupal::service('settings');
      
            //if you want to push all settings into drupalSettings JS object
            $settings['all_settings'] = $globalSettings->getAll();
            //if you want to push only a single value
            $settings['custom_link'] = $globalSettings->get('custom_link')
      
       }
      

答案 1 :(得分:0)

很多全局TWIG变量,直到我在服务定义中添加了 event_subscriber 标记之后,上述代码才对我不起作用。因此,将以下内容放入MY_MODULE.services.yml:

  my_requestlistener:
    class: Drupal\<MY_MODULE>\Event\Listener\MyRequestListener
    arguments: ['@twig', '@settings']
    tags:
      - { name: event_subscriber }