Score:1

กำลังพยายามส่งคืนพื้นที่ในคำแนะนำของธีมสำหรับบล็อกโครงสร้างหนังสือของโมดูลหนังสือ

ธง cn

แก้ไขคำถามตามข้อมูลจาก @NoSssweat

โมดูลหนังสือใช้ hook เดียวกันสำหรับบล็อกแผนผังหนังสือและมุมมองดัชนีที่แสดงผลในหน้าหนังสือ

ฉันใช้โค้ดด้านล่างเพื่อส่งคืนคำแนะนำชื่อไฟล์ เพื่อให้ฉันสามารถแทนที่เอาต์พุต html สำหรับบล็อกแผนผังหนังสือในพื้นที่เฉพาะ - "แถบด้านข้างก่อน" ฉันคาดว่ารหัสด้านล่างจะพ่นออกมาเช่น book-tree--book-toc-180--sidebar-first.html.twig. แต่จะแยกคำแนะนำชื่อไฟล์ที่ได้รับการแนะนำออกไปแทน:

<!-- FILE NAME SUGGESTIONS:
   * book-tree--book-toc-180.html.twig
   * book-tree--book-toc-180.html.twig
   x book-tree.html.twig
-->

คำแนะนำชื่อไฟล์นี้เหมือนกันกับเนื้อหาหลักในหน้าหนังสือ ฉันจะกำหนดเป้าหมายบล็อกแผนผังหนังสือใด ๆ ภายใน แถบด้านข้างก่อน ภูมิภาค?

// เพิ่มตัวแปรภูมิภาคให้กับบล็อก
// http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
ฟังก์ชัน uswds_subtheme_preprocess_book_tree__book_toc_180(&$ตัวแปร) {
    ถ้า (isset($ตัวแปร["องค์ประกอบ"]["#id"])) {
        $block_id = $ตัวแปร["องค์ประกอบ"]["#id"];
        $block = \Drupal\block\Entity\Block::load($block_id);

        ถ้า ($ บล็อก) {
            $variables["content"]["#attributes"]["region"] = $block->getRegion();
        }
    }
}

// เพิ่มคำแนะนำเทมเพลตตามชื่อภูมิภาค
// http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
ฟังก์ชัน uswds_subtheme_theme_suggestions_book_tree__book_toc_180_alter (อาร์เรย์ &$คำแนะนำ, อาร์เรย์ $ตัวแปร) {
    ถ้า (isset($variables["attributes"]["region"])) {
        $suggestions[] = $variables["theme_hook_original"] "__" . $variables["attributes"]["ภูมิภาค"];
    }
}

ความพยายามครั้งที่ 2 ฉันทำด้านล่างและใช้งานได้ แต่ใช้ได้กับบล็อกเริ่มต้นของโมดูลหนังสือเท่านั้น แม้ว่าปลั๊กอินบล็อกโมดูลหนังสืออื่น ๆ ส่วนใหญ่จะใช้ทั้งหมด book-tree.html.twig

// เพิ่มตัวแปรภูมิภาคให้กับบล็อก
ฟังก์ชัน uswds_subtheme_preprocess_block(&$variables) {
  ถ้า (isset($ตัวแปร["องค์ประกอบ"]["#id"])) {
    $block_id = $ตัวแปร["องค์ประกอบ"]["#id"];
    $block = \Drupal\block\Entity\Block::load($block_id);

    ถ้า ($ บล็อก) {
      $variables["content"]["#attributes"]["region"] = $block->getRegion();
    }
  }
}

// เพิ่มคำแนะนำเทมเพลตตามชื่อภูมิภาค
ฟังก์ชัน uswds_subtheme_theme_suggestions_alter (อาร์เรย์ &$คำแนะนำ, อาร์เรย์ $ตัวแปร, $hook) {
  ถ้า (isset($variables["attributes"]["region"])) {
    $suggestions[] = $variables["theme_hook_original"] "__" . $variables["attributes"]["ภูมิภาค"];
  }
}
No Sssweat avatar
ua flag
สิ่งนี้ตอบคำถามของคุณหรือไม่ [กำหนดว่าบล็อกเมนูจะแสดงในภูมิภาคใด](https://drupal.stackexchange.com/questions/218907/determine- which-region-a-menu-block-is-rendered-in)
cn flag
@NoSssweat - ไม่มาก เพราะฉันกำลังมองหาว่ามันเป็นไปได้ภายในกิ่งไม้
cn flag
@NoSssweat - คำถามเพิ่มเติม: ฉันพยายามเพิ่มสิ่งนี้ผ่านธีมย่อยของฉันโดยสร้างไฟล์ my_subtheme.theme แต่ดูเหมือนว่าจะไม่ทำงาน (ฉันเดาว่าการสืบทอดไม่ทำงานอย่างนั้น)
No Sssweat avatar
ua flag
สมมติว่าธีมย่อยของคุณถูกตั้งค่าเป็นธีมปัจจุบัน มันควรจะใช้งานได้ บางทีคุณอาจไม่ได้ล้างแคชเพื่อให้ hooks ถูกหยิบขึ้นมา
cn flag
@NoSssweat - ดูการอัปเดต ล้างแคชแล้ว
Score:2
ธง ua

หรือฉันจะทำอะไรในกิ่งไม้เช่น {% ถ้าภูมิภาค == 'แถบด้านข้างก่อน' %} และแทนที่ book-tree.html.twig

// เพิ่มแอตทริบิวต์ของภูมิภาคให้กับบล็อก
ฟังก์ชัน uswds_subtheme_preprocess_block(&$variables) {
  ถ้า (isset($ตัวแปร["องค์ประกอบ"]["#id"])) {
    $block_id = $ตัวแปร["องค์ประกอบ"]["#id"];
    $block = \Drupal\block\Entity\Block::load($block_id);
    ถ้า ($ บล็อก) {
      $variables["content"]["#attributes"]["region"] = $block->getRegion();
    }
  }
}

/**
 * ใช้ hook_preprocess_HOOK()
 *
 * สร้างตัวแปรภูมิภาค
 *
 * กำจัดคุณลักษณะของภูมิภาคที่เพิ่มใน uswds_subtheme_preprocess_block() เนื่องจากเป็น
 * ไม่ใช่แอตทริบิวต์ HTML ที่ถูกต้อง
 */
ฟังก์ชัน uswds_subtheme_preprocess_book_tree(&$ตัวแปร) {
  ถ้า (isset($variables['attributes']['region'])) {
    // สร้างตัวแปรภูมิภาคสำหรับ book-tree.html.twig
    $variables['region'] = $variables['attributes']['region'];
    // ยกเลิกการตั้งค่าแอตทริบิวต์ html ที่ไม่ถูกต้อง
    unset($variables['attributes']['region']);
  }
}
cn flag
น่าเสียดายที่สิ่งนี้ไม่เคยถูกเรียก - `uswds_subtheme_preprocess_book_tree`
No Sssweat avatar
ua flag
มันควรจะเป็น คุณล้างแคชหรือไม่ ถ้าใช่ ตรวจสอบเพื่อดูว่ามันผิดเงื่อนไข isset หรือไม่
Score:1
ธง cn

ใช้ความช่วยเหลือทั้งหมดจาก @NoSssweat และฉันสามารถทำงานได้:

// เพิ่มตัวแปรภูมิภาคให้กับบล็อก
ฟังก์ชัน uswds_subtheme_preprocess_block(&$variables) {
  ถ้า (isset($ตัวแปร["องค์ประกอบ"]["#id"])) {
    $block_id = $ตัวแปร["องค์ประกอบ"]["#id"];
    $block = \Drupal\block\Entity\Block::load($block_id);

    ถ้า ($ บล็อก) {
      $variables["content"]["#attributes"]["region"] = $block->getRegion();
    }
  }
}

// เพิ่มคำแนะนำเทมเพลตตามชื่อภูมิภาค
ฟังก์ชัน uswds_subtheme_theme_suggestions_alter (อาร์เรย์ &$คำแนะนำ, อาร์เรย์ $ตัวแปร, $hook) {
  ถ้า (isset($variables["attributes"]["region"])) {
    $suggestions[] = $variables["theme_hook_original"] "__" . $variables["attributes"]["ภูมิภาค"];
  }
}

ผลลัพธ์ใด (คำแนะนำที่สองรวมถึงภูมิภาค):

<!-- FILE NAME SUGGESTIONS:
   * book-tree--book-toc-180.html.twig
   * book-tree--book-toc-180--sidebar-first.html.twig
   x book-tree.html.twig
-->

อัปเดตเป็นเวอร์ชันที่ใช้งานได้:

<?php
// เพิ่มตัวแปรภูมิภาคให้กับบล็อก ใช้กับปลั๊กอินบางเวอร์ชันที่ใช้ book-tree.html.twig เท่านั้น 
ฟังก์ชัน uswds_subtheme_preprocess_block(&$variables) {
    ถ้า (isset($ตัวแปร["องค์ประกอบ"]["#id"])) {
      $block_id = $ตัวแปร["องค์ประกอบ"]["#id"];
      $block = \Drupal\block\Entity\Block::load($block_id);
  
      ถ้า ($ บล็อก) {
        $variables["content"]["#attributes"]["region"] = $block->getRegion();
      }
    }
  }

// เพิ่มคำแนะนำเทมเพลตให้กับบล็อก ดูเหมือนจะทำงานได้ทุกที่ แต่ไม่ได้กำหนดเป้าหมายต้นไม้หนังสือ
ฟังก์ชัน uswds_subtheme_theme_suggestions_block_alter(อาร์เรย์ &$คำแนะนำ, อาร์เรย์ $ตัวแปร){
    ถ้า (!empty($variables['elements']['#id'])) {
        $block = \Drupal\block\Entity\Block::load($variables['elements']['#id']);
        $region = $block->getRegion();
        // เพิ่มข้อเสนอแนะด้วยภูมิภาคและรหัสบล็อก
        $suggestions[] = 'บล็อก__' $ภูมิภาค '__' . $ตัวแปร['องค์ประกอบ']['#id'];
        // เพิ่มคำแนะนำด้วยรหัสภูมิภาค
        $suggestions[] = 'บล็อก__' $ภูมิภาค;
    }
}


// เพิ่มคำแนะนำเทมเพลตตามชื่อภูมิภาค
ฟังก์ชัน uswds_subtheme_theme_suggestions_alter (อาร์เรย์ &$คำแนะนำ, อาร์เรย์ $ตัวแปร, $hook) {
  ถ้า (isset($variables["attributes"]["region"])) {
    $suggestions[] = $variables["theme_hook_original"] "__" . $variables["attributes"]["ภูมิภาค"];
  }
}
No Sssweat avatar
ua flag
ฉันใช้ Bartik เมื่อเขียนโค้ด คุณควรเพิ่มฟังก์ชัน hook สุดท้ายของฉัน มิฉะนั้น คุณจะจบลงด้วยแอตทริบิวต์ HTML ที่ผิดกฎหมาย
cn flag
@NoSssweat - อีกหนึ่งคำถาม (และขอบคุณสำหรับความช่วยเหลือทั้งหมด) - โค้ดด้านบนของฉันดูเหมือนว่าจะทำงานเฉพาะกับบล็อกที่จัดทำโดยโมดูลหนังสือเท่านั้น มันไม่ได้ให้คำแนะนำสำหรับปลั๊กอินอื่น ๆ แม้ว่าปลั๊กอินอื่น ๆ จะขึ้นอยู่กับ `book-tree.html.twig` ด้วยเช่นกัน ฉันจะรับคำแนะนำเพิ่มเติมสำหรับบล็อกใด ๆ ที่ใช้ `book-tree.html.twig` และกำลังส่งออก `book-tree--book-toc-180.html.twig` อยู่แล้วได้อย่างไร
cn flag
@NoSssweat หรือฉันจะทำอะไรใน twig เช่น `{% if region == 'sidebar-first' %}` และแทนที่ `book-tree.html.twig` ได้อย่างไร
No Sssweat avatar
ua flag
ดู [คำตอบล่าสุดของฉัน](https://drupal.stackexchange.com/a/308235/27710)
Score:1
ธง ua

น่าลอง เนื่องจากเป็นหนังสือไม่ใช่เมนู กระบวนการจึงคล้ายกัน แต่ไม่เหมือนกันทั้งหมด ฉันหวังว่าคุณจะคิดออก

แต่ยังไงก็ตาม ต่อไปนี้

/**
 * ใช้ hook_preprocess_HOOK()
 *
 * ส่งค่าขอบเขตของบล็อกไปยังเนื้อหาเพื่อให้สามารถใช้ใน
 * uswds_subtheme_theme_suggestions_menu_alter() ตั้งแต่ $variables['elements']
 * ไม่สามารถใช้ได้ที่นั่น
 */
ฟังก์ชัน uswds_subtheme_preprocess_block(&$variables) {
  ถ้า (isset($variables['elements']['#id']) && $variables['base_plugin_id'] === 'book_navigation') {
    $region = \Drupal\block\Entity\Block::load($variables['elements']['#id'])->getRegion();
    $เนื้อหา = $ตัวแปร['เนื้อหา'];
    foreach ($content เป็น $content_key => $content_info) {
      ถ้า (is_numeric($content_key)) {
        $variables['content'][$content_key]['#attributes']['region'] = $region;
      }
    }
  }
}

/**
 * ใช้ hook_theme_suggestions_HOOK_alter()
 *
 * ให้คำแนะนำหนังสือตามภูมิภาค
 */
ฟังก์ชัน uswds_subtheme_theme_suggestions_book_tree_alter (&$suggestions, อาร์เรย์ $ตัวแปร) {
  ถ้า (isset($variables['attributes']['region'])) {
    $คำแนะนำ = 'หนังสือ__' $variables['theme_hook_original'] . '__' . $variables['attributes']['region'];
    $suggestion = str_replace('-', '_', $suggestion);
    $คำแนะนำ[] = $คำแนะนำ;
  }
}

/**
 * ใช้ hook_preprocess_HOOK()
 *
 * กำจัดคุณลักษณะของภูมิภาคที่เพิ่มใน uswds_subtheme_preprocess_block() เหมือนเดิม
 * ไม่ใช่แอตทริบิวต์ HTML ที่ถูกต้อง
 */
ฟังก์ชัน uswds_subtheme_preprocess_book_tree(&$ตัวแปร) {
  ถ้า (isset($variables['attributes']['region'])) {
    unset($variables['attributes']['region']);
  }
}
cn flag
ขออภัย ฉันไม่เห็นการเปลี่ยนแปลงใดๆ ในคำแนะนำสำหรับ book-tree.html.twig
cn flag
เมื่อมองต่อไป ฉันไม่เชื่อว่าฟังก์ชันที่สองกำลังดำเนินการอยู่ เนื่องจากฉันสามารถเปลี่ยนค่าบางอย่างได้ เช่น 'book__' เป็น 'books__' และการเปลี่ยนแปลงนั้นจะไม่เกิดขึ้น

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา