it-swarm.com.de

Wie platziere ich programmgesteuert einen Block?

Über die Benutzeroberfläche können Sie einen Block in einer Region folgendermaßen hinzufügen:

  1. Gehen Sie zu Admin -> Struktur -> Blocklayout (/ admin/Struktur/Block).
  2. 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.

10
user3554770

Um einen Plugin-Block bereitzustellen, können Sie ein Array von Einstellungen erstellen und an \Drupal\block\Entity\Block::create() to übergeben Erstellen Sie das Block-Objekt und speichern Sie die Instanz.

Wenn Sie beispielsweise einen Devel Execute PHP - Block zum Seven-Thema hinzufügen möchten:

$values = array(
  // A unique ID for the block instance.
  'id' => 'devel_execute_php_1',
  // The plugin block id as defined in the class.
  'plugin' => 'devel_execute_php',
  // The machine name of the theme region.
  'region' => 'content',
  'settings' => array(
    'label' => 'Execute PHP',
  ),
  // The machine name of the theme.  
  'theme' => 'seven',
  'visibility' => array(),
  'weight' => 100,
);
$block = \Drupal\block\Entity\Block::create($values);
$block->save();
9
Shawn Conn

Sie können das Modul Twig Tweak verwenden:

Das Twig Tweak-Modul bietet eine Twig -Erweiterung mit einigen nützlichen Funktionen und Filtern, die die Entwicklererfahrung verbessern können.

Und dann auf Ihrer twig Vorlagenregion:

{{ drupal_block('block_id') }}
7
rpayanm

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 sich \Drupal\block\BlockForm::submitForm Anschauen, 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.

6
googletorp

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:

  1. Aktivieren Sie das Modul und platzieren Sie den Block über die Benutzeroberfläche unter /admin/structure/block
  2. Wechseln Sie zur Exportseite für die Konfiguration einzelner Elemente unter admin/config/development/configuration/single/export
  3. Wählen Sie Konfigurationstyp Block und für Konfigurationsname den Block aus, den Sie gerade über die Benutzeroberfläche platziert haben, und kopieren Sie dann den generierten Code.
  4. Erstellen Sie in Ihrem Modul den Ordner /config/install/
  5. Unter dem generierten Codetextbereich wird der Dateiname angezeigt, den Sie verwenden müssen. Erstellen Sie diese Datei im /config/install Verzeichnis und kopieren Sie den Code dort.
  6. Wenn Sie nun Ihr Modul deinstallieren und dann wieder aktivieren, wird der Block automatisch platziert.
4
Felix Eve

Ich fand die Antwort dank So manipulieren Sie eine Entität: Blockieren Sie programmgesteuert in Drupal 8 .

use Drupal\block\Entity\Block;

$block = Block::load('sitebranding');
$block->setRegion('content');
$block->save();
3
jmzea

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.

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'devel_execute_php_1112',
      'plugin' => 'devel_execute_php',
      'theme' => 'seven'
  )
);
$block->setRegion('content');
$block->save();

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:

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'ggggggggsssssss',
      'plugin' => 'block_content:79d53b4e-9e60-4f97-befc-101da919bb7a',
      'theme' => 'visitb_he_theme'
  )
);
$block->setRegion('content');

im Grunde das gleiche, aber für ein Plugin schreiben Sie block_content: uuid_of_custom_block_entity_instance

2
Nikolay Borisov