วิธีสร้างเทมเพลตใน Drupal 8


12

ฉันกำลังพยายามแสดงเทมเพลตใน Drupal 8 ใน Drupal 7 ฉันจะสร้างชุดรูปแบบด้วย hook_theme สร้างไดเรกทอรีแม่แบบในโมดูลของฉันวางแฟ้มแม่แบบในและฉันสามารถแสดงด้วยชุดรูปแบบ () ฉันจะทำ eqivilent กับ Drupal 8 ได้อย่างไร ฉันลองสิ่งต่อไปนี้ แต่มีข้อผิดพลาดเกิดขึ้น:

ใน twitter_pull.module

/ **
 * ใช้ hook_theme ()
 * /
ฟังก์ชัน twitter_pull_theme ($ ที่มีอยู่, $ type, $ theme, $ path) {
  อาร์เรย์ส่งคืน (
    'twitter_pull_tweet_listing' => อาร์เรย์ (
      'ตัวแปร' => อาร์เรย์ (
        'description' => array (),
      )
      'template' => 'templates / twitter_pull_tweet_listing'
    )
  );
}

ภายใน twitter_pull / แม่แบบ: the twitter_pull_tweet_listing.html.twig

ภายในบล็อกของฉัน:

$ tweet_template = array ('# theme' => 'twitter_pull_tweet_listing', '#attributes' => อาร์เรย์ ('params' => $ params));
$ output = drupal_render ($ tweet_template, array ('params' => $ params));
พิมพ์ออก $;

ฉันได้รับข้อผิดพลาดต่อไปนี้ในบันทึกของฉัน:

ข้อผิดพลาดของผู้ใช้: "เนื้อหา" เป็นคีย์อาเรย์การแสดงผลที่ไม่ถูกต้องใน Drupal \ Core \ Render \ Element :: children () (บรรทัดที่ 89 ของ C: \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element PHP)

แก้ไข: ข้อผิดพลาดอื่น:

Twig_Error_Loader: ไม่พบเทมเพลต "modules / custom / twitter_pull / templates / templates / twitter_pull_tweet_listing.html.twig" (ดูที่: C: \ xampp \ htdocs \ drupal) ใน Twig_Loader_Filesystem-> findTemplate () (บรรทัดที่ 202 ของ C: \ xampp \ htdocs \ drupal \ core \ seller \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php)

ฉันคิดว่าข้อผิดพลาดนี้เกิดขึ้นเพราะฉันไม่ได้ใช้เนมสเปซและการโหลดอัตโนมัติอย่างถูกต้อง ฉันจะวางไฟล์เทมเพลตของฉันที่ไหน? จากข้อผิดพลาดฉันพยายามวางไว้ที่ C: \ xampp \ htdocs \ drupal \ templates \ แต่ก็ยังใช้งานไม่ได้


มีอะไรใน twitter_pull_tweet_listing.html.twig?
ไคลฟ์

แค่ตัวยึดตำแหน่ง: ข้อความ 'นี่คือเทมเพลตกิ่งไม้'
user1015214

มีเหตุผลใดที่ทำให้คุณส่งพารามิเตอร์หลาย ๆ ชุดมาเป็นอาร์กิวเมนต์ที่สองdrupal_render()? คาดว่าจะเป็นบูลีน
ไคลฟ์

ไม่นั่นเป็นความผิดพลาด ฉันนำพารามิเตอร์ตัวที่สองของ drupal_render ออกมาและฉันก็ยังมีปัญหาเดิมอยู่ ฉันแก้ไขคำถามข้างต้นเพื่อรวมข้อผิดพลาดที่สองที่ฉันเห็น
user1015214

templates/templates/มีส่วนร่วมในข้อผิดพลาดที่ 2 ทำให้ฉันคิดว่าคุณควรลอง'template' => 'twitter_pull_tweet_listing',แทน'template' => 'templates/twitter_pull_tweet_listing',ในhook_theme()
ไคลฟ์

คำตอบ:


24

โดยทั่วไปใน Drupal 8 คุณควรปล่อยให้เทมเพลตบรรทัดและตั้งชื่อเทมเพลตเหมือนกับ hook ของคุณโดยแปลงขีดล่างเป็นขีดกลาง สิ่งนี้ถูกเปลี่ยนแปลงเนื่องจากเทมเพลตเป็นรูปแบบเอาต์พุตเริ่มต้นสำหรับชุดรูปแบบเอาต์พุตใน D8 ดังนั้นในกรณีของคุณนี้hook_theme():

/**
 *  Implements hook_theme().
 */
function twitter_pull_theme($existing, $type, $theme, $path) {
  return [
    'twitter_pull_tweet_listing' => [
      'variables' => [
        'description' => [],
      ],
    ],
  ];
}

... templates/twitter-pull-tweet-listing.html.twigจะชี้ไปที่แม่แบบ (นั่นคือการใช้ไวยากรณ์อาร์เรย์แบบสั้น )

บันทึกการเปลี่ยนแปลงที่เกี่ยวข้อง: https://www.drupal.org/node/2231673

และจากบล็อกหรือตัวควบคุมโปรดส่งคืนอาร์เรย์การเรนเดอร์แทนสตริง ด้วยวิธีการนี้ผลลัพธ์สามารถจัดการได้ในภายหลังและข้อมูลดิบยังคงสามารถเข้าถึงได้ในบรรทัด กล่าวอีกนัยหนึ่งหลีกเลี่ยงการโทรdrupal_render()จากรหัสของคุณเมื่อทำได้ สิ่งนี้ใช้ได้กับ Drupal 7 เช่นกัน: https://www.drupal.org/node/930760#creating

ดังนั้นจากบล็อกของคุณ:

return [
  '#theme' => 'twitter_pull_tweet_listing',
  '#description' => 'foo',
  '#attributes' => [],
];

1
ดีใจที่รู้ว่ามันตั้งใจ :)
ไคลฟ์

ขอบคุณสำหรับคำตอบ! แต่คุณสามารถอธิบายเพิ่มเติมอีกเล็กน้อยได้ไหมว่าทำไมฉันถึงส่งคืนอาร์เรย์เป็นเอาต์พุตได้ ในบางครั้ง drupal render จำเป็นต้องถูกเรียกให้รันดังนั้นถ้าฉันไม่เรียกมันใครจะทำ
user1015214

คุณสามารถทำได้ใน Drupal 7 เช่นกัน ฉันจะพยายามหาเอกสารเพื่อเพิ่มคำตอบ
Cottser

1
ล่าช้าเล็กน้อย แต่ฉันเพิ่มลิงก์ไปยังdrupal.org/node/930760#creatingในคำตอบ
Cottser

1
สิ่งที่ฉันต้องการชัดเจนชัดเจนในการอธิบาย! ขอขอบคุณ.
Johan Haest
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.