Bao gồm một phần mẫu


19

Tôi đang cố gắng sử dụng Drupal 8, với một chủ đề tùy chỉnh, do sự khác biệt về cấu trúc lớn đối với các yêu cầu của tôi Tôi có một trang - front.twig.html và page.twig.html, tôi muốn tạo các phần mẫu như được sử dụng trong phrozn oder trong một dự án Symfony2 bình thường, ví dụ: footer.html.twig và header.html.twig. Các mẫu này được lưu dưới thư mục con / phần /.

Nhưng khi tôi gọi các mẫu này như bình thường, tôi chỉ nhận được một chuỗi với tên của mẫu.

Ví dụ:

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

Trả về tên tệp dưới dạng chuỗi:

parts/footer.html.twig

Có thể làm điều đó với Drupal 8?

Câu trả lời:


33

Bạn không thể thực hiện các đường dẫn tương đối, tất cả các đường dẫn phải từ gốc Drupal hoặc dựa trên đường dẫn được đặt tên đến thư mục 'mẫu' của bạn: https://www.drupal.org/node/2143557 .

Tôi sẽ tránh "từ gốc Drupal" và sử dụng các không gian tên, ít nhất là cho đến khi https://www.drupal.org/node/2291449 được giải quyết.

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

Chỉnh sửa: Nếu bạn muốn chuyển các đối số bổ sung cho vòng lặp hoặc để kiểm tra một số vars cho twigmẫu được bao gồm của bạn, bạn nên viết theo cách này:

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

Chỉnh sửa: Bây giờ https://www.drupal.org/node/2291449 đã được cam kết, bạn cũng có thể làm:

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

Xem https://www.drupal.org/node/2369981 để biết lý do tại sao bạn thấy tên tệp dưới dạng chuỗi thay vì ngoại lệ hữu ích.


Điều gì về includevà vượt qua các giá trị? Giả sử tôi muốn bao gồm image-formattervà chuyển urlnull để tránh tạo hình ảnh được liên kết.
SaidbakR

Các ví dụ được cung cấp trong câu trả lời này dường như không hoạt động.
arnoldbird

3
Hãy lưu ý rằng @mythemegiải quyết theo đường dẫn của mytheme+ chuỗi /templates. Nói cách khác, @mythemegiải quyết vào mytheme/templatesthư mục.
daniels

Để làm rõ hơn bình luận từ @daniels. Nếu chủ đề tùy chỉnh của bạn được đặt tên là huyền thoại và nó nằm ở 'chủ đề / tùy chỉnh / huyền thoại' thì không gian tên Twig @mythemesẽ giải quyết thành 'chủ đề / tùy chỉnh / huyền thoại / mẫu' . Bao gồm một mẫu được đặt tại @mytheme/fragments/footer.html.twigcó nghĩa là nó sẽ phân giải thành 'chủ đề / tùy chỉnh / huyền thoại / mẫu / đoạn / footer.html.twig'
ec0g

15

Sử dụng một đường dẫn đầy đủ đến thư mục chủ đề. Nếu bạn sử dụng không gian tên, bạn sẽ phải thay đổi nó nếu bạn mang mã đến một trang web hoặc chủ đề khác.

Điều này sẽ làm việc:

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

Điều này rất thuận tiện khi thực hiện chủ đề phụ. Đặt cái này trong chủ đề Parent của bạn, và sau đó có một phiên bản trong thư mục mẫu của chủ đề con.
Andrew Killen

Đây là câu trả lời duy nhất làm việc cho tôi.
arnoldbird

5

Cũng có thể sử dụng Twig sử dụng một mảng để tạo dự phòng khi tệp không tồn tại.

Ví dụ. Nếu footer.html.twig không khả dụng, defaultfooter.html.twig sẽ được sử dụng.

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
Kết hợp điều này với việc sử dụng các biến trong tên tệp và bạn có thể bao gồm các tệp khác nhau tùy thuộc vào một số loại bối cảnh.

Nb: Tôi vẫn đang cố gắng tìm hiểu xem đây có phải là cách thực hành tốt nhất hay không.


5

Lưu ý bạn có thể chuyển các biến sau withtừ khóa:

{# 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 %}

Xem tài liệu Twig http://twig.sensiolabs.org/doc/tags/include.html



1

Đối với Drupal 8

Bao gồm một tập tin twig trong chủ đề khi bạn làm một{% include 'FILE_NAME.html.twig' %} Drupal hy vọng rằng TẬP TIN của bạn sẽ nằm trong Thư mục chủ đề hiện tại của bạn. Chỉ cần đặt nó ở đó và nó sẽ làm việc.

Bao gồm một tệp twig trong Mô-đun của bạn

Nếu bạn muốn thêm nó trong MODULE, bạn phải khai báo nó trong Hàm THEME. Trong tệp .module của bạn chỉ cần thêm vào như sau:

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

Sau đó, đặt tệp Twig của bạn vào YOU_MODULE / template / FILE_NAME.html.twig


Đó là thông tin sai về đường dẫn. Để bao gồm tệp từ mô-đun với móc chủ đề, bạn cần một cách khác: {{include ('@ yourModuleName / twigFileName.html.twig', {var1: var1Val, var2: var2Val})}} Đừng quên, các tệp mẫu đó phải ở trong 'yourModuleName / samples /'.
Verter
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.