Score:0

วิธีขยายคลาสบล็อกหลัก SystemBrandingBlock

ธง ph

โปรดแนะนำวิธีที่เราสามารถขยายคลาสบล็อกหลัก Drupal\system\Plugin\Block\SystemBrandingBlock เพื่อเพิ่มวิธีการที่กำหนดเอง

ในกรณีของฉัน ฉันต้องการรวมฟังก์ชัน buildToArray() เพื่อรับข้อมูลบล็อกในรูปแบบอาร์เรย์แทนที่จะเป็นอาร์เรย์ที่แสดงผล

วิธีการสร้าง () ที่มีอยู่:

สร้างฟังก์ชั่นสาธารณะ () {
    $สร้าง = [];
    $site_config = $this->configFactory->get('system.site');

    $build['site_logo'] = [
      '#theme' => 'รูปภาพ',
      '#uri' => theme_get_setting('logo.url'),
      '#alt' => $this->t('หน้าแรก'),
      '#access' => $this->configuration['use_site_logo'],
    ];

    $build['site_name'] = [
      '#markup' => $site_config->get('ชื่อ'),
      '#access' => $this->configuration['use_site_name'],
    ];

    $build['site_slogan'] = [
      '#markup' => $site_config->get('สโลแกน'),
      '#access' => $this->configuration['use_site_slogan'],
    ];

    ส่งคืน $build;
}

วิธีที่จำเป็นในการเพิ่ม:

ฟังก์ชั่นสาธารณะ buildToArray () {
    $site_config = $this->configFactory->get('system.site');

    กลับ [
      'site_logo' => theme_get_setting('logo.url'),
      'site_name' => $site_config->get('ชื่อ'),
      'site_slogan' => $this->configuration['use_site_slogan'],
    ];
}
in flag
สวัสดี และยินดีต้อนรับสู่ Drupal Answers! คุณช่วยอธิบายสิ่งที่คุณได้ลอง อะไรที่ไม่ได้ผล และโพสต์โค้ดที่เกี่ยวข้องได้ไหม
ph flag
@Beau ขอบคุณสำหรับความคิดเห็นของคุณ ฉันได้อัปเดตคำถามให้เฉพาะเจาะจงมากขึ้น
Score:0
ธง in

การขยายบล็อก

หากต้องการขยายบล็อก คุณจะต้องกำหนดบล็อกใหม่ตามที่อธิบายไว้ในบทช่วยสอนต่อไปนี้ ยกเว้นว่าคุณจะขยายชั้นเรียน Drupal\system\Plugin\Block\SystemBrandingBlockแทนชั้นเรียน Drupal\Core\Block\BlockBase. จากนั้น คุณสามารถเพิ่มเมธอดแบบกำหนดเองลงในบล็อกที่กำหนดใหม่ได้

https://www.valuebound.com/resources/blog/drupal-8-how-to-create-a-custom-block-โดยทางโปรแกรม

การพิจารณาทางเลือก

หากสิ่งที่คุณต้องการจาก SystemBrandingBlock เป็นเพียง ข้อมูลและไม่จำเป็นต้องเป็นบล็อกจริง ฉันขอแนะนำให้นิยาม a แทน บริการ ที่ให้ข้อมูลจากคุณ buildToArray() กระบวนการ.

ตอบกลับความคิดเห็น

เป็นเรื่องจริงที่จะสร้างประเภทบล็อกใหม่นอกเหนือจาก SystemBrandingBlock. บล็อกได้รับการจัดการ จัดระเบียบ และเรียกใช้โดย ตัวจัดการปลั๊กอินบล็อก. คุณสามารถเขียนมัณฑนากรสำหรับบริการนี้และแทนที่ getDefinitions() วิธีการเพื่อป้องกันของเดิม SystemBrandingBlock จากการที่มีให้ใช้เป็นคำจำกัดความของปลั๊กอิน บรรลุผลของการแทนที่ของเดิม SystemBrandingBlock ด้วยบล็อกใหม่ของคุณ

ฉันยังคงฟังดูเหมือนบริการเป็นสิ่งที่คุณต้องการ โดยตรวจสอบโค้ดในต้นฉบับ SystemBrandingBlock นิยามคลาส เราจะเห็นว่า SystemBrandingBlock อาศัยบริการเดียวเท่านั้น config.factory. ดังนั้นบริการของคุณเพียงแค่ฉีด config.factory บริการเพื่อดึงข้อมูลที่คุณต้องการสำหรับ buildToArray() วิธีการ (ซึ่งอาจเปลี่ยนชื่อได้ดีกว่าเป็น getBrandingInfo()). การกำหนดบริการด้วยวิธีนี้หมายความว่าคุณไม่จำเป็นต้องกังวลเกี่ยวกับการปรับใช้หรือปรับใช้บล็อก (ซึ่งดูเหมือนจะไม่ใช่สิ่งที่คุณต้องการ) หรือจำเป็นต้องเขียนตัวตกแต่งบริการ

โปรดทราบว่า SystemBrandingBlock ไม่ใช่แหล่งข้อมูลดั้งเดิม แต่เป็นปลั๊กอินสำหรับแสดงข้อมูลเหล่านั้นในรูปแบบที่แสดงผล บล็อกนั้นไม่เกี่ยวข้องเลยหากคุณต้องการเพียงแค่ข้อมูล

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

ph flag
ขอขอบคุณสำหรับคำแนะนำของคุณ.
ph flag
ฉันต้องการขยายบล็อกที่มีอยู่ทั้งหมด วิธีแรก "ขยายบล็อก" นำไปสู่การทำซ้ำบล็อก วิธีที่สอง "จากบริการ" ฉันไม่สามารถเข้าถึงคุณสมบัติที่ได้รับการป้องกันของบล็อก ดังนั้นฉันจึงต้องใช้ตรรกะบล็อกนั้นในบริการ
ph flag
คำตอบของคุณทำให้ฉันมีมุมมองใหม่ ขอบคุณ
ph flag
เท่าที่ฉันเข้าใจ เราสามารถแทนที่บล็อกด้วย hook_block_alter และตัวตกแต่งปลั๊กอิน ฉันชัดเจนเกี่ยวกับเบ็ด คุณช่วยยกตัวอย่างเกี่ยวกับตัวตกแต่งปลั๊กอินสำหรับบล็อกได้ไหม มันจะช่วยได้หลายคนเนื่องจากไม่มีเอกสารที่เหมาะสมเกี่ยวกับตัวตกแต่งปลั๊กอิน
in flag
ใน Drupal ปลั๊กอินทุกประเภทได้รับการจัดการโดยตัวจัดการปลั๊กอินซึ่งเป็นบริการ ตัวตกแต่งปลั๊กอินเป็นตัวตกแต่งบริการสำหรับตัวจัดการปลั๊กอิน นี่คือบทช่วยสอนที่ยอดเยี่ยมเกี่ยวกับตัวตกแต่งบริการ Drupal 8: https://www.phase2technology.com/blog/using-symfony-service-decorators-drupal-8 ในกรณีของคุณ คุณจะต้องตกแต่งบริการที่มี ID เป็น `plugin.manager.block` แต่ฉันก็ยังรู้สึกว่าบริการที่คุณกำหนดเองคือสิ่งที่คุณต้องการจริงๆ และจะต้องทำงานน้อยลง
ph flag
ขอบคุณ @Beau
Score:0
ธง gb

หากคุณใช้ Drupal 9 และไม่ต้องการสร้างการทำซ้ำของบล็อก นี่คือวิธีที่ง่ายที่สุดในการแทนที่คลาสของบล็อก: หากต้องการแทนที่คลาส Block คุณสามารถใช้ hook_block_alter แบบนี้.

/**
 * ใช้ hook_block_alter()
 */
ฟังก์ชัน [MODULE]_block_alter(&$definitions) {
  foreach (นิยาม $ เป็น $id => $definition) {
    // ตรวจสอบรหัสปลั๊กอินของคุณที่นี่
    ถ้า ($id === 'system_branding_block') {
      // ตั้งคลาสใหม่ของคุณที่นี่
      $definitions[$id]['class'] = 'Drupal\MODULE\Plugin\Block\SystemBrandingBlockAlter';
    }
  }
}

จากนั้นสร้างชั้นเรียนใหม่ของคุณ SystemBrandingBlockAlter ใน MODULE/src/ปลั๊กอิน/บล็อก แบบนี้:

<?php

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

ใช้ Drupal\system\Plugin\Block\SystemBrandingBlock

คลาส SystemBrandingBlockAlter ขยาย SystemBrandingBlock {
  
  สร้างฟังก์ชั่นสาธารณะ () {
    $site_config = $this->configFactory->get('system.site');
    กลับ [
      'site_logo' => theme_get_setting('logo.url'),
      'site_name' => $site_config->get('ชื่อ'),
      'site_slogan' => $this->configuration['use_site_slogan'],
    ];
  }
  
}

ตอนนี้คลาสที่รับผิดชอบสำหรับบล็อกของคุณคือ Drupal\MODULE\Plugin\Block\SystemBrandingBlockAlter และไม่ Drupal\system\Plugin\Block\SystemBrandingBlock

ph flag
ขอบคุณมาก. นี่คือสิ่งที่ฉันกำลังมองหา
ph flag
ในอาร์เรย์คำจำกัดความ เราสามารถเห็น 'ผู้ให้บริการ' => 'ระบบ' แต่เราจะแทนที่คลาสบล็อกจากโมดูลที่เรากำหนดเอง จะสร้างผลกระทบหรือไม่?
berramou avatar
gb flag
หากคุณตรวจสอบ `'ผู้ให้บริการ' == 'ระบบ'` คุณจะแทนที่คลาสของบล็อกทั้งหมดที่สร้างโดยโมดูลระบบ ไม่ใช่แค่ SystemBrandingBlock

โพสต์คำตอบ

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