web-dev-qa-db-ja.com

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

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)と言われています =。

24
Stephan Hofmann

絶対的な問題を修正する{{ 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();
}
54
pjcarly

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

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

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