it-swarm.it

Ottieni percorso alle risorse del tema in Twig

Ho una domanda su come ottenere un percorso per un'immagine in un Twig. L'immagine non è assegnata a un campo o qualcosa del genere. Solo un'immagine statica che è 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 in 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 esiste PHP, ma il percorso viene erroneamente indicato come http: //localhost/node/themes/template/image/icons/my-icon.png =.

24
Stephan Hofmann

puoi usare {{ 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'helper ~ In twig è concatenato.

Modifica: almeno nella pagina * .html.twig template è inclusa la variabile base_path, forse dovrai preelaborare altri template, puoi facilmente controllare con {{ 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();
}
54
pjcarly

Per impostazione predefinita, esiste una variabile {{ directory }} Che puoi utilizzare per indirizzare alla tua directory dei temi. 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 la modifica che ovviamente spezzerebbe i siti esistenti che lo utilizzano.

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

10
Berdir
<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" />
8
Matoeil