Disons que je crée une fonction dans un fichier de module:
function _get_test() {
return 'test';
}
Comment puis-je appeler cela dans un fichier Twig? Par exemple *.html.twig
, page.html.twig
, node.html.twig
etc.
OR
Comment puis-je passer une variable de PHP à Twig et l'afficher dans n'importe quel fichier Twig. Par exemple *.html.twig
, page.html.twig
, node.html.twig
etc.
Vous pouvez définir vos propres Twig fonctions personnalisées dans un module personnalisé (mais pas dans un thème). Pour trouver un exemple sur la façon de procéder, consultez cet exemple dans core/modules/system/tests/modules/twig_extension_test/src/TwigExtension/TestExtension.php
.
Voir également cet article de blog: Créer Twig extensions pour Drupal 8 .
Dans cet exemple, nous allons construire une extension pour afficher un bloc Drupal directement dans un modèle Twig:
{{ display_block('my_block_id') }}
src/MyTwigExtension.php
<?php namespace Drupal\MyTwigModule; /** * Class DefaultService. * * @package Drupal\MyTwigModule */ class MyTwigExtension extends \Twig_Extension { /** * {@inheritdoc} * This function must return the name of the extension. It must be unique. */ public function getName() { return 'block_display'; } /** * In this function we can declare the extension function */ public function getFunctions() { return array( new \Twig_SimpleFunction('display_block', array($this, 'display_block'), array('is_safe' => array('html') )), } /** * The php function to load a given block */ public function display_block($block_id) { $block = \Drupal\block\Entity\Block::load($block_id); return \Drupal::entityManager()->getViewBuilder('block')->view($block); } }
src/MyTwigModule.services.yml
services: MyTwigModule.twig.MyTwigExtension: class: Drupal\MyTwigModule\MyTwigExtension tags: - { name: twig.extension }
Vous n'appelez pas PHP dans Twig. Vous pouvez soit créer une extension Twig personnalisée (voir la réponse de leymannx)) soit utiliser le pré-processus global
function MYTHEME_preprocess(array &$variables, $hook) {
//this is a global hook, its variables are available in any template file
$variables['foo'] = 'bar';
}
{{ foo }}
affichera alors bar
, mais ce pré-processus global pourrait cependant rencontrer des problèmes de mise en cache