코드로 블록 가시성을 제어하려면 어떻게해야합니까?


11

Drupal 6에서는 다음과 같이 블록 UI 구성에서 PHP 코드를 사용하여 블록 가시성을 제어 할 수 있습니다.

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

이 함수는 현재 노드, 분류법 등을 찾아서 블록을 표시할지 여부를 결정했습니다. 이 PHP 옵션은 Drupal 8에서 사라졌지 만에 $visibility필드가 BlockBase있습니다. 이것을 사용하여 프로그래밍 방식으로 가시성을 런타임에 설정할 수 있습니까?


1
대신 사용자 정의 조건 플러그인을 선언해야합니다. @Condition의 핵심을 검색하여 실제 예제를 찾으십시오.
Eyal

일반적으로 PHP 코드를 데이터베이스에 작성하는 것은 나쁜 습관이며 가능한 한 많은 문제를 피해야합니다.
Eyal

PHP 필터 모듈이 D8에서 제거되었습니다. 일반적으로 UI에 입력하고 이런 식으로 실행하는 PHP를 사용하는 것은 좋지 않습니다. ; 누락 된 때문에 나쁜 생각입니다; 전체 사이트를 무너 뜨릴 수 있습니다. 그런 다음 누락 된 데이터베이스를 찾기 위해 DB를 검색하도록 고용됩니다. 이는 일이있다
프랭크 로버트 앤더슨을

동의했다! 모듈에 가능한 한 많은 코드가 옮겨졌으며 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

Drupal 8의 PHP 필터가 없기 때문에 더 이상 UI에서 사용할 수 없습니다.

유일한 옵션은 블록 API를 사용하는 것입니다.

hook_block_access 는 최고의 후보입니다. 거기 $operation에서 조건을 확인하고 AccessResult를 반환 할 수 있습니다 .

UI와 마찬가지로 이번에는 PHP를 모듈에 넣습니다.


4

Drupal 8 솔루션은 다음과 같습니다 : 블록 제외 페이지 .

이 모듈은 블록에 대한 페이지 제외 필터를 추가합니다.

와일드 카드 뒤 또는 와일드 카드 사이의 특정 페이지를 제외하려면 경로 패턴 앞에 접두사 '!'를 붙이십시오. 블록 페이지 가시성 구성에서.

이는 가시성이 "목록에있는 페이지에 표시"로 설정된 경우에 작동합니다.이 경우 제외 경로는 표시하도록 설정된 와일드 카드에도 불구하고 일치하는 페이지에서 블록을 숨 깁니다.

또는 다른 방법으로, 페이지 목록이 "목록에있는 페이지 숨기기"로 설정된 경우 제외 된 경로는 숨기기로 설정된 와일드 카드에도 불구하고 패턴이 일치하는 페이지에 블록을 표시합니다.

Block Exclude Pages screenshot



1

블록 가시성 가능성을 확장하기 위해이 패치를 시도 할 수 있습니다.

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

그것은 소개 / 또는 당신이 my_content_type의 경우 오 나는이 블록을 볼 수 원하는 말할 수 있도록 가시성 조건을 함께 연산자 또는 사용자가 관리자 역할이 또는 내 / 경로의 URL 시작 /에 / * 등도 .. 조건을 블록을 표시하지 않으려는 조건을 많이 설정할 수 있습니다.

또한 Drupal Commerce 모듈을 사용하는 경우 https://www.drupal.org/project/commerce_quick_purchase 모듈 을 설치하여 위를 시도 할 수 있습니다. 모듈을 설치 하면 시스템의 모든 블록에 대해이 기능이 노출되어 있음에도 불구하고 t 모듈에서 제공하는 블록을 사용하십시오

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.