รวมเทมเพลตบางส่วน


19

ฉันพยายามใช้ Drupal 8 ด้วยธีมที่กำหนดเองเนื่องจากความแตกต่างของโครงสร้างขนาดใหญ่สำหรับความต้องการของฉันฉันมีหน้า - front.twig.html และ page.twig.html ฉันต้องการสร้างชิ้นส่วนเทมเพลตที่ใช้ใน phrozn oder ในโครงการ Symfony2 ปกติเช่น footer.html.twig และ header.html.twig แม่แบบเหล่านี้จะถูกบันทึกไว้ในไดเรกทอรีย่อย / ชิ้นส่วน /

แต่เมื่อฉันเรียกแม่แบบนี้ตามปกติฉันเพิ่งได้รับสตริงที่มีชื่อของแม่แบบ

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

{# in page.html.twig or page--front.html.twig #}
{% include 'parts/footer.html.twig' %} 

ส่งคืนชื่อไฟล์เป็นสตริง:

parts/footer.html.twig

เป็นไปได้ที่จะทำเช่นนั้นกับ Drupal 8?

คำตอบ:


33

คุณไม่สามารถทำเส้นทางญาติทุกเส้นทางทั้งจะต้องมาจากราก Drupal หรือขึ้นอยู่กับเส้นทาง namespaced ไปยังไดเรกทอรีของคุณ 'แม่': https://www.drupal.org/node/2143557

ฉันจะหลีกเลี่ยง "จากราก Drupal" และใช้เนมสเปซอย่างน้อยก็จนกว่าhttps://www.drupal.org/node/2291449จะได้รับการแก้ไข

{% include '@mytheme/parts/footer.html.twig' %}

แก้ไข: หากคุณต้องการส่งอาร์กิวเมนต์เพิ่มเติมสำหรับลูปหรือตรวจสอบ vars บางส่วนไปยังtwigเทมเพลตที่รวมไว้คุณควรเขียนด้วยวิธีนี้:

{% include '@mytheme/includes/form-block.html.twig' with {dog: true} %}

แก้ไข: ตอนนี้https://www.drupal.org/node/2291449ได้รับการยอมรับแล้วคุณสามารถทำได้:

{% include 'footer.html.twig' %}

ดูhttps://www.drupal.org/node/2369981สำหรับสาเหตุที่คุณเห็นชื่อไฟล์เป็นสตริงแทนที่จะเป็นข้อยกเว้นที่มีประโยชน์


สิ่งที่เกี่ยวกับincludeและผ่านค่า สมมติว่าฉันต้องการรวมimage-formatterและส่งurlค่า null เพื่อหลีกเลี่ยงการสร้างรูปภาพที่เชื่อมโยง
SaidbakR

ตัวอย่างที่ให้ไว้ในคำตอบนี้ดูเหมือนจะไม่ทำงาน
arnoldbird

3
โปรดทราบว่า@mythemeหายไปเส้นทางของmytheme+ /templatesสตริง ในคำอื่น ๆ@mythemeแก้ไขไปที่mytheme/templatesไดเรกทอรี
แดเนียลส์

เพื่อชี้แจงความคิดเห็นเพิ่มเติมจาก @daniels ถ้าหากธีมของคุณเองเป็นชื่อmythemeและมันจะอยู่ที่'ธีม / กำหนดเอง / mytheme'แล้วทวิ namespace @mythemeหายไป'ธีม / กำหนดเอง / mytheme / แม่' การรวมเทมเพลตที่@mytheme/fragments/footer.html.twigหมายถึงมันจะแก้ไข'ชุดรูปแบบ / กำหนดเอง / mytheme / แม่แบบ / แฟรกเมนต์ / footer.html.twig'
ec0g

15

ใช้พา ธ แบบเต็มไปยังไดเร็กทอรีธีม ถ้าคุณใช้เนมสเปซคุณจะต้องเปลี่ยนมันถ้าคุณนำรหัสไปยังไซต์หรือธีมอื่น

สิ่งนี้น่าจะใช้ได้:

{% include directory ~ '/templates/parts/footer.html.twig' %}

สิ่งนี้มีประโยชน์มากเมื่อทำการสร้างธีมย่อย ตั้งค่านี้ในธีมผู้ปกครองของคุณแล้วมีเวอร์ชันในไดเรกทอรีแม่แบบของธีมลูก
Andrew Killen

นี่เป็นคำตอบเดียวที่เหมาะกับฉัน
arnoldbird

5

นอกจากนี้ยังเป็นไปได้ที่จะใช้ Twig ใช้อาเรย์เพื่อสร้างทางเลือกเมื่อไม่มีไฟล์

เช่น. หาก footer.html.twig ไม่พร้อมใช้งาน defaultfooter.html.twig จะถูกใช้

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
รวมสิ่งนี้เข้ากับการใช้ตัวแปรในชื่อไฟล์และคุณสามารถรวมไฟล์ต่าง ๆ ได้ขึ้นอยู่กับบริบทบางประเภท

Nb: ฉันยังคงพยายามหาทางปฏิบัติที่ดีที่สุดหรือไม่


5

โปรดทราบว่าคุณสามารถส่งผ่านตัวแปรหลังจากwithคำหลัก:

{# template.html will have access to the variables from the current context and the additional ones provided #}
{% include 'template.html' with {'foo': 'bar'} %}

{% set vars = {'foo': 'bar'} %}
{% include 'template.html' with vars %}

ดูเอกสาร Twig http://twig.sensiolabs.org/doc/tags/include.html



1

สำหรับ Drupal 8

การรวมไฟล์ twig ในชุดรูปแบบ เมื่อคุณทำ{% include 'FILE_NAME.html.twig' %}Drupal คาดว่าไฟล์ของคุณจะอยู่ใน Theme Directory ปัจจุบันของคุณ เพียงแค่ใส่มันและมันจะทำงาน

รวมไฟล์กิ่งไม้ในโมดูลของคุณ

ถ้าคุณต้องการที่จะเพิ่มมันใน MODULE คุณต้องประกาศมันในฟังก์ชั่น THEME ในไฟล์. โมดูลของคุณเพียงแค่เพิ่มสิ่งต่อไปนี้:

<?php function YOUR_MODULE_NAME_theme($existing, $type, $theme, $path) {   
   'FILE_NAME' => [
      'variables' => [
      ],
      'template' => 'FILE_NAME',
    ], ?>

จากนั้นวางไฟล์ Twig ของคุณใน YOUR_MODULE / template / FILE_NAME.html.twig


มันเป็นข้อมูลที่ผิดเกี่ยวกับเส้นทาง หากต้องการรวมไฟล์จากโมดูลด้วย theme hook คุณต้องมีวิธีอื่น: {{include ('@ yourModuleName / twigFileName.html.twig', {var1: var1Val, var2: var2Val})}} อย่าลืมไฟล์เทมเพลตนั้นต้อง อยู่ใน 'yourModuleName / templates /'
Verter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.