web-dev-qa-db-ja.com

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

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

Twigテンプレート内で、次のようにしてリンクのURL値を取得できます。

{{ node.field_my_link.uri }}

リンクのURL内にexternalURLがある場合、たとえばhttp://example.comうまくいきます。

ただし、リンクのURL内にinternalURLが格納されている場合、たとえば"/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を使用して{{ my_url }}を使用してURLにアクセスしますが、リンクフィールドがあるたびに前処理関数を作成することは避けます。

34
Andrea

あなたのPHPは、twigのようになります:

_{{ node.field_my_link.0.url }}
_

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

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

42
4k4

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

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

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

まず、URLがexternalであるかどうかを確認し、その_*.uri_を出力します。

それ以外の場合internalDrupalの 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 %}
_
13
leymannx

ブロックのリンクフィールドでこれを行わなければなりませんでした。これはうまくいきました:

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

私はそれが古い投稿であることを知っていますが、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' }}"
6
AnTSaSk

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

{{ paragraph.field_link.get(0).getUrl().toString() }}
3
Israel Morales

段落で、リンクURLとリンク名を取得するには-

<a href="{{ content.FIELD_LINK_NAME[0]['#url']|render }}">
   {{ content.FIELD_LINK_NAME[0]['#title']|render }}
</a>
1
Wasim Khan

知っているそれは恐ろしいことですが、他に何もうまくいかない場合:

{{ link|replace({'internal:':''}) }}

私の状況:オーバーライドされたビューテンプレートを介してリンクフィールドにアクセス:views-view-fields.html.twig

私は変数を以下から取得する必要がありました:

row._entity.field_machine_name.value.0.uri

(私はfields変数の使用をやめました。一見それから。contentプロパティを取得できますが、それ以外はそれほど多くありません)

….field_machine_name.valueはフラット配列であり、uriキーのみがあり、urlはありません。他の回答(toString()、renderなど)で言及されているフィルターは、ここでは機能しないようです。

0
William Turrell