ฉันจะหาเส้นทางพื้นฐานได้อย่างไร


16

ฉันต้องการใช้พา ธ ฐานในไฟล์เท็มเพลต Drupal 8 ฉันลองสิ่งต่อไปนี้ แต่ฉันไม่ได้ผลลัพธ์ที่ถูกต้อง

{{ app.request.baseUrl  }}

{{base_path}}

{{ app.request.baseUrl }}/{{ url }}สิ่งที่ฉันต้องการก็คือเส้นทางสัมบูรณ์ไปยังโหนด

ทางออกหนึ่งที่ฉันพบคือการวางโค้ดนี้ลงในเบ็ดการประมวลผลล่วงหน้าและส่งผ่านไปยังธีม

 $host = \Drupal::request()->getHost(); 
$response = \Drupal::httpClient()

ฉันกำลังมองหาทางออกที่ดีกว่า ฉันควรใช้อะไรแทนที่จะใช้ที่ฉันกำลังใช้

คำตอบ:


28

คุณสามารถใช้url()เพื่อสร้าง URL พื้นฐานไปยังเส้นทางใดก็ได้ใน Drupal คุณสามารถระบุ<front>เส้นทางที่จะใช้เป็นฐานหลักของคุณ

{{ url('<front>') }}

แต่ให้แสดงก่อนถ้าคุณต่อกัน:

{{ url('<front>')|render ~ file_url('public://image.jpg') }}

ตัวอย่างเช่น:

{{ url('<front>') ~ file_url('public://image.jpg') }}
# Outputs: "Array/sites/all/default/files/image.jpg"

{{ url('<front>')|render ~ file_url('public://image.jpg') }}
# Outputs: "http://example.com/sites/all/default/files/image.jpg"

1
และถ้าฉันต้องการได้รับเส้นทางแน่นอนโหนด?
Yusef

2
ในบริบทของโหนดpath()ฟังก์ชันสามารถใช้เพื่อดึงเส้นทางของโหนด:{{ path('entity.node.canonical', {'node': node.id}) }}
Shawn Conn

12

คุณแทบไม่ต้องสร้างเส้นทางจากส่วนต่างๆใน Drupal 8 อย่างชัดเจนฉันจะไปกับสิ่งนี้:

function FOO_preprocess_node(&$variables) {
  /** @var \Drupal\node\NodeInterface $node */
  $node = $variables['node'];
  $variables['url'] = $node->toUrl('canonical', [
    'absolute' => TRUE,
    'language' => $node->language(),
  ])->toString();
}

pologize ฉันเพื่อแก้ไขคำตอบของคุณ แต่ url ตอนนี้เป็นวัตถุเราควรแปลงเป็นสตริง
Yusef

2
ไม่คุณไม่จำเป็นต้องทำเช่นนั้นเท็มเพลตสามารถจัดการ url object ได้มันเป็นสิ่งที่ดีสำหรับโมดูลอื่น ๆ ที่จะเก็บรักษาออบเจกต์เอาไว้เพื่อให้ทุกคนสามารถเปลี่ยนแปลงได้ในทุกขั้นตอนก่อนที่มันจะถูกแสดงใน twig
4k4

@ 4k4 แต่ฉันพยายามโดยไม่มีtoStringแต่สังเกตรายการจากนั้นฉันลอง kint (url) และเห็นว่ามันเป็นวัตถุ
Yusef

ฉันเห็นด้วยกับ @ 4k4 ว่าไม่ควรแปลงเป็นสตริงและปล่อยให้เป็นวัตถุเพื่อให้วิธีการ / ฟังก์ชั่นอื่น ๆ ที่ใช้งานนั้นไม่ได้รับผลกระทบ
Vishal Kumar Sahu

10

ในpage.html.twigคุณจะมี{{ base_path }}ตัวแปรทำงาน ทำไมเทมเพลตจึงไม่สามารถใช้ได้ในทุก ๆ อย่างที่ฉันคิดว่ามันควรจะเป็นและทุกสิ่งทุกอย่างดูยุ่งเหยิงโซลูชันที่ฉันต้องการคือทำแบบเดียวกับที่ Drupal ทำในหน้าที่ประมวลผลหน้าสำหรับสถานที่ใด ๆ ที่ฉันต้องการ

ในการทำให้{{ base_path }}บล็อกเท็มเพลตพร้อมใช้งานในตัวอย่างชื่อธีมให้เพิ่มโค้ดนี้ในexample.themeไฟล์:

/**
 * Implements hook_preprocess_block().
 */
function example_preprocess_block(&$variables) {

  $variables['base_path'] = base_path();
}

ดังที่ระบุไว้ในคำตอบที่ได้รับการยอมรับจาก MPD หากได้รับ URL ของโหนดหรือเอนทิตีอื่น ๆ มีวิธีที่จะทำเพื่อคุณทั้งหมด

อย่างไรก็ตามมีเหตุผลในการรับ base_path เช่นเมื่อแสดงภาพที่อยู่ในโฟลเดอร์ชุดรูปแบบของคุณ {{ directory }}จัดเตรียมพา ธ ไปยังโฟลเดอร์ธีม แต่มันจะปิดพา ธ พื้นฐาน (โดยปกติจะเป็นเพียง / แต่เพื่อรักษาการทำงานที่เหมาะสมของ Drupal จากไดเรกทอรีย่อยของโดเมนที่ไม่ควรฮาร์ดโค้ด) ในpage.html.twigหรือในแม่แบบใด ๆ ที่มี preprocesser ข้างต้นนี้จะทำงานเพื่อวัตถุประสงค์:

<img src="{{ base_path ~ directory }}/images/nsf1.svg"
     alt="National Science Foundation logo" height="80" width="80" />

และแน่นอนว่าคำตอบของ Shawn Conn นั้นใช้ได้ผลดีถ้าคุณสามารถระงับความต้องการเทมเพลตสวย ๆ ได้ แต่ฉันทำไม่ได้


3

และจากการอ้างอิงเอกสารในหน้า 8.2.xมีการเพิ่มตัวแปรส่วนกลางสองตัวเพื่อส่งกลับหน้าแรกและ URL เส้นทางหลัก:

front_page: URL ของหน้าแรก ใช้สิ่งนี้แทน base_path เมื่อเชื่อมโยงไปยังหน้าแรก ซึ่งรวมถึงโดเมนภาษาหรือคำนำหน้า

base_path: พา ธ URL พื้นฐานของการติดตั้ง Drupal โดยปกติจะเป็น "/" เว้นแต่ว่าคุณได้ติดตั้ง Drupal ในไดเรกทอรีย่อย

ดังนั้นคุณจะได้รับ Url หน้าแบบอักษรด้วยfront_pageและ URL พื้นฐานด้วยbase_url

บันทึก

รับ url หน้าแรกด้วย {{ url('<front>') }}มีปัญหาเมื่อคุณต้องการเชื่อมต่อกับเส้นทางอื่น ๆ เช่น

{%  set base_url = url('<front>')  %}
{% set url = [ base_url,'/landing-page?invitecode=' ,invite_code] | join  %}
{{ url }}

กลับ

Array/landing-page?invitecode= 

ค่าเริ่มต้นนี้หมายถึงไม่ใช่ข้อความและส่งคืนอาเรย์ที่สามารถแสดงผลเป็นทวิ


2

ใน

function hook_preprocess(&$variables) {
  $variables['base_path'] = base_path();
}

& ในไฟล์เทมเพลตที่คุณสามารถโทรผ่านได้

{{ base_path ~ directory }}

2

จนถึงหัวข้อนี้ไม่ได้นำวิธีแก้ปัญหาที่เหมาะสม เราสามารถต่อกันโดยใช้ render_val ()

นี่คือวิธีที่ฉันใช้เพื่อรับเส้นทางที่แน่นอนของอิมเมจเอนทิตี:

{% set base_url = render_var(url('<front>'))  %}
{% set url = base_url|trim('/', 'right')~file_url(content.field_media[0]['#media'].get('field_image').entity.uri.value)  %}

อันดับแรกเราได้รับ URL พื้นฐานของเว็บไซต์ จากนั้นเราต้องลบส่วนเพิ่มเติม / จากนั้นเราเชื่อมต่อพา ธ ฐานของเรากับพา ธ รูปภาพสัมพัทธ์ของเรา


2

ทั้งหมดที่ล้มเหลวดังกล่าวข้างต้นสำหรับผมเพราะผมมีการติดตั้งทางภาษาเพื่อให้รูปลักษณ์ URL https://example.com/enหน้าของฉันเหมือน

ฉันลงเอยด้วยการใช้รหัสนี้เพื่อรับ URL ฐานจริงสำหรับเว็บไซต์ของฉัน:

{% set base_url = url('<front>')|render|split('/', -1)|join('/') %}

1
{{ path('<front>') }}

ฉันรู้ว่าคุณได้ทำเครื่องหมายสิ่งนี้ถูกต้องแล้ว แต่สามารถใช้เป็นองค์ประกอบกิ่งในไฟล์เทมเพลตได้โดยไม่ต้องทำงานพิเศษใด ๆ ฉันพบสิ่งนี้ในบล็อก - system-branding-block.html.twig จากธีม Classy ดังนั้นคุณสามารถใช้สิ่งนี้:

<a href="{{ path('<front>') }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.