web-dev-qa-db-ja.com

基本パスを取得するにはどうすればよいですか?

Drupal 8テンプレートファイルでベースパスを使用したい。次の方法を試したが、正しい結果が得られない。

{{ app.request.baseUrl  }}

{{base_path}}

私が必要なのはノードへの絶対パス{{ app.request.baseUrl }}/{{ url }}

私が見つけた1つの解決策は、このコードをプリプロセスフックに入れて、テーマに渡すことです。

 $Host = \Drupal::request()->getHost(); 
$response = \Drupal::httpClient()

より良い解決策を探しています。使用しているものの代わりに何を使用すればよいですか?

17
Yusef

そして 8.2.xのページドキュメント によれば、フロントページとベースパスURLを返すために2つのグローバル変数が追加されました:

front_page:フロントページのURL。フロントページにリンクするときは、base_pathの代わりにこれを使用してください。これには、言語ドメインまたはプレフィックスが含まれます。

base_path:DrupalインストールのベースURLパス。Drupalをサブディレクトリにインストールしていない限り、通常は「/」になります。

So_front_page_でフォントページのURLを取得し、_base_url_でベースURLを取得できます

例として、{{ url('<front>') }}を使用してフロントページのURLを取得すると、他のパスと連結したい場合に問題が発生します

_{%  set base_url = url('<front>')  %}
{% set url = [ base_url,'/landing-page?invitecode=' ,invite_code] | join  %}
{{ url }}
_

帰る

_Array/landing-page?invitecode= 
_

これは、デフォルトではテキストではなく、レンダリング可能な配列を小枝に返します

3
Yusef

url()を使用して、Drupalの任意のルートへのベースURLを生成できます。 <front>ルートは、実際にはベースURLになります。

{{ url('<front>') }}

ただし、render連結する場合は、最初に次のようにします。

{{ url('<front>')|render ~ file_url('public://image.jpg') }}

例えば:

{{ url('<front>') ~ file_url('public://image.jpg') }}
# Outputs: "Array/sites/all/default/files/image.jpg"

{{ url('<front>')|render ~ file_url('public://image.jpg') }}
# Outputs: "http://example.com/sites/all/default/files/image.jpg"
28
Shawn Conn

Drupal 8)のパーツからパスを明示的に構築する必要はほとんどありません。次のようなものを使用します。

function FOO_preprocess_node(&$variables) {
  /** @var \Drupal\node\NodeInterface $node */
  $node = $variables['node'];
  $variables['url'] = $node->toUrl('canonical', [
    'absolute' => TRUE,
    'language' => $node->language(),
  ])->toString();
}
12
mpdonadio

page.html.twigにはwillが機能する{{ base_path }}変数があります。すべてのテンプレートで使用できない理由、私にはわかりません。私はそれがあるべきだと思うし、他はすべて散らかっているように見えるので、私の優先する解決策は、Drupalが必要な場所のプリプロセスページ関数で行うように正確に行うことです。

Exampleというテーマのブロックテンプレートで{{ base_path }}を使用できるようにするには、次のコードをexample.themeファイルに追加します。

/**
 * Implements hook_preprocess_block().
 */
function example_preprocess_block(&$variables) {

  $variables['base_path'] = base_path();
}

MPDが提供する承認済みの回答に記載されているように、ノードまたは他のエンティティのURLを取得する場合、それをすべて行う方法があります。

ただし、テーマフォルダーにある画像を表示する場合など、base_pathを取得する理由があります。 {{ directory }}は、テーマフォルダーへのパスを提供しますが、ベースパスは省略します(通常は/ですが、ハードコードされるべきではないドメインのサブディレクトリからのDrupalの適切な機能を維持するためです)。 page.html.twigまたは上記のプリプロセッサを含むテンプレートでは、これはその目的で機能します。

<img src="{{ base_path ~ directory }}/images/nsf1.svg"
     alt="National Science Foundation logo" height="80" width="80" />

そしてもちろん、Shawn Connの答えは、きれいなテンプレートへの欲求を抑えることができればうまくいきますが、できませんでした。

10
mlncn

function hook_preprocess(&$variables) {
  $variables['base_path'] = base_path();
}

&テンプレートファイルでは、次を介して呼び出すことができます

{{ base_path ~ directory }}
2
Julia

これまでのところ、このスレッドは適切な解決策をもたらしません。 render_val()を使用して連結できます

エンティティイメージの絶対パスを取得するための使用方法は次のとおりです。

{% set base_url = render_var(url('<front>'))  %}
{% set url = base_url|trim('/', 'right')~file_url(content.field_media[0]['#media'].get('field_image').entity.uri.value)  %}

まず、サイトのベースURLを取得します。次に、余分な/を削除する必要があります。次に、ベースパスと画像の相対パスを連結します。

2

言語パスが設定されているため、上記のすべてが失敗しました。フロントページのURLはhttps://example.com/enのようになります。

私はこのコードを使用して自分のサイトの実際のベースURLを取得することになりました。

{% set base_url = url('<front>')|render|split('/', -1)|join('/') %}
2
weseze
{{ path('<front>') }}

これを正しいものとしてマークしていることは承知していますが、これは余分な作業をせずに、テンプレートファイルのtwig要素として使用できます。これをブロックで見つけました--system-branding- Classyテーマのblock.html.twigなので、次のように使用できます。

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
1
owenpm3