วิธีรับ 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 " /" ฯลฯ .


แก้ไข

ฉันสามารถรับค่าที่ฉันต้องการภายในฟังก์ชั่น preprocess PHP โดยใช้สิ่งนี้:

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

ฉันจะเข้าถึงค่าเดียวกันภายในแม่แบบ Twig ได้อย่างไร

ฉันรู้ว่าฉันสามารถทำได้ภายในฟังก์ชัน preprocess:

$variables['my_url'] = $url;

จากนั้นเข้าถึง url ภายใน Twig โดยใช้{{ my_url }}แต่ฉันจะหลีกเลี่ยงการเขียนฟังก์ชั่น preprocess ทุกครั้งที่ฉันมีลิงค์ฟิลด์

คำตอบ:


38

PHP จากการแก้ไขล่าสุดของคุณจะแปลเป็นทวิกแบบนี้:

{{ node.field_my_link.0.url }}

สิ่งนี้ใช้ได้ผลเช่นนี้0คืนค่าไอเท็มแรกของรายการไอเท็มฟิลด์urlรับวัตถุ url และเนื่องจากกิ่งไม้จะโยนวัตถุนี้เป็นสตริงซึ่งจะเรียกเมธอดเวทมนต์ toString () และจะส่งออก url เป็นค่าสตริง

คุณจำเป็นต้องใช้urlเนื่องจากทวิกจะค้นหาเมธอดโดยอัตโนมัติgetxyz()หากไม่มีคุณสมบัติที่มีชื่อxyzนั้น


ขอขอบคุณ. ตอนนี้ฉันทำการทดสอบด้วยฟังก์ชันนี้ คุณรู้หรือไม่ว่าฉันสามารถใช้ฟังก์ชั่นนี้กับลิงค์ของ URIs ได้หรือไม่ จะเกิดอะไรขึ้นถ้าnode.field_my_link.uriเป็น URL ภายนอกเช่นhttp://www.example.com?
Andrea

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

@Andrea ฉันแก้ไขคำตอบของฉัน
4k4

1
ใช่มันใช้งานได้ ไวยากรณ์ค่อนข้างน่ากลัว แต่ก็สามารถทำงานได้
Andrea

17

คุณสามารถเข้าถึงองค์ประกอบอาร์เรย์แสดงผลได้โดยตรงในกรณีของคุณ:

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

อันนี้ใช้ได้กับฉัน
esQmo_

10

คุณต้องครอบคลุมทั้งสองกรณี: URL ภายนอกและภายใน

ก่อนอื่นมาตรวจสอบว่า URL นั้นอยู่ภายนอกหรือไม่และพิมพ์ออก*.uriมา

มิฉะนั้นถ้าเป็นเรื่องภายในเราจะต้องโยงชื่อเส้นทางและพารามิเตอร์ผ่านpath($name, $parameters, $options)ฟังก์ชันของ 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
ขอบคุณนี่คือสิ่งที่ฉันต้องการ: รับ 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
นอกจากนี้ยังสามารถใช้งานได้{{ 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.