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


16

Drupal 8テンプレートファイルでベースパスを使用したい。以下を試しましたが、正しい結果が得られません。

{{ app.request.baseUrl  }}

{{base_path}}

必要なのは、ノードへの絶対パス{{ app.request.baseUrl }}/{{ url }}です。

私が見つけた解決策の1つは、このコードを前処理フックに入れて、それをテーマに渡すことです。

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

より良い解決策を探しています。私が使用しているものの代わりに何を使用する必要がありますか?

回答:


28

url()Drupalの任意のルートへのベースURLを生成するために使用できます。<front>実際にベースURLとなるルートを指定できます。

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

ただし、連結する場合は最初にレンダリングします。

{{ 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"

1
そして、ノードの絶対パスを取得したいのですか?
ユセフ

2
ノードの文脈では、path()関数はノードの経路を取得するために適用することができる:{{ path('entity.node.canonical', {'node': node.id}) }}
ショーンコネチカット

12

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();
}

あなたの答えを編集するために私に謝罪しますが、URLはオブジェクトになりました。文字列に変換する必要があります。
ユセフ

2
いいえ、テンプレートを使用してURLオブジェクトを処理できます。他のモジュールがオブジェクトを保持しておくと、最終的に小枝でレンダリングされる前に、誰でも任意の段階で変更できます。
4k4

@ 4k4がtoString、ショーに注意せずに試しましたが、kint (url)を試してみましたが、オブジェクトであることがわかりました。
ユセフ

@ 4k4を文字列に変換してオブジェクトとして残してはならないので、それを使用する他のメソッド/関数が影響を受けないことに同意します。
ヴィシャールクマールサフ

10

ではpage.html.twig、あなたなりの作業持っている{{ base_path }}変数を。なぜすべてのテンプレートで利用できないのか、私にはわかりません。私はそれがあるべきだと思うし、他のすべてが面倒に見えるので、私の好ましい解決策は、必要な場所のDrupalがプリプロセスページ機能で行うように正確に行うことです。

ようにするには{{ 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または上記preprocesserを持つ任意のテンプレートで、これはその目的のために動作します:

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

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


3

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

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

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

そのため、フォントページUrlを取得しfront_page、ベースUrlを取得できますbase_url

注意

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

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

帰る

Array/landing-page?invitecode= 

これはデフォルトではテキストではないことを意味し、レンダリング可能な配列をtwigに返します


2

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

&テンプレートファイルuで呼び出すことができます

{{ base_path ~ directory }}

2

これまでのところ、このスレッドは適切な解決策をもたらしません。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

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

最終的にこのコードを使用して、サイトの実際のベースURLを取得しました。

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

1
{{ path('<front>') }}

これを既に正しいとマークしていることは知っていますが、これはテンプレートファイルの小枝要素として追加の作業なしで使用できます。これは、Classyテーマのsystem-branding-block.html.twigブロックで見つかりました。したがって、次のように使用できます。

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.