Jak programowo umieścić blok?

10

Z interfejsu użytkownika możesz dodać blok w regionie w następujący sposób:

  1. Przejdź do Administrator -> Struktura -> Układ bloku (/ admin / structure / block).
  2. Kliknij przycisk „Umieść blok” obok nazwy regionu.

Chcę zrobić to samo, ale programowo. Jak dodać istniejący blok do regionu i zapisać go? Blok ten powinien zostać wyświetlony w tym regionie i być dostępny na stronie Układ bloku .

użytkownik3554770
źródło
Po utworzeniu bloku możesz zmienić położenie bloku z: nazwa_strony / admin / structure / block
Crazyrubixfan 31.08.16
Zakładam, że źle wpisałeś „przypisz blok do regionu”.
cilefen
@IcecreamJelly to, co próbuję zrobić, to zrobić to programowo. cilefen, tak, to jest to, co mam na myśli% -)
jmzea
@ShawnConn dzięki, to podobne, ale nie dokładnie takie same. Znalazłem odpowiedź gdzieś indziej.
jmzea

Odpowiedzi:

9

Aby zapewnić blok wtyczki , możesz zbudować tablicę ustawień i przekazać ją, \Drupal\block\Entity\Block::create()aby utworzyć obiekt Block i zapisać instancję.

Na przykład, jeśli chcesz dodać blok PHP Devel Execute do motywu Seven:

$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();
Shawn Conn
źródło
Cześć, potrzebuję pomocy. Utworzyłem niestandardowy blok za pomocą interfejsu użytkownika i chcę programowo umieścić go w obszarze stopki do celów testowych. Nie wiem, jak uzyskać wtyczkę z niestandardowych bloków utworzonych przez interfejs użytkownika .. dzięki
Mudassar Ali
Zadaj to jako kolejne pytanie. Komentarze nie służą do zadawania pytań.
Shawn Conn
już tam jest. drupal.stackexchange.com/questions/207042/…
Mudassar Ali
Jaki jest tutaj identyfikator ? czy jest taki sam jak nazwa bloku?
Crazyrubixfan,
@RubberDuckIsKing Wierzę, że możesz nazwać idwszystko, co chcesz, o ile jest unikalne. Na przykład możesz chcieć uruchomić go z nazwą modułu, w którym się znajduje.
Parag
7

Możesz użyć modułu dostosowującego Twig :

Moduł Twig Tweak zapewnia rozszerzenie Twig z kilkoma przydatnymi funkcjami i filtrami, które mogą poprawić doświadczenia programistów.

A następnie w regionie szablonu gałązki:

{{ drupal_block('block_id') }}
rpayanm
źródło
Problem z tym rozwiązaniem polega na tym, że poprawki gałązek nadal wymagają umieszczenia bloku, a następnie jego „wyłączenia”.
leksykant
6

Każde wystąpienie bloku (co „typu bloku”, konfiguracji i rozmieszczenia) jest jednostką konfiguracji: \Drupal\block\Entity\Block. Wszystko, co musisz zrobić, to utworzyć nową instancję tego elementu z poprawnymi szczegółami i gotowe.

Można to zrobić, ale jest to szalenie skomplikowane, musisz zrozumieć system wtyczek, zablokować system wtyczek i wiele więcej.

Możesz \Drupal\block\BlockForm::submitFormrzucić okiem, aby poczuć to lub \Drupal\simpletest\BlockCreationTrait::placeBlock. Możesz zastanowić się, czy jest to coś, czego naprawdę potrzebujesz, widoczność bloku jest dość złożona.

googletorp
źródło
4
Pomijając może warunki widoczności, nie sądzę, że to takie skomplikowane. \ Drupal \ simpletest \ BlockCreationTrait :: placeBlock () jest prawdopodobnie lepszym przykładem do obejrzenia, możesz też po prostu zaimportować niektóre wyeksportowane pliki konfiguracyjne.
Berdir,
@Berdir Dzięki za link do cechy testowej, dodałem ją. Ponieważ Drupal 8 jest wciąż taki młody, wiele osób nie wie dużo o systemie wtyczek, a dokumentacja mogłaby wykorzystywać więcej przypadków użycia itp., Co może sprawić, że wielu deweloperów będzie ciężko z nim pracować.
googletorp
Felix Eve ma najlepszą odpowiedź. To nie jest szalony kompleks.
kratos
@kratos Odpowiedź, której udzielił Felix, nie rozwiązuje problemu „programowego” umieszczania bloku, ale zamiast tego używa plików konfiguracyjnych. Konfiguracja może być importowana tylko poprzez drush, interfejs synchronizacji konfiguracji lub instalację modułu. Jeśli
zajdzie taka
4

Właśnie uczę się D8, ale wydaje mi się, że znalazłem znacznie łatwiejszy sposób programowego umieszczenia bloku (wydawało się to dość zastraszające po przeczytaniu odpowiedzi googletorp!)

Kiedy włączyłem moduł niestandardowy, który zdefiniował blok, chciałem, aby blok był automatycznie umieszczany we właściwym regionie. Kroki, które zastosowałem, aby to osiągnąć:

  1. Włącz moduł i umieść blok za pomocą interfejsu użytkownika w /admin/structure/block
  2. Przejdź do strony eksportu konfiguracji pojedynczego elementu na admin/config/development/configuration/single/export
  3. Wybierz blok Typ konfiguracji , a dla nazwy Konfiguracji wybierz blok, który właśnie umieściłeś za pomocą interfejsu użytkownika, a następnie skopiuj wygenerowany kod.
  4. W swoim module utwórz folder /config/install/
  5. W wygenerowanym obszarze tekstowym kodu podana jest nazwa pliku, którego należy użyć. Utwórz ten plik w /config/installkatalogu i skopiuj tam kod.
  6. Teraz, gdy odinstalujesz moduł, a następnie włączysz go ponownie, blok zostanie automatycznie umieszczony.
Felix Eve
źródło
czy nie musisz usuwać UUID, aby działało to dla innych programistów lub środowisk?
powpow12
Tak - usunięcie UUID byłoby dobrym pomysłem.
Felix Eve
Możesz także użyć konsoli Drupal, która zajmuje się automatyzacją niektórych z tych zadań: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/…
Beau
2

Powyższy przykład jest wystarczająco blisko, ale nadal nie jest poprawny. Chodzi o to, że musisz wymyślić własny identyfikator instancji bloku (w moim przypadku devel_execute_php_1112 (może dlatego, że próbowałem sprawić, by działał 1112 razy, pozostanie tajemnicą)), a następnie rzeczywisty identyfikator bloku (ten, który jest zadeklarowany dla bloków niestandardowych w adnotacji) i kompozycji. Następnie ustaw region i możesz już iść. Utworzono wystąpienie bloku w pożądanym regionie.

$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: Właściwie sprawdziłem później powyższy komentarz - i ma rację. Po prostu nie jest jasne, że id jest czymś, co musisz wymyślić. Jako odkupienie mojego kiepskiego komentarza opublikuję rozwiązanie dotyczące tworzenia instancji bloku niestandardowego elementu blokowego:

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

w zasadzie to samo, ale dla wtyczki piszesz zawartość bloku: uuid_of_custom_block_entity_instance

Nikołaj Borysow
źródło