it-swarm-vi.com

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 mẫu?

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

Trong mẫu Twig mẫu 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ó URL bên ngoài , ví dụ: http://example.com nó hoạt động tốt.

Nhưng, nếu bên trong URL của Liên kết được lưu trữ 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ếp đầu ngữ.

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ân vân.


CHỈNH SỬA

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

$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.

34
Andrea

PHP từ lầ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, 0 Trả về mục đầu tiên của danh sách mục trường, url lấy đối tượng url và vì twig sẽ tạo đối tượng này dưới dạng chuỗi điều này sẽ gọi phương thức ma thuật là toString () và sẽ xuất url dưới dạng giá trị chuỗi.

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

42
4k4

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'] }}
19
Tim

Bạn phải bao gồm cả hai trường hợp: URL bên ngoài và URL 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 *.uri.

Khác nếu nó nội bộ chúng ta phải nối tên và tham số tuyến đường của nó thông qua chức năng path($name, $parameters, $options) 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 %}
13
leymannx

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 }}
9
cbovard

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' }}"
6
AnTSaSk

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() }}
3
Israel Morales

Trong đoạn văn, để lấy url liên kết và tên liên kết -

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

Tôi biết thật kinh khủng, nhưng nếu không có gì khác hoạt động:

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

Tình huống của tôi: truy cập vào trường Liên kết thông qua mẫu chế độ xem bị ghi đè: views-view-fields.html.twig

Tôi đã phải lấy biến từ:

row._entity.field_machine_name.value.0.uri

(Tôi đã từ bỏ việc cố gắng sử dụng biến fields, bạn dường như có thể lấy một thuộc tính . Nội dung trong số đó, nhưng không nhiều )

, .field_machine_name.value chỉ là một mảng phẳng, chỉ có một phím uri, KHÔNG url, và các bộ lọc được đề cập trong các câu trả lời khác (toString (), kết xuất, v.v.) dường như không hoạt động ở đây.

0
William Turrell