web-dev-qa-db-fra.com

Obtenez le chemin d'accès aux ressources du thème dans le modèle Twig

J'ai une question sur l'obtention d'un chemin vers une image dans un modèle Twig. L'image n'est pas affectée à un champ ou quelque chose. Juste une image statique qui est stockée dans "MYTHEME/image/icon /my-icon.png ".

Dans Drupal 7 j'obtiens le chemin dans mon node.template avec le code suivant:

<img src="<?php print base_path() . path_to_theme(); ?>/image/icons">/my-icon.png

Comment ça marche avec dans Drupal 8? J'ai essayé de passer une variable dans template_preprocess_node().

MYTHEME.theme:

$variables['images_path'] = \Drupal::theme()->getActiveTheme()->getPath() . '/image/';

Modèle de brindille:

<img src="{{ images_path  ~ 'icons/' ~ 'my-icon.png' }}">

Ça ne marche pas. Il n'y a pas d'erreur PHP, mais le chemin est à tort dit http: //localhost/node/themes/template/image/icons/my-icon.png =.

24
Stephan Hofmann

vous pouvez utiliser {{ base_path ~ directory }} qui résoudra le problème absolu, pas besoin de faire de prétraitement, ces deux variables sont incluses par cœur.

Par exemple

<img src="{{ base_path ~ directory }}/images/logo.png" alt="My Logo" />

PS. L'assistant ~ Dans twig est concaténée.

Edit: au moins dans la page * .html.twig templates la variable base_path est incluse, vous devrez peut-être faire un prétraitement pour d'autres modèles, vous pouvez facilement vérifier avec {{ dump() }} si les variables sont présentes

// File: THEMENAME.theme in your theme's root directory
function THEMENAME_preprocess(&$variables, $hook)
{
    $variables['base_path'] = base_path();
}
54
pjcarly

Il y a par défaut une variable {{ directory }} Que vous pouvez utiliser qui pointe vers votre répertoire de thème. Le problème est qu'il n'est pas absolu, tout comme celui que vous avez ajouté. Je pense que c'est un bogue dans le noyau car il devrait inclure le chemin de base, mais le changer pourrait bien sûr casser les sites existants qui l'utilisent.

Vous devez donc ajouter un/devant celui-ci; cela se casserait si Drupal est installé dans un sous-dossier. Vous pouvez soit coder en dur cela dans votre modèle ou continuer à utiliser base_path() comme vous l'avez fait dans 7.x dans une variable personnalisée.

10
Berdir
<img src="/{{ directory }}/images/logo.png"/> 

travaillé pour moi quand

<img src="{{ base_path ~ directory }}/images/logo.png" alt="My Logo" />

n'a pas

pour le modèle de contenu, je devais utiliser dans .module

   function hook_preprocess(&$variables, $hook) {

  $module_handler = Drupal::service('module_handler');
  $path = $module_handler->getModule('myModuleName')->getPath();

  if(isset($variables['region']) && $variables['region'] == 'content'){
    $variables['module_path'] = $path;
    $variables['http_Host'] = $_SERVER['HTTP_Host'];

et

  <img src="{{ module_path }}/images/error404.png" />
  <img src="//{{ http_Host }}/{{ module_path }}/images/error403.png" />
8
Matoeil