Score:0

ฉันสามารถใช้ธีม hook เพื่อแสดงฟิลด์พิเศษในบล็อกได้หรือไม่

ธง id

สมมติว่าฉันมี hook 'opigno_documents_last_group_block':

<!-- ดีบักธีม --> 
<!-- THEME HOOK: 'opigno_documents_last_group_block' -->
<!-- เริ่มต้นเอาต์พุตจาก 'modules/contrib/opigno_learning_path/templates/opigno-documents-latest-group-block.html.twig' -->
<div class="content-box">
...

ฉันจะป้อนเพื่อส่งตัวแปรเพิ่มเติมไปยังเทมเพลตได้อย่างไร

ฉันเหนื่อย:

THEME_NAME_opigno_documents_last_group_block
THEME_NAME_opigno_documents_last_group_block_preprocess 
หรือ
THEME_NAME_preprocess_block 

hooks และอื่น ๆ แต่ดูเหมือนว่าจะไม่มีอะไรเรียกบล็อกนี้ แต่ดูเหมือนว่าจะหายไป (พร้อมกับบล็อกอื่น ๆ อีกมากมาย) เมื่อฉันยกเลิกการตั้งค่า npx_main_content_block

บล็อก opigno_documents_last_group_block อยู่ใน opigno_learning_path/src/Plugin/Block/DocumentsLastGroupBlock.php ซึ่งมีลักษณะดังนี้:

<?php

เนมสเปซ Drupal\opigno_learning_path\Plugin\Block;

ใช้ Drupal\Core\Block\BlockBase;
ใช้ Drupal\Core\Url;

/**
 * ให้บล็อก documentlastgroupblock
 *
 * @ปิดกั้น(
 * id = "opigno_documents_last_group_block",
 * admin_label = @การแปล("DocumentsLastGroupBlock"),
 * หมวดหมู่ = @Translation("กำหนดเอง")
 * )
 */
คลาส DocumentsLastGroupBlock ขยาย BlockBase {

  /**
   * @var \Drupal\Component\Plugin\Context\ContextInterface[]|ผสม
   */
  ป้องกัน $groupId;

  /**
   * {@inheritdoc}
   */
  สร้างฟังก์ชั่นสาธารณะ () {
    $this->groupId = $gid = $this->configuration["กลุ่ม"];
    $tid = _tft_get_group_tid($gid);
    $content = _tft_folder_content($tid, FALSE, $gid);
    $content = array_slice($content ?: [], 0, 4);
    foreach (เนื้อหา $ เป็น $ ดัชนี => $ รายการ) {
      $เนื้อหา[$ดัชนี] = [
        '#theme' => 'opigno_documents_last_group_item',
        '#type' => $item["type"] == 'file' ? 'ไฟล์' : 'โฟลเดอร์',
        '#item' => $item,
        '#label' => $item["ชื่อ"],
        '#link' => $this->itemLink($item),
      ];
    }
    $สร้าง['เนื้อหา'] = [
      '#theme' => 'opigno_documents_last_group_block',
      'เนื้อหา' => $เนื้อหา,
    ];
    ส่งคืน $build;
  }
(...)

และแนบมากับ LearningPathController ในโมดูลนี้:

 /**
  * บล็อกเอกสารการฝึกอบรม
  */
  การฝึกอบรมฟังก์ชั่นสาธารณะContentDocuments (&$content, $group) {

    // $TFTController = ใหม่ TFTController();
    // $listGroup = $TFCTontroller->listGroup($group->id()); 
    $tft_url = Url::fromRoute('tft.group', ['group' => $group->id()])->toString();

    $เนื้อหา['แท็บ'][] = $tft_url = [
     '#markup' => '<div class="see-all see-all-files"><a href="' . $tft_url . '">' $this->t('ดูทั้งหมด') . '</a></div>',
    ];

    $block_render = $this->attachBlock('opigno_documents_last_group_block', ['group' => $group->id()]);
   $block_render["เนื้อหา"]['ลิงค์'] = $tft_url;
    $content['tab_content']['documents'] = (isset($block_render["content"]["content"]) && !empty($block_render["content"]["content"])) ? [
      '#type' => 'คอนเทนเนอร์',
      '#attributes' => [
        'id' => 'เอกสาร',
      ]
      'บล็อก' => [
        'เนื้อหา' => $block_render["เนื้อหา"],
      ]
    ] : [ ];

  }
zanvidmar avatar
sa flag
อย่างน้อย THEME_NAME_preprocess_block ควรใช้งานได้ คุณล้างแคชและเปิดใช้งานโมดูล/ธีมแล้วหรือยัง
rukya avatar
id flag
@zanvidmar แน่นอน ล้างแคช เปิดใช้ธีมและใช้งานได้แล้ว
zanvidmar avatar
sa flag
เยี่ยมมาก และฉันคิดว่าคุณพยายามใช้ดีบั๊กเกอร์และคุณสร้างเบรกพอยต์ภายในฟังก์ชัน THEME_NAME_preprocess_block และดีบักเกอร์ไม่ได้หยุดอยู่แค่นั้นใช่ไหม
rukya avatar
id flag
ตัวอย่างเช่น เมื่อฉันใช้ฟังก์ชันนี้: ฟังก์ชัน npx_main_preprocess_block(&$variables) { kint($variables['attributes']['id']); } มันพิมพ์เพียง 4 ชื่อบล็อกและชื่อนี้ที่ฉันกำลังมองหาไม่มีอยู่ มันเหมือนกับส่วนหนึ่งของบล็อกอื่น ๆ เพราะมันจะหายไปเมื่อฉันยกเลิกการตั้งค่าบล็อก block-npx-main-content
zanvidmar avatar
sa flag
คุณอาจทราบหรือไม่ว่าบล็อกนี้แสดงผลจริงภายในบล็อกนี้หรือไม่ เพราะหากมีการโหลดข้อมูลเพียงบางส่วน ฉันไม่แน่ใจว่ามีการทริกเกอร์พรีโพรเซสฮุกหรือไม่
rukya avatar
id flag
@zanvidmar ขอบคุณที่ช่วย! มันถูกเรนเดอร์ nside contrib_module/src/Plugin/Block ถ้านั่นสมเหตุสมผล
zanvidmar avatar
sa flag
คุณช่วยแบ่งปันรหัสนั้นอีกเล็กน้อยได้ไหม ไม่แน่ใจว่าฉันได้รับภาพรวมทั้งหมดที่นี่ คุณสามารถอัปเดตคำถามได้ด้วย tnx
rukya avatar
id flag
@zanvidmar ฉันได้อัปเดตข้อมูลที่เป็นปัญหาแล้ว
Score:1
ธง ru

ชื่อที่ถูกต้องสำหรับฟังก์ชันพรีโพรเซสคือ THEME_NAME_preprocess_opigno_documents_last_group_block().

rukya avatar
id flag
ว้าว ขอบคุณมาก ฉันใกล้แล้ว แต่ฉันเรียงลำดับคำไม่ตรงกัน :) ฉันลงเอยด้วยการใช้ hook_theme คุณคิดว่าโซลูชันของคุณเป็นทางเลือกที่ดีกว่าหรือไม่
ru flag
hook_theme และ preprocess เป็นคนละเรื่องกัน หากคุณต้องการเพียงแค่อัปเดตตัวแปรที่มีอยู่ในเทมเพลต (หรือเพิ่มข้อมูลใหม่ลงในเทมเพลต) การประมวลผลล่วงหน้าเป็นตัวเลือกที่ดีกว่า แต่ถ้าเป็นบล็อกที่คุณกำหนดเอง (และสร้างขึ้นโดยทางโปรแกรม) คุณสามารถควบคุมเอาต์พุตของคุณในฟังก์ชัน build() และเพิ่มใน hook_theme ดังนั้น: hoot_theme นั้นดีสำหรับบล็อกแบบกำหนดเอง และการประมวลผลล่วงหน้านั้นยอดเยี่ยมสำหรับสิ่งที่ไม่ได้สร้างขึ้นโดยทางโปรแกรม
ru flag
ที่นี่ คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างบล็อกแบบกำหนดเอง (และเทมเพลตที่มีการสร้างตัวแปรแบบกำหนดเอง): https://www.drupal.org/docs/creating-custom-modules/creating-custom-blocks/create-a-custom-block
rukya avatar
id flag
ขอบคุณมากสำหรับการอธิบาย!
Score:0
ธง id

ฉันจัดการเพื่อทำความเข้าใจวิธีแก้ปัญหาของฉันและผ่านฟิลด์พิเศษโดยใช้เบ็ดนี้:

ฟังก์ชัน npx_main_theme() {
  กลับ [
    'opigno_documents_last_group_block' => [
      'ตัวแปร' => [
        'param1' => 'ทดสอบข้อความ'
      ]
    ]
  ];
}

โพสต์คำตอบ

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