コードでブロックの可視性を制御するにはどうすればよいですか?


11

Drupal 6では、次のように、ブロックUI構成でPHPコードを使用してブロックの可視性を制御できます。

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

これらの関数は、現在のノードや分類法などを調べて、ブロックを表示するかどうかを決定しました。このPHPオプションはDrupal 8ではなくなりましたが、には$visibilityフィールドがありBlockBaseます。これを使用して、実行時にプログラムで可視性を設定できますか?


1
代わりに、カスタム条件プラグインを宣言する必要があります。コアで@Conditionを検索して、実用的な例を見つけます。
Eyal

一般的に、PHPコードをデータベースに書き込むことは悪い習慣であり、できる限り回避する必要があります。
Eyal

phpフィルターモジュールはD8から削除されました。一般に、PHPをUIに入力してこの方法で実行することはお勧めできません。;がないため、これは悪い考えです。サイト全体を不自由にする可能性があり、それから私は不足しているものを見つけるためにデータベースを検索するために雇われるでしょう。これが起こった、
フランクロバートアンダーソン

同意しました!可能な限り多くのコードをモジュールに移動し、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

可視性条件のAND / OR結合演算子が導入されているため、このブロックがmy_content_typeの場合、またはユーザーが管理者ロールを持っている場合、または URLがmy / path / to / *などで始まる場合に、このブロックを可視にする必要があります。条件も否定することができるので、ブロックを表示したくない多くの条件を設定できます

また、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.