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にアクセスしますが、リンクフィールドがあるたびに前処理関数を作成することは避けます。
あなたのPHPは、twigのようになります:
_{{ node.field_my_link.0.url }}
_
これはこのように機能し、_0
_はフィールドアイテムリストの最初のアイテムを返します。url
はurlオブジェクトを取得します。twigはこのオブジェクトを文字列thisとしてキャストするため、魔法のメソッドtoString()を呼び出し、URLを文字列値として出力します。
twigは、その名前url
のプロパティがない場合、メソッドgetxyz()
を自動的に検索するため、xyz
のみを使用する必要があります。
あなたの場合、あなたはレンダー配列要素に直接アクセスできます:
{{ node.field_my_link[0]['#url'] }}
外部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 %}
_
ブロックのリンクフィールドでこれを行わなければなりませんでした。これはうまくいきました:
{{ content.field_my_link[0]['#url']|render }}
私はそれが古い投稿であることを知っていますが、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' }}"
次のようなものを使用することもできます。それはすべて、抽出するオブジェクトのタイプとフィールド名に依存します。私の場合、それはfield_linkという名前のフィールドを持つ段落であり、以下が機能しました:
{{ paragraph.field_link.get(0).getUrl().toString() }}
段落で、リンクURLとリンク名を取得するには-
<a href="{{ content.FIELD_LINK_NAME[0]['#url']|render }}">
{{ content.FIELD_LINK_NAME[0]['#title']|render }}
</a>
私知っているそれは恐ろしいことですが、他に何もうまくいかない場合:
{{ 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など)で言及されているフィルターは、ここでは機能しないようです。