Làm cách nào để lấy URL hợp lệ của trường Liên kết từ trong mẫu Twig?


30

Tôi có một trường Liên kết có tên field_my_link(tên máy).

Trong mẫu Twig tôi có thể nhận giá trị URL của liên kết với điều này:

{{ node.field_my_link.uri }}

Nếu bên trong URL của Liên kết có một URL bên ngoài , ví dụ: URL http://example.comhoạt động tốt.

Nhưng, nếu bên trong URL của Liên kết có một URL nội bộ , ví dụ: "/node/11"tôi nhận được một giá trị như thế này:

"internal:/node/11"

với internal:tiền tố "".

Làm cách nào tôi có thể nhận được URL hợp lệ ?

Ví dụ: nếu URL của liên kết là " http://example.com" Tôi muốn " http://example.com" (điều này đã hoạt động), nếu URL của liên kết là " /node/11" Tôi muốn URL tương đối " /node/11", nếu URL của liên kết là " <front>" Tôi muốn URL " /", v.v. .


CHỈNH SỬA

Tôi có thể nhận được giá trị tôi muốn trong hàm tiền xử lý PHP, bằng cách sử dụng:

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

Làm cách nào tôi có thể truy cập cùng một giá trị trong mẫu Twig?

Tôi biết tôi có thể làm điều này trong chức năng tiền xử lý:

$variables['my_url'] = $url;

Sau đó truy cập url trong Twig bằng cách sử dụng {{ my_url }}, nhưng tôi sẽ tránh viết hàm tiền xử lý mỗi khi tôi có trường liên kết.

Câu trả lời:


38

PHP của bạn từ bản chỉnh sửa mới nhất của bạn sẽ chuyển thành twig như thế này:

{{ node.field_my_link.0.url }}

Điều này hoạt động như thế này, 0trả về mục đầu tiên của danh sách mục trường, urllấy đối tượng url và vì twig sẽ truyền đối tượng này dưới dạng chuỗi nên sẽ gọi phương thức ma thuật làStString () và sẽ xuất url dưới dạng giá trị chuỗi.

Bạn chỉ cần sử dụng url, vì twig sẽ tự động tìm phương thức getxyz()nếu không có thuộc tính có tên đó xyz.


Cảm ơn bạn. Bây giờ tôi làm một bài kiểm tra với chức năng này. Bạn có biết nếu tôi cũng có thể sử dụng chức năng này trên các URI của liên kết không? Điều gì xảy ra nếu node.field_my_link.urimột url bên ngoài như thế http://www.example.comnào?
Andrea

1
Tôi đã thử với file_url(node.field_my_link.uri), và nếu node.field_my_link.uri"http://www.example.com"nó hoạt động (nó để lại địa chỉ không thay đổi), nhưng nếu node.field_my_link.uri"internal:/"trở về chức năng "/internal%3A/"(thay vì "/") ..
Andrea

Tôi vừa thấy chỉnh sửa của bạn .. Đáng buồn là nó không hoạt động, mã node.field_my_link.entity.uri.valuetrả về giá trị null .. Còn ý tưởng nào khác không?
Andrea

@Andrea, tôi chỉnh sửa câu trả lời của tôi.
4k4

1
Vâng, nó hoạt động. Cú pháp hơi đáng sợ, nhưng nó thực hiện công việc của nó.
Andrea

17

Bạn có thể truy cập phần tử kết xuất trực tiếp, trong trường hợp của bạn:

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

Cái này làm việc cho tôi.
esQmo_

10

Bạn phải bao gồm cả hai trường hợp: URL bên ngoài và bên trong.

Trước tiên, hãy kiểm tra xem URL có bên ngoài không và chỉ cần in nó *.uri.

Khác nếu nó là nội bộ, chúng ta phải nối tên và thông số tuyến đường của nó thông qua path($name, $parameters, $options)chức năng của Drupal .

{% 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
Cảm ơn bạn, đây chính xác là những gì tôi cần: lấy url từ trường liên kết dưới dạng chuỗi: {% set url = path(node.field_link.0.url.routeName, node.field_link.0.url.routeParameters) %}Sau đó tôi có thể tạo liên kết tùy chỉnh: ` <a href="{{ url }}" class="mycustomclass">custom link text</a>Không cần tiền xử lý và không cần thông qua content.field_link, vì vậy không cần phải làm gì trong 'Quản lý hiển thị' cho trường liên kết chỉ để lấy url.
dùng33560

8

Tôi đã phải làm điều này trên Trường Liên kết trong một Khối. Điều này làm việc tốt:

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

4
Nó cũng tốt để sử dụng {{ content.field_my_link[0]['#url'] }}mà không cần kết xuất , như trong mẫu twig, mảng kết xuất được tự động kết xuất khi được in.
eric.chenchao

5

Tôi biết đó là một bài viết cũ nhưng với phiên bản cuối cùng của Drupal 8 (8.6), bạn có thể trực tiếp hiển thị url cho cả hai phiên bản (bên ngoài và bên trong):

node.field_link.0.url

Và nếu bạn cần biết liên kết có bên ngoài hay không (đối với trường hợp của tôi là dành cho mục tiêu), bạn có thể sử dụng liên kết đó:

node.field_link.0.url.external

Thí dụ:

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

1

bạn cũng có thể sử dụng một cái gì đó như sau, tất cả phụ thuộc vào loại đối tượng bạn đang trích xuất và tên trường, Trong trường hợp của tôi, đó là một đoạn văn với một trường có tên là field_link và sau đây đã hoạt động:

{{ paragraph.field_link.get(0).getUrl().toString() }}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.