Über die Benutzeroberfläche können Sie einen Block in einer Region folgendermaßen hinzufügen:
- Gehen Sie zu Admin -> Struktur -> Blocklayout (/ admin / Struktur / Block).
- Klicken Sie neben dem Regionsnamen auf die Schaltfläche "Block platzieren".
Ich möchte das Gleiche tun, aber programmatisch. Wie füge ich einer Region einen vorhandenen Block hinzu und speichere ihn? Dieser Block sollte dann in dieser Region angezeigt werden und auf der Seite Blocklayout verfügbar sein .
Antworten:
Um einen Plugin-Block bereitzustellen , können Sie ein Array von Einstellungen
\Drupal\block\Entity\Block::create()
erstellen und an übergeben , um das Block-Objekt zu erstellen und die Instanz zu speichern.Wenn Sie beispielsweise dem Seven-Thema einen Devel Execute PHP- Block hinzufügen möchten :
quelle
id
alles benennen, was Sie wollen, solange es einzigartig ist. Zum Beispiel möchten Sie es vielleicht mit dem Namen des Moduls starten, in dem es sich befindet.Sie können das Twig Tweak- Modul verwenden:
Und dann auf Ihrer Zweigvorlagenregion:
quelle
Jede Instanz eines Blocks (welcher "Blocktyp", welche Konfiguration und welche Platzierung) ist eine Konfigurationsentität :
\Drupal\block\Entity\Block
. Sie müssen also nur eine neue Instanz dieser Entität mit den richtigen Details erstellen, und schon sind Sie fertig.Dies kann getan werden, ist aber verrückt komplex. Sie müssten das Plugin-System, das Block-Plugin-System und vieles mehr verstehen.
Sie können einen Blick darauf werfen
\Drupal\block\BlockForm::submitForm
, um ein Gefühl dafür zu bekommen oder\Drupal\simpletest\BlockCreationTrait::placeBlock
. Vielleicht möchten Sie darüber nachdenken, ob dies etwas ist, das Sie wirklich brauchen. Die Sichtbarkeit des Blocks ist ziemlich komplex.quelle
Ich lerne gerade D8, aber ich habe anscheinend einen viel einfacheren Weg gefunden, einen Block programmgesteuert zu platzieren (es schien ziemlich einschüchternd, nachdem ich die Antwort von googletorp gelesen hatte!)
Als ich mein benutzerdefiniertes Modul aktivierte, das den Block definierte, wollte ich, dass der Block automatisch in der richtigen Region platziert wird. Schritte, die ich verwendet habe, um dies zu erreichen, sind:
/admin/structure/block
admin/config/development/configuration/single/export
/config/install/
/config/install
Verzeichnis und kopieren Sie den Code dort hinein.quelle
Ich fand die Antwort dank So manipulieren Sie eine Entität: Blockieren Sie programmgesteuert in Drupal 8 .
quelle
Das obige Beispiel ist nah genug, aber immer noch nicht korrekt. Die Idee ist, dass Sie Ihre eigene ID der Blockinstanz (in meinem Fall devel_execute_php_1112 (vielleicht weil ich versucht habe, es 1112 Mal zum Laufen zu bringen, es bleibt ein Rätsel)) und dann die tatsächliche Block-ID (die, die das ist) erstellen müssen wird für die benutzerdefinierten Blöcke in der Anmerkung und das Thema deklariert. Dann stellen Sie einfach die Region ein und Sie können loslegen. Erstellt eine Instanz eines Blocks unter der gewünschten Region.
edit1: Ich habe den obigen Kommentar später tatsächlich überprüft - und er ist richtig. Es ist einfach nicht klar, dass die ID etwas ist, das Sie sich einfallen lassen müssen. Als Einlösung für meinen lahmen Kommentar werde ich eine Lösung zum Erstellen einer Blockinstanz einer benutzerdefinierten Blockentität veröffentlichen:
Im Grunde das gleiche, aber für ein Plugin schreiben Sie block_content: uuid_of_custom_block_entity_instance
quelle