Làm thế nào tôi có thể kiểm soát khả năng hiển thị khối với mã?


11

Trong Drupal 6, tôi có thể kiểm soát mức độ hiển thị của khối bằng mã PHP trong cấu hình UI khối như:

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

Các chức năng này đã tra cứu nút hiện tại, phân loại, vv để quyết định xem có hiển thị khối không. Tùy chọn PHP này đã biến mất trong Drupal 8, nhưng có một $visibilitytrường trong BlockBase. Tôi có thể sử dụng điều này để lập trình khả năng hiển thị khi chạy không?


1
Bạn nên khai báo một plugin điều kiện tùy chỉnh thay thế. Tìm kiếm cốt lõi cho @Condition để tìm các ví dụ hoạt động.
Mắt

Nói chung, viết mã PHP vào cơ sở dữ liệu là thực tế xấu và tránh được càng nhiều càng tốt.
Mắt

Mô-đun bộ lọc php đã bị xóa khỏi D8. Nói chung, một ý tưởng tồi là sử dụng php được nhập vào UI và được thực thi theo cách này. Đó là một ý tưởng tồi vì thiếu một; có thể làm tê liệt toàn bộ trang web và sau đó tôi sẽ được thuê để tìm kiếm db để tìm thấy sự mất tích; Điều này đã xảy ra,
Frank Robert Anderson

Đã đồng ý! Được chuyển càng nhiều mã càng tốt vào mô-đun và rất vui vì tôi có thể làm điều này với mã thuần trong D8!
Nic

Câu trả lời:


15

Một đoạn mã làm việc làm thế nào để sử dụng hook_block_access(). Ở đây tôi lấy điều kiện từ một trường của nút hiện tại:

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();
}

Cảm ơn @Insasse đã chia sẻ đá quý sau trong các bình luận. Đối với các khối tùy chỉnh được tạo theo chương trình, bạn có thể kiểm soát mức độ hiển thị trực tiếp từ bên trong lớp khối thông qua 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');
  }

}

Nguồn: Cách lập trình tạo một khối trong Drupal 8


1
Bạn thậm chí có thể viết kiểm tra truy cập trong lớp khối của mình -> webwash.net/programmatically-create-block-drupal-8
Insasse

7

Thiếu bộ lọc php trong Drupal 8, điều này sẽ không còn có thể từ UI.

Tùy chọn duy nhất là sử dụng khối api.

hook_block_accesscanidate tốt nhất của bạn. Từ đó bạn có thể kiểm tra $operationvà trả lại AccessResult dựa trên các điều kiện của bạn.

Giống như trong UI chỉ lần này đưa php vào một mô-đun.


4

Dưới đây là giải pháp Drupal 8: Chặn các trang loại trừ .

Mô-đun này thêm bộ lọc trang loại trừ cho các khối.

Để loại trừ các trang cụ thể sau thẻ đại diện hoặc ở giữa các ký tự đại diện, chỉ cần đặt tiền tố mẫu đường dẫn có tiền tố '!' trong cấu hình hiển thị trang khối.

Điều này hoạt động cho khả năng hiển thị được đặt thành "hiển thị cho các trang được liệt kê", trong trường hợp này, các đường dẫn loại trừ sẽ ẩn khối trên các trang khớp với mặc dù bộ ký tự đại diện được hiển thị.

Hoặc theo cách khác, nếu danh sách trang được đặt thành "ẩn cho các trang được liệt kê", các đường dẫn bị loại trừ sẽ hiển thị khối trên các trang nơi mẫu phù hợp mặc dù thẻ hoang dã được đặt để ẩn.

Block Exclude Pages screenshot



1

để mở rộng khả năng hiển thị khối, bạn có thể thử bản vá này:

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

nó giới thiệu toán tử kết hợp AND / OR cho các điều kiện hiển thị để bạn có thể nói oh Tôi muốn khối này hiển thị nếu đó là của my_content_type HOẶC người dùng có vai trò quản trị viên HOẶC url bắt đầu bằng / path / to / * vv .. cũng là điều kiện có thể bị phủ định để bạn có thể đặt nhiều điều kiện mà bạn không muốn khối của mình hiển thị

ngoài ra, nếu bạn sử dụng mô-đun Drupal Commerce, bạn có thể thử ở trên bằng cách cài đặt https://www.drupal.org/project/c Commerce_quick_purchase lưu ý rằng việc cài đặt mô-đun sẽ hiển thị chức năng này cho tất cả các khối trên hệ thống ngay cả khi bạn không ' t sử dụng khối được cung cấp bởi mô-đun xem thêm

https://github.com/drugan/c Commerce_quick_purchase#block-visibility

Ngoài ra, bạn có thể tạo plugin điều kiện của riêng bạn xem ví dụ từ mô-đun

https://cgit.drupalcode.org/c Commerce_quick_purchase/tree/src/Plugin/Condition

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.