我真的想知道如何传递我的变量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中的任何字符串.. 我想知道出了什么问题?
我这样做的主要目的是我希望打印的链接取决于我所处的环境。 希望任何人都可以解决这个问题,谢谢你!
答案 0 :(得分:0)
不使用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
在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 }