Twigテンプレート内からLinkフィールドの有効なURLを取得する方法は?


30

field_my_link(マシン名)という名前のリンクフィールドがあります。

Twigテンプレート内で、これでリンクのURL値を取得できます。

{{ node.field_my_link.uri }}

リンクのURL内に外部 URLがある場合、たとえば、http://example.comそれはうまく機能します。

しかし、リンクのURL 内に内部 URL が保存されている場合、たとえば"/node/11"、次のような値を取得します。

"internal:/node/11"

internal:」プレフィックスを使用します。

有効な URL を取得するにはどうすればよいですか?

たとえば、リンクのURLが " http://example.com"欲しいhttp://example.com場合 "(これは既に動作しています)、リンクのURLが" /node/11"相対URLが/node/11必要な場合" "、リンクのURLが" <front>"必要な場合はURL" /"など。


編集

これを使用して、PHPプリプロセス関数内で必要な値を取得できます。

$url = $variables['node']->get('field_my_link')->first()->getUrl();

Twigテンプレート内で同じ値にアクセスするにはどうすればよいですか?

プリプロセス関数内でこれを行うことができることを知っています:

$variables['my_url'] = $url;

次に、を使用してTwig内のURLにアクセスします{{ my_url }}が、リンクフィールドがあるたびに前処理関数を記述することは避けます。

回答:


38

最新の編集からのPHPは、次のような小枝に変換されます。

{{ node.field_my_link.0.url }}

これは次のように機能し0、フィールドアイテムリストの最初のアイテムを返し、urlurlオブジェクトを取得します。twigはこのオブジェクトを文字列としてキャストするため、マジックメソッドtoString()を呼び出し、文字列値としてURLを出力します。

使用する必要があるのは、その名前のプロパティがない場合url、twigがメソッドを自動的に検索するためです。getxyz()xyz


ありがとうございました。次に、この関数を使用してテストを行います。この関数をリンクのURIでも使用できるかどうか知っていますか?node.field_my_link.uri外部URLが次のような場合はどうなりhttp://www.example.comますか?
アンドレア

1
私は試したfile_url(node.field_my_link.uri)し、あればnode.field_my_link.uriある"http://www.example.com"、それは動作します(それがそのままURLを離れる)が、あればnode.field_my_link.uriある"internal:/"関数が返す"/internal%3A/"(代わりに"/")..
アンドレア・

私はちょうどあなたの編集を見ました..残念ながら動作しません。コードnode.field_my_link.entity.uri.valueはnull値を返します。他のアイデアはありますか?
アンドレア

@Andrea、答えを編集しました。
4k4

1
ええ、うまくいきます。構文は少し怖いですが、その仕事をします。
アンドレア

17

あなたの場合、レンダー配列要素に直接アクセスできます:

{{ node.field_my_link[0]['#url'] }}

これは私のために働いた。
esQmo_

10

外部と内部URLの両方のケースをカバーする必要があります。

まず、URLが外部にあるかどうかを確認し、そのを単に印刷し*.uriます。

それはだそうであれば内部我々は、Drupalの者を通じてそのルート名とパラメータを配線する必要がありpath($name, $parameters, $options)機能。

{% if node.field_link.0.url.external %}
  <a href="{{ node.field_link.uri }}">
    {{ node.field_link.title }}
  </a>
{% else %}
  <a href="{{ path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) }}">
    {{ node.field_link.title }}
  </a>
{% endif %}

2
ありがとう、これはまさに私が必要としたものです:URLをリンクフィールドから文字列として取得します:{% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}カスタムリンクを作成できます: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>前処理は不要で、content.field_linkを経由する必要がないため、何もする必要はありませんURLを取得するためのリンクフィールドの「表示の管理」
user33560

8

ブロック内のリンクフィールドでこれを行う必要がありました。これはうまくいきました:

{{ content.field_my_link[0]['#url']|render }}

4
また、twigテンプレートのようにrender{{ content.field_my_link[0]['#url'] }}なしで使用しても問題ありませ。レンダー配列は印刷時に自動的にレンダリングされます。
eric.chenchao

5

私はそれが古い投稿であることを知っていますが、Drupal 8(8.6)の最後のバージョンでは、両方のバージョン(外部​​および内部)のURLを直接表示できます:

node.field_link.0.url

そして、リンクが外部であるかどうかを知る必要がある場合(私の場合はターゲット用でした)、それを使用できます:

node.field_link.0.url.external

例:

<a href="{{ node.field_link.0.url }}" title="Title" target="{{ node.field_link.0.url.external ? '_blank' : '_self' }}"

1

また、次のようなものを使用することもできますが、すべては抽出するオブジェクトのタイプとフィールド名に依存します。私の場合は、field_linkというフィールドを持つ段落であり、次のように機能しました:

{{ paragraph.field_link.get(0).getUrl().toString() }}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.