Abrufen des Pfads zu Themenelementen in der Twig-Vorlage

22

Ich habe eine Frage zum Abrufen eines Pfads zu einem Bild in einer Zweigvorlage. Das Bild ist keinem Feld oder etwas zugeordnet. Nur ein statisches Bild, das in "MYTHEME / image / icon / my-icon.png" gespeichert ist.

In Drupal 7 erhalte ich den Pfad in meiner node.template mit folgendem Code:

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

Wie funktioniert es in Drupal 8? Ich habe versucht, eine Variable einzugeben template_preprocess_node().

MYTHEME.theme:

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

Zweigvorlage:

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

Es funktioniert nicht Es gibt keinen PHP-Fehler, aber der Pfad lautet fälschlicherweise http: //localhost/node/themes/template/image/icons/my-icon.png .

Stephan Hofmann
quelle
"Der Pfad ist falsch" - das ist nicht sehr hilfreich :) Außerdem sollten Sie die Vorverarbeitung in der Designdatei des Themas durchführen, nicht in der globalen Funktion tmeplate_preprocess_hook, und Sie sollten drupal_get_path ('theme', 'yourtheme') verwenden.
@ user21641 drupal_get_pathist für D7 :)
Chapabu
1
Es ist auch für 8 @Chapabu ...
Clive
Nun blase mich mit einer Feder nieder! Farbe mich korrigiert :)
Chapabu
Es ist in der Tat auch für D8. Ich habe es so benutzt:$themePath = Url::fromUserInput('/' . drupal_get_path('theme', '[themename]')
Vodde

Antworten:

51

Sie können verwenden, {{ base_path ~ directory }}was das absolute Problem behebt. Es ist keine Vorverarbeitung erforderlich. Beide Variablen sind im Core enthalten.

Beispielsweise

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

PS. Der ~Helfer im Zweig ist verkettet.

Bearbeiten: Zumindest in der Seite * .html.twig sind Vorlagen mit der Variablen base_path enthalten. Möglicherweise müssen Sie eine Vorverarbeitung für andere Vorlagen durchführen. Sie können problemlos überprüfen, {{ dump() }}ob die Variablen vorhanden sind

// File: THEMENAME.theme in your theme's root directory
function THEMENAME_preprocess(&$variables, $hook)
{
    $variables['base_path'] = base_path();
}
pjcarly
quelle
3
Vielen Dank, dass Sie Ihre Lösung geteilt haben. Ein kurzer Kommentar: Ich musste explizit $ variables ['base_path'] = base_path () hinzufügen; Klicken Sie auf meinen THEME_preprocess_html-Design-Hook, um ihn in der Vorlagendatei html.html.twig verfügbar zu machen.
Marcos Buarque
1
Seien Sie vorsichtig, {{ directory }}wenn Sie die Variable Twig in einem Thema verwenden, das Sie als Basisthema verwenden
möchten,
1
Das Zweigvorlagen-Vorschlagsmodul liefert {{ base_bath }}zu jeder Vorlage; Andernfalls müssen Sie für einige Vorlagen das tun, was Marcos Buarque im obigen Kommentar oder Matoeil in drupal.stackexchange.com/a/238535/4195
mlncn
9

Standardmäßig gibt es eine {{ directory }}Variable, die Sie verwenden können, um auf Ihr Themenverzeichnis zu verweisen. Das Problem ist, dass es nicht absolut ist, genau wie das, das Sie hinzugefügt haben. Ich denke, das ist ein Fehler im Kern, weil er den Basispfad enthalten sollte, aber eine Änderung würde natürlich bestehende Websites, die ihn verwenden, zum Erliegen bringen.

Sie müssen also ein / davor hinzufügen. Dies würde scheitern, wenn Drupal in einem Unterordner installiert ist. Sie können dies entweder in Ihrer Vorlage fest codieren oder base_path()wie in 7.x in einer benutzerdefinierten Variablen weiterverwenden.

Berdir
quelle
Wie benutze ich das Bild von /sites/default/files/MyFolder? Ich habe ein Bild MyImage.jpg in MyFolder. Nun, in Zweig Vorlage, wenn ich schrieb, <img src={{ url }} alt={{ text }}>hier URL-Variable hat den Pfad /MyFolder/MyImage.jpg, aber es funktioniert nicht.
Jasodeep Chatterjee
2
Wie Berdir schrieb: Man kann einfach benutzen <img src="/{{ directory }}/path/to/image"/>, um einen absoluten Pfad zu erhalten.
Daniels
7
<img src="/{{ directory }}/images/logo.png"/> 

hat bei mir gearbeitet wenn

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

nicht

für die inhaltsvorlage musste ich in .module verwenden

   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'];

und

  <img src="{{ module_path }}/images/error404.png" />
  <img src="//{{ http_host }}/{{ module_path }}/images/error403.png" />
Matoeil
quelle
3
Diese Antwort sollte stattdessen als korrekt markiert werden
Jignesh Rawal