Twigテンプレートのテーマアセットへのパスを取得する


22

Twigテンプレートの画像へのパスの取得について質問があります。画像はフィールドなどに割り当てられていません。「MYTHEME / image / icon / my-icon.png」に保存されている静止画像。

Drupal 7では、次のコードでnode.templateにパスを取得します。

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

Drupal 8ではどのように機能しますか?で変数を渡そうとしましたtemplate_preprocess_node()

MYTHEME.theme:

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

小枝テンプレート:

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

機能しません。PHPエラーはありませんが、パスはhttp://localhost/node/themes/template/image/icons/my-icon.pngであると間違って言われています。


「パスが間違っています」-それはあまり役に立ちません:)また、グローバルtmeplate_preprocess_hook関数ではなく、テーマのテーマファイルで前処理を行う必要があり、drupal_get_path( 'theme'、 'yourtheme')を使用する必要があります。

@ user21641 drupal_get_pathはD7用です:)
チャパブ

1
それも8人分の @Chapabu ...
クライブ

羽で私を吹き飛ばしてください!色を修正:)
チャパブ

D8でも同様です。私はそれをこのように使用しました:$themePath = Url::fromUserInput('/' . drupal_get_path('theme', '[themename]')
Vodde

回答:


51

{{ base_path ~ directory }}絶対的な問題を修正する前処理を使用する必要はありません。これらの変数は両方ともコアに含まれています。

例えば

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

PS。~Twig のヘルパーは連結されています。

編集:少なくともpage * .html.twigテンプレートにはbase_path変数が含まれています。他のテンプレートの前処理が必要になる場合があり{{ dump() }}、変数が存在するかどうかを簡単に確認できます

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

3
ソリューションを共有していただきありがとうございます。簡単なコメント:$ variables ['base_path'] = base_path();を明示的に追加する必要がありました。THEME_preprocess_htmlテーマフックに追加して、html.html.twigテンプレートファイルで使用できるようにします。
マルコスBuarque

1
{{ directory }}ベーステーマとして使用するテーマでTwig変数を使用し、次のサブテーマを作成する場合は注意してください。drupal.stackexchange.com
questions

1
小枝テンプレート提案モジュールが提供する{{ base_bath }}すべてのテンプレートに。それ以外の場合、一部のテンプレートについては、上記のコメントでMarcos Buarqueが行ったように、またはMatoeilがdrupal.stackexchange.com/a/238535/4195
mlncn

9

デフォルトでは{{ directory }}、テーマディレクトリを指す変数を使用できます。問題は、絶対的なものではなく、追加したものと同じです。基本パスを含める必要があるため、これはコアのバグだと思いますが、それを変更すると、もちろんそれを使用する既存のサイトが壊れます。

そのため、その前に/を追加する必要があります。Drupalがサブフォルダーにインストールされている場合、これは壊れます。テンプレートにハードコーディングするかbase_path()、7.xで行ったようにカスタム変数で使用し続けることができます。


から画像を使用するには/sites/default/files/MyFolder?MyFolderに画像MyImage.jpgがあります。さて、<img src={{ url }} alt={{ text }}>ここで書いた場合、Twig テンプレートでは、url変数のパスは/MyFolder/MyImage.jpgですが、機能していません。
ジャソディープチャタジー

2
Berdirが書いたように:<img src="/{{ directory }}/path/to/image"/>絶対パスを取得するために単に使用できます。
ダニエルズ

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

私のために働いたとき

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

しませんでした

コンテンツテンプレートの場合、.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'];

そして

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

3
この回答ではなく、正しいとしてマークされなければならない
Jigneshラワル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.