web-dev-qa-db-fra.com

Comment appeler une fonction dans un fichier Twig

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.

3
Rituraj Kumar

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 }
7
leymannx

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

4
Hudri