จะสร้างคำแนะนำเบ็ดธีมสำหรับบล็อกตามภูมิภาคได้อย่างไร


14

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

ฉันคิดเกี่ยวกับการใช้MYMODULE_theme_suggestions_block_alterแต่ฉันไม่ทราบวิธีการรับภูมิภาคปัจจุบัน

คำตอบ:


20

คุณสามารถรับภูมิภาคได้หากคุณได้รับ Block Entity

.module หรือไฟล์. theme

use Drupal\block\Entity\Block;

function MODULE_theme_suggestions_block_alter(array &$suggestions, array $variables) {
  if (!empty($variables['elements']['#id'])) {
    $block = Block::load($variables['elements']['#id']);
    $suggestions[] = 'block__' . $block->getRegion() . '__' . $variables['elements']['#id'];
  }
  /* Use this 'else if' only if you are using page_manager module and want to know which region is the block */
  else if (isset($variables['elements']['#configuration']['region'])) {
    $suggestions[] = 'block__page_' . $variables['elements']['#configuration']['region'] . '__' . end(explode(':', $variables['elements']['#plugin_id']));
  }
  return $suggestions;
}

แก้ไข 1:ครอบคลุมกรณีโมดูล module_manager


เกือบจะสมบูรณ์แบบ. คุณต้องเพิ่มผู้ออก () เพื่อให้แน่ใจว่า #id มีอยู่จริง ตัวอย่างเช่นหากคุณใช้ page_manager และวางบล็อคไว้ในนั้นคุณจะไม่มี #id
Berdir

@Berdir ขอบคุณ;) ผมคิดว่าในกรณีนี้isset()ไม่จำเป็นต้องใช้เพราะถ้ามีไม่ได้เป็น#idแล้วมันจะผ่านNULLไปยังฟังก์ชั่นและเพิ่งกลับมา::load NULLในท้ายที่สุด$blockคือNULLและจะไม่มีอะไรเกิดขึ้น ทดสอบใน dev env ของฉัน Drupal 8.0.4 - page_manager-1.0-alpha23 (ไม่เคยใช้โมดูลนี้มาก่อน)
Vagner

ใช่ต้องใช้ isset () การเข้าถึงคีย์อาร์เรย์ที่ไม่มีผลลัพธ์ในการแจ้งเตือน PHP ตรวจสอบบันทึกของคุณแล้วคุณจะเห็น ฉันอยากจะแนะนำให้พัฒนาเสมอกับการแสดงข้อผิดพลาดใน verbose ซึ่งเป็นค่าเริ่มต้นของการตั้งค่าตัวอย่างให้
Berdir
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.