Ottieni il percorso delle risorse del tema nel modello Twig


22

Ho una domanda su come ottenere un percorso per un'immagine in un modello di ramoscello. L'immagine non è assegnata a un campo o qualcosa del genere. Solo un'immagine statica memorizzata in "MYTHEME / image / icon / my-icon.png".

In Drupal 7 ottengo il percorso nel mio node.template con il seguente codice:

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

Come funziona con Drupal 8? Ho provato a passare una variabile in template_preprocess_node().

MYTHEME.theme:

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

Modello di ramoscello:

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

Non funziona Non si verifica alcun errore PHP, ma il percorso viene erroneamente definito http: //localhost/node/themes/template/image/icons/my-icon.png .


"il percorso è sbagliato" - non è molto utile :) Inoltre, dovresti eseguire la preelaborazione nel file del tema del tema, non nella funzione globale tmeplate_preprocess_hook e dovresti usare drupal_get_path ('tema', 'teo' ').

@ user21641 drupal_get_pathè per D7 :)
Chapabu

1
È anche per 8 @Chapabu ...
Clive

Bene, abbattimi con una piuma!
Colorami

Lo è anche per D8. L'ho usato così:$themePath = Url::fromUserInput('/' . drupal_get_path('theme', '[themename]')
Vodde,

Risposte:


51

è possibile utilizzare {{ base_path ~ directory }}che risolverà il problema assoluto, non è necessario eseguire alcuna preelaborazione, entrambe le variabili sono incluse dal core.

Per esempio

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

PS. l' ~aiutante nel ramoscello è concatenato.

Modifica: almeno nella pagina * .html.twig template è inclusa la variabile base_path, forse dovrai preelaborare altri template, puoi facilmente verificare {{ dump() }}se le variabili sono presenti

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

3
Grazie per aver condiviso la tua soluzione. Un breve commento: ho dovuto aggiungere esplicitamente $ variabili ['base_path'] = base_path (); al mio hook del tema THEME_preprocess_html per renderlo disponibile nel file modello html.html.twig.
Marcos Buarque,

1
Fai attenzione all'uso della {{ directory }}variabile Twig in un tema che intendi utilizzare come tema di base e crea sottotemi per: drupal.stackexchange.com/questions/277278
JamesWilson

1
Il modulo di suggerimenti per il modello ramoscello fornisce {{ base_bath }}a ogni modello; altrimenti per alcuni template dovrai fare come Marcos Buarque nel commento sopra, o Matoeil in drupal.stackexchange.com/a/238535/4195
mlncn

9

Per impostazione predefinita, esiste una {{ directory }}variabile che è possibile utilizzare che punta alla directory del tema. Il problema è che non è assoluto, proprio come quello che hai aggiunto. Penso che sia un bug nel nucleo perché dovrebbe includere il percorso di base, ma cambiarlo ovviamente spezzerebbe i siti esistenti che lo usano.

Quindi è necessario aggiungere un / davanti ad esso; questo si spezzerebbe se Drupal fosse installato in una sottocartella. Puoi hardcodificarlo nel tuo modello o continuare a usarlo base_path()come hai fatto in 7.x in una variabile personalizzata.


Come usare l'immagine da /sites/default/files/MyFolder? Ho un'immagine MyImage.jpg in MyFolder. Ora, nel modello di ramoscello se ho scritto <img src={{ url }} alt={{ text }}>Qui la variabile url ha il percorso /MyFolder/MyImage.jpg ma non funziona.
Jasodeep Chatterjee,

2
Come scrisse Berdir: si può semplicemente usare <img src="/{{ directory }}/path/to/image"/>per ottenere un percorso assoluto.
Daniels,

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

ha funzionato per me quando

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

no

per il modello di contenuto, ho dovuto usare in .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'];

e

  <img src="{{ module_path }}/images/error404.png" />
  <img src="//{{ http_host }}/{{ module_path }}/images/error403.png" />

3
Questa risposta dovrebbe essere contrassegnata come corretta invece
Jignesh Rawal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.