2017-10-19 8 views
0

Je me demande vraiment comment passer ma variable globaly (niveau page) pour pouvoir l'utiliser n'importe où.Drupal 8 Passer des variables globales de settings.php à des fichiers twig et/ou js

Qu'est-ce que je l'ai fait:

sur mon groupe vars> dev.yml

link: "www.anylink.com" 

sur mon groupe vars> prod.yml

link: "www.anylink-prod.com" 

sur mon settings.php (j2)

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

sur mon template.theme

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

sur ma branche {{}} theme_link

mais il n'imprime pas vraiment une chaîne de mon prod/dev. yml .. je me demandais ce qui ne va pas?

mon principal objectif le faire est,

je veux avoir un liens impression dépend quel environnement je suis sur. J'espère que n'importe qui peut m'éclairer sur ce problème, merci!

Répondre

0
  1. Pour brindille mondiale varibales:

La façon POO sans utiliser Hooks:

créer un RequestListener placé dans (mon_module/src/événement/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')); 
    } 

} 

et vous devez l'enregistrer en tant que service dans votre MY_MODULE.service.yml comme:

my_requestlistener: 
    class: Drupal\<MY_MODULE>\Event\Listener\MyRequestListener 
    arguments: 
    - @twig 
    - @settings 
  1. pour les paramètres globaux JS:

DEVENEZ crochet dans votre fichier 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') 

} 
+0

Salut @Rainer, je pense que c'est votre code est ce que je cherche .. c'est juste que je veux demander si par "MY_MODULE" cela signifie que je dois créer un module et l'installer d'abord? ou puis-je utiliser un nom personnalisé sans avoir besoin de l'installer? –

+0

Salut Martin, Oui, vous avez besoin d'un module personnalisé pour tout le code que j'ai écrit. Mais c'est facile. Utilisez simplement la console drupal pour générer un module squelette. MY_MODULE est le nom de machine que vous lui donnerez. Jetez un oeil à ce https://www.drupal.org/docs/8/creating-custom-modules –