In Drupal 6 konnte ich die Blocksichtbarkeit mithilfe von 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 in Drupal 8 weg, aber es gibt ein $visibility
Feld in BlockBase
. Kann ich damit die Sichtbarkeit zur Laufzeit programmgesteuert einstellen?
Antworten:
Ein Arbeitscode-Snippet zur Verwendung
hook_block_access()
. Hier rufe ich die Bedingung aus einem Feld des aktuellen Knotens ab: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 innerhalb der Blockklasse steuern über
blockAccess()
:Quelle: So erstellen Sie programmgesteuert einen Block in Drupal 8
quelle
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 das überprüfen
$operation
und ein AccessResult basierend auf Ihren Bedingungen zurückgeben.Genau wie in der Benutzeroberfläche nur diesmal das PHP in ein Modul setzen.
quelle
Hier ist die Drupal 8-Lösung: Block Exclude Pages .
quelle
Für 8.2.x müssen Sie ein Bedingungs-Plugin erstellen und das ContextProviderInterface implementieren .
Sehen Sie sich ein Beispiel von DO an, das jedoch irgendwie veraltet ist (da BlockEvent und BlockSubscriberBase zugunsten eines Kontext-Repository-Dienstes entfernt wurden).
Es wäre schön, auch die Drupal-Konsole zu verwenden, um das Plugin zu generieren:
quelle
Um die Möglichkeiten der Blocksichtbarkeit zu erweitern, können Sie diesen Patch ausprobieren:
https://www.drupal.org/project/drupal/issues/923934#comment-12401360
Es wird der AND / OR- Konjunktionsoperator für die Sichtbarkeitsbedingungen eingeführt, sodass Sie sagen können, dass dieser Block sichtbar sein soll, wenn er vom Typ my_content_type ist ODER der Benutzer eine Administratorrolle hat ODER die URL mit meinem / path / to / * etc beginnt. Auch die Bedingungen könnte negiert werden, so dass Sie viele Bedingungen festlegen können, unter denen Ihr Block nicht sichtbar sein soll
Wenn Sie das Drupal Commerce-Modul verwenden, können Sie dies auch versuchen, indem Sie das Modul https://www.drupal.org/project/commerce_quick_purchase installieren. Beachten Sie, dass bei der Installation des Moduls diese Funktionalität für alle Blöcke auf dem System verfügbar ist, auch wenn Sie dies nicht tun. t Verwenden Sie den vom Modul bereitgestellten Block. 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
quelle