it-swarm.com.de

Wie kann ich die Blocksichtbarkeit mit Code steuern?

In Drupal 6) konnte ich die Blocksichtbarkeit mit PHP Code in der Block-UI-Konfiguration wie folgt steuern):

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

Diese Funktionen haben den aktuellen Knoten, die Taxonomie usw. nachgeschlagen, um zu entscheiden, ob der Block angezeigt werden soll. Diese PHP Option ist weg in Drupal 8, aber es gibt ein $visibility Feld in BlockBase. Kann ich damit die Sichtbarkeit zur Laufzeit programmgesteuert einstellen?

11
Nic

Ein Arbeitscode-Snippet zur Verwendung von hook_block_access() . Hier rufe ich die Bedingung aus einem Feld des aktuellen Knotens ab:

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

Vielen Dank an @Insasse, dass Sie das folgende Juwel in den Kommentaren geteilt haben. Bei programmgesteuert erstellten benutzerdefinierten Blöcken können Sie die Sichtbarkeit direkt aus der Blockklasse heraus über blockAccess() steuern:

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

}

Quelle: So erstellen Sie programmgesteuert einen Block in Drupal 8

16
leymannx

Ohne den PHP-Filter in Drupal 8) ist dies über die Benutzeroberfläche nicht mehr möglich.

Die einzige Möglichkeit ist die Verwendung der Block-API.

hook_block_access ist dein bester Kandidat. Von dort aus können Sie die $operation und geben Sie ein AccessResult zurück, das auf Ihren Bedingungen basiert.

Genau wie in der Benutzeroberfläche nur diesmal das PHP in ein Modul setzen.

Hier ist die Drupal 8-Lösung: Block Exclude Pages .

Dieses Modul fügt einen Ausschlussseitenfilter für Blöcke hinzu.

Um bestimmte Seiten nach dem Platzhalter oder zwischen Platzhaltern auszuschließen, stellen Sie dem Pfadmuster einfach das Präfix '!' Vor. in der Konfiguration der Sichtbarkeit der Blockseite.

Dies funktioniert für die Sichtbarkeit, die auf "Für die aufgelisteten Seiten anzeigen" eingestellt ist. In diesem Fall wird durch die Ausschlusspfade der Block auf Seiten ausgeblendet, die trotz des angezeigten Platzhalters mit dem übereinstimmen.

Oder umgekehrt: Wenn die Seitenliste auf "Für die aufgelisteten Seiten ausblenden" eingestellt ist, zeigen die ausgeschlossenen Pfade den Block auf Seiten an, auf denen das Muster übereinstimmt, obwohl der Platzhalter ausgeblendet ist.

(Block Exclude Pages screenshot

4
Juyal Jee

Für 8.2.x müssen Sie ein Condition Plugin erstellen und das - implementieren ContextProviderInterface.

Siehe ein Beispiel von D.O. , aber es ist irgendwie veraltet (weil BlockEvent und BlockSubscriberBase entfernt zugunsten eines Kontext-Repository-Dienstes).

Es wäre schön, auch die Drupal Konsole) zu verwenden, um das Plugin zu generieren:

drupal generate:plugin:condition
3

um die Möglichkeiten der Blocksichtbarkeit zu erweitern, können Sie diesen Patch ausprobieren:

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

es führt die [~ # ~] und [~ # ~] / [~ # ~] oder [~ # ~] Konjunktionsoperator für die Sichtbarkeitsbedingungen, sodass Sie sagen können: Oh, ich möchte, dass dieser Block sichtbar ist, wenn er vom Typ my_content_typ [~ # ~] oder [~ ist # ~] Benutzer hat Administratorrolle [~ # ~] oder [~ # ~] Die URL beginnt mit meiner/path/to/* etc .. auch die Bedingungen könnten negiert werden, so dass Sie viele Bedingungen festlegen können, unter denen Ihr Block nicht sichtbar sein soll

auch wenn Sie das Modul Drupal Commerce) verwenden, können Sie dies versuchen, indem Sie das Modul https://www.drupal.org/project/commerce_quick_purchase installieren Das Modul stellt diese Funktionalität für alle Blöcke im System bereit, auch wenn Sie den vom Modul bereitgestellten Block nicht verwenden. Weitere Informationen finden Sie hier

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

zusätzlich können Sie Ihr eigenes Zustands-Plugin erstellen, siehe Beispiel aus dem Modul

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

1
drugan