ฉันจะควบคุมการเปิดเผยบล็อกด้วยรหัสได้อย่างไร


11

ใน Drupal 6 ฉันสามารถควบคุมการมองเห็นบล็อกโดยใช้โค้ด PHP ในการกำหนดค่าบล็อก UI เช่น:

<?php return MYMODULE_abc() || MYMODULE_def() ; ?>

ฟังก์ชั่นเหล่านี้ค้นหาโหนดปัจจุบันอนุกรมวิธาน ฯลฯ เพื่อตัดสินใจว่าจะแสดงบล็อคหรือไม่ ตัวเลือก PHP นี้หายไปใน Drupal 8 แต่มี$visibilityช่องBlockBaseว่าง ฉันสามารถใช้สิ่งนี้เพื่อตั้งค่าการมองเห็นขณะรันไทม์โดยทางโปรแกรมหรือไม่


1
คุณควรประกาศปลั๊กอินเงื่อนไขที่กำหนดเองแทน ค้นหาแกนสำหรับ @Condition เพื่อค้นหาตัวอย่างการทำงาน
Eyal

โดยทั่วไปการเขียนโค้ด PHP ลงในฐานข้อมูลเป็นการปฏิบัติที่ไม่ดีและควรหลีกเลี่ยงบ่าให้มากที่สุด
Eyal

โมดูลตัวกรอง php ถูกลบออกจาก D8 โดยทั่วไปมันเป็นความคิดที่ดีที่จะใช้ php ที่ป้อนใน UI และดำเนินการในลักษณะนี้ มันเป็นความคิดที่ไม่ดีเพราะขาด; สามารถทำลายเว็บไซต์ทั้งหมดและจากนั้นฉันจะได้รับการว่าจ้างเพื่อค้นหาฐานข้อมูลเพื่อหาสิ่งที่ขาดหายไป; สิ่งนี้เกิดขึ้น
Frank Robert Anderson

ตกลงกัน! ถูกย้ายรหัสมากที่สุดเท่าที่ฉันสามารถเข้าไปในโมดูลและดีใจที่ฉันสามารถทำได้ด้วยรหัสบริสุทธิ์ใน D8!
Nic

คำตอบ:


15

hook_block_access()ทำงานข้อมูลโค้ดวิธีการใช้งาน ที่นี่ฉันดึงเงื่อนไขจากเขตข้อมูลของโหนดปัจจุบัน:

use Drupal\block\Entity\Block;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\NodeInterface;
use Drupal\Core\Access\AccessResult;

/**
 * Implements hook_block_access().
 */
function MYMODULE_block_access(Block $block, $operation, AccountInterface $account) {

  $node = \Drupal::routeMatch()->getParameter('node');

  $hero_image_exists = FALSE;

  if ($node instanceof NodeInterface) {
    if ($node->hasField('field_hero_image')) {
      if (!$node->get('field_hero_image')->isEmpty()) {
        $hero_image_exists = TRUE;
      }
    }
  }

  if ($operation == 'view' && $block->getPluginId() == 'MYBLOCK') {
    return AccessResult::forbiddenIf($hero_image_exists == FALSE)->addCacheableDependency($block);
  }

  return AccessResult::neutral();
}

ขอบคุณ @Insasse สำหรับการแบ่งปันอัญมณีต่อไปนี้ในความคิดเห็น สำหรับบล็อกที่กำหนดเองที่สร้างโดยทางโปรแกรมคุณสามารถควบคุมการมองเห็นได้โดยตรงจากภายในคลาสบล็อกผ่านblockAccess():

class MyBlock extends BlockBase {
  /**
   * {@inheritdoc}
   */
  public function build() {
    return [
      '#markup' => $this->t('This is a simple block!'),
    ];
  }

  /**
   * {@inheritdoc}
   */
  protected function blockAccess(AccountInterface $account) {
    return AccessResult::allowedIfHasPermission($account, 'access content');
  }

}

แหล่งที่มา: วิธีการสร้างบล็อกโดยทางโปรแกรมใน Drupal 8


1
คุณสามารถเขียนเช็คการเข้าถึงในคลาสบล็อกของคุณ -> webwash.net/programmatically-create-block-drupal-8
Insasse

7

การขาดตัวกรอง php ใน Drupal 8 จะไม่สามารถทำได้จาก UI

ตัวเลือกเดียวคือใช้ block api

hook_block_accessเป็นคนดีที่สุดของคุณ จากตรงนั้นคุณสามารถตรวจสอบ$operationและคืน AccessResult ตามเงื่อนไขของคุณ

เช่นเดียวกับใน UI เพียงครั้งนี้การวาง php ลงในโมดูล


4

นี่คือวิธีการแก้ปัญหา Drupal 8: บล็อกยกเว้นหน้าเว็บ

โมดูลนี้เพิ่มตัวกรองเพจที่แยกออกสำหรับบล็อก

หากต้องการยกเว้นหน้าเว็บบางหน้าหลัง wild card หรืออยู่ระหว่าง wildcard เพียงนำหน้ารูปแบบพา ธ ด้วยคำนำหน้า '!' ในการกำหนดค่าการเปิดเผยหน้าบล็อก

ใช้งานได้กับชุดการมองเห็นเป็น "แสดงสำหรับหน้าเว็บที่ระบุ" ในกรณีนี้เส้นทางที่แยกจะซ่อนบล็อกในหน้าเว็บที่ตรงกับแม้จะมีการตั้งค่าไวด์การ์ดให้แสดง

หรือวิธีอื่น ๆ หากรายการหน้าถูกตั้งค่าเป็น "ซ่อนสำหรับหน้าเว็บที่ระบุ" เส้นทางที่ยกเว้นจะแสดงบล็อกในหน้าเว็บที่รูปแบบตรงกันแม้จะมีการตั้งค่าไวด์การ์ดให้ซ่อน

Block Exclude Pages screenshot


3

สำหรับ 8.2.x คุณจำเป็นต้องสร้างปลั๊กอินสภาพและดำเนินการContextProviderInterface

ดูตัวอย่างจาก DOแต่มันล้าสมัยอย่างใด (เพราะBlockEvent และ BlockSubscriberBase ถูกลบออกไปเนื่องจากบริการพื้นที่เก็บข้อมูลบริบท)

มันจะดีถ้าใช้ Drupal console เพื่อสร้างปลั๊กอิน:

drupal generate:plugin:condition

1

เพื่อขยายความเป็นไปได้ในการมองเห็นบล็อกคุณสามารถลองใช้โปรแกรมปรับปรุงนี้:

https://www.drupal.org/project/drupal/issues/923934#comment-12401360

มันแนะนำตัวดำเนินการAND / ORผู้ประกอบการสำหรับเงื่อนไขการมองเห็นเพื่อให้คุณสามารถพูดว่าโอ้ฉันต้องการบล็อกนี้มองเห็นได้ถ้ามันเป็นของ my_content_type หรือผู้ใช้มีบทบาทผู้ดูแลหรือ url เริ่มต้นด้วยของฉัน / เส้นทาง / ถึง / * ฯลฯ .. อาจถูกทำให้เป็นโมฆะเพื่อให้คุณสามารถกำหนดเงื่อนไขจำนวนมากที่คุณไม่ต้องการให้บล็อกของคุณปรากฏ

นอกจากนี้หากคุณใช้โมดูล Drupal Commerce คุณสามารถลองด้านบนได้โดยการติดตั้งhttps://www.drupal.org/project/commerce_quick_purchaseโมดูลหมายเหตุว่าการติดตั้งโมดูลนั้นจะทำให้ฟังก์ชั่นนี้ใช้กับบล็อกทั้งหมดในระบบแม้ว่าคุณจะไม่ได้ ห้ามใช้บล็อกที่โมดูลจัดเตรียมไว้ให้ดูเพิ่มเติม

https://github.com/drugan/commerce_quick_purchase#block-visibility

นอกจากนี้คุณสามารถสร้างปลั๊กอินเงื่อนไขของคุณเองดูตัวอย่างจากโมดูล

https://cgit.drupalcode.org/commerce_quick_purchase/tree/src/Plugin/Condition

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