Drupal 8 передача глобальных переменных из настроек.php в файлы twig и / или js

Drupal 8 передача глобальных переменных из настроек.php в файлы twig и / или js

19.10.2017 08:25:08 Просмотров 47 Источник

мне действительно интересно, как передать мою переменную globaly (уровень страницы), чтобы ее можно было использовать в любом месте.

Что я сделал:

на моей группе Варс > Дэв.в формате YML

link: "www.anylink.com"

на моей группе Варс > прод.в формате YML

link: "www.anylink-prod.com"

на моих настройках.на PHP (J2 в)

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

по моему шаблону.тема

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

на моей веточке {{ theme_link }}

но он действительно не печатает ни одной строки из моего prod/dev.в формате YML.. мне было интересно, что случилось?

моя главная цель сделать это,

я хочу иметь ссылки, которые печатаются в зависимости от того, в какой среде я нахожусь. надеюсь, кто-нибудь может осветить мне эту проблему, спасибо !

У вопроса есть решение - Посмотреть?

Ответы - Drupal 8 передача глобальных переменных из настроек.php в файлы twig и / или js / Drupal 8 Passing global variables from settings.php to twig and/or js files

Является ответом!
Rainer Tonmensch

25.10.2017 12:02:03

  1. Для глобальных веточек varibales:

Способ ООП без использования крючков:

создайте RequestListener, помещенный в (MY_MODULE / src / Event / Listener):

<?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.обслуживание.в формате YML, как:

my_requestlistener:
  class: Drupal\<MY_MODULE>\Event\Listener\MyRequestListener
  arguments:
    - @twig
    - @settings
  1. для глобальных настроек JS:

создайте крюк в своем MY_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')

 }
https://stackoverflow.com/questions/46823290/drupal-8-passing-global-variables-from-settings-php-to-twig-and-or-js-files/46928192#comment80886752_46928192
Привет @Райнер, я думаю, что это ваш код - это то, что я ищу.. это просто я хочу спросить, означает ли "MY_MODULE", что мне нужно сначала создать модуль и установить его ? или я могу просто использовать любое пользовательское имя без необходимости его установки?
https://stackoverflow.com/questions/46823290/drupal-8-passing-global-variables-from-settings-php-to-twig-and-or-js-files/46928192#comment80935066_46928192
Привет Мартин, да вам нужен пользовательский модуль для всего кода, который я написал. Но это легко. Просто используйте консоль drupal для создания каркасного модуля. MY_MODULE-это понятное имя машины, которое вы ему дадите. Взгляните на это drupal.org/docs/8/creating-custom-modules
JetSet

03.11.2019 09:17:58

Fot глобальные переменные TWIG приведенный выше код не работал для меня, пока я не добавил тег event_subscriber в определение службы. Поэтому поместите в MY_MODULE.сервисы.в формате YML следующие:

  my_requestlistener:
    class: Drupal\<MY_MODULE>\Event\Listener\MyRequestListener
    arguments: ['@twig', '@settings']
    tags:
      - { name: event_subscriber }
Закрыть X