Obtenir le chemin d'accès aux ressources de thème dans le modèle Twig

22

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 Drupal 8? J'ai essayé de transmettre une variable 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 d'accès serait à tort http: //localhost/node/themes/template/image/icons/my-icon.png .

Stephan Hofmann
la source
"le chemin est incorrect" - ce n'est pas très utile :) Vous devez également effectuer le prétraitement dans le fichier de thème du thème, pas dans la fonction globale tmeplate_preprocess_hook et vous devez utiliser drupal_get_path ('theme', 'yourtheme').
@ user21641 drupal_get_pathest pour D7 :)
Chapabu
1
C'est aussi pour 8 @Chapabu ...
Clive
Eh bien, souffle-moi avec une plume!
Colorie-
Il en va de même pour D8. Je l'ai utilisé comme ça:$themePath = Url::fromUserInput('/' . drupal_get_path('theme', '[themename]')
Vodde

Réponses:

51

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

Par exemple

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

PS. l' ~aide en brindille 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 {{ 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();
}
pjcarly
la source
3
Merci d'avoir partagé votre solution. Un petit commentaire: j'ai dû ajouter explicitement $ variables ['base_path'] = base_path (); à mon crochet de thème THEME_preprocess_html pour le rendre disponible dans le fichier de modèle html.html.twig.
Marcos Buarque
1
Soyez prudent {{ directory }}lorsque vous utilisez la variable Twig dans un thème que vous avez l'intention d'utiliser comme thème de base et créez des sous-thèmes pour: drupal.stackexchange.com/questions/277278
JamesWilson
1
Le module de suggestions de modèles de brindilles fournit {{ base_bath }}à chaque modèle; sinon, pour certains modèles, vous devrez faire comme Marcos Buarque l'a fait dans le commentaire ci-dessus, ou Matoeil l'a fait dans drupal.stackexchange.com/a/238535/4195
mlncn
9

Il existe par défaut une {{ directory }}variable que vous pouvez utiliser qui pointe vers votre répertoire de thèmes. 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 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.

Berdir
la source
Comment utiliser l'image à partir de /sites/default/files/MyFolder? J'ai une image MyImage.jpg dans MyFolder. Maintenant, dans le modèle de brindille si j'ai écrit <img src={{ url }} alt={{ text }}>ici, la variable url a le chemin /MyFolder/MyImage.jpg mais, cela ne fonctionne pas.
Jasodeep Chatterjee
2
Comme l'a écrit Berdir: on peut simplement utiliser <img src="/{{ directory }}/path/to/image"/>pour obtenir un chemin absolu.
daniels
7
<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" />
Matoeil
la source
3
Cette réponse doit plutôt être marquée comme correcte
Jignesh Rawal