Come colloco programmaticamente un blocco?


10

Dall'interfaccia utente è possibile aggiungere un blocco in una regione in questo modo:

  1. Vai su Admin -> Struttura -> Layout del blocco (/ admin / struttura / blocco).
  2. Fai clic sul pulsante "Posiziona blocco" oltre al nome della regione.

Voglio fare la stessa cosa ma programmaticamente. Come faccio ad aggiungere un blocco esistente a una regione e salvarlo? Questo blocco dovrebbe quindi essere visualizzato in quella regione ed essere disponibile nella pagina Layout del blocco .


Dopo aver creato il blocco è possibile riorganizzare la posizione del blocco da: nome_sito / admin / struttura / blocco
Crazyrubixfan

Presumo che tu abbia scritto male "assegna un blocco a una regione".
cilefen,

@IcecreamJelly quello che sto cercando di fare è farlo programmaticamente. cilefen, sì, è quello che intendo% -)
jmzea,

@ShawnConn grazie, è simile, ma non esattamente lo stesso. Ho trovato la risposta da qualche altra parte.
jmzea,

Risposte:


9

Per fornire un blocco plug-in è possibile creare un array di impostazioni e passarlo a \Drupal\block\Entity\Block::create()per creare l'oggetto Block e salvare l'istanza.

Ad esempio, se si desidera aggiungere un blocco PHP Devel Execute al tema 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();

Ciao, ho bisogno di aiuto. Ho creato un blocco personalizzato utilizzando l'interfaccia utente e voglio posizionarlo nella regione di piè di pagina a scopo di test. Non so come ottenere plugin da blocchi personalizzati creati dall'interfaccia utente .. grazie
Mudassar Ali

Fai questa come un'altra domanda. I commenti non sono per porre domande.
Shawn Conn,


Qual è l' id qui? è uguale al nome del blocco?
Crazyrubixfan

@RubberDuckIsKing Credo che tu possa nominare idtutto quello che vuoi purché sia ​​unico. Ad esempio, potresti avviarlo con il nome del modulo in cui si trova.
Parag

7

Puoi usare il modulo Twig tweak :

Il modulo Twig Tweak fornisce un'estensione Twig con alcune utili funzioni e filtri che possono migliorare l'esperienza degli sviluppatori.

E poi nella tua regione modello ramoscello:

{{ drupal_block('block_id') }}

Il problema con questa soluzione è che i twig tweaks richiedono ancora di posizionare il blocco e quindi "disabilitarlo".
lessico

6

Ogni istanza di un blocco ( "tipo di blocco", la configurazione e il posizionamento) è un'entità di configurazione: \Drupal\block\Entity\Block. Quindi tutto ciò che devi fare è creare una nuova istanza di questa entità con i dettagli corretti e il gioco è fatto.

Questo può essere fatto ma è pazzesco e complesso, dovresti capire il sistema di plugin, bloccare il sistema di plugin e molto altro.

Puoi dare un'occhiata \Drupal\block\BlockForm::submitFormper avere un'idea di questo o \Drupal\simpletest\BlockCreationTrait::placeBlock. Potresti pensare a se questo è qualcosa di cui hai davvero bisogno, la visibilità del blocco è piuttosto complessa.


4
A parte forse le condizioni di visibilità, non credo sia complicato. \ Drupal \ simpletest \ BlockCreationTrait :: placeBlock () è probabilmente un esempio migliore da guardare, puoi anche importare solo alcuni file di configurazione esportati.
Berdir,

@Berdir Grazie per il link al tratto di prova, l'ho aggiunto. Poiché Drupal 8 è ancora così giovane, molte persone non sanno molto del sistema di plug-in e la documentazione potrebbe usare più casi d'uso ecc., Il che può rendere difficile a molti sviluppatori lavorare con esso.
googletorp

Felix Eve ha la risposta migliore. Non è un complesso folle.
Kratos,

@kratos La risposta che Felix ha fornito non sta effettivamente risolvendo la domanda su come posizionare un blocco "a livello di codice", ma utilizza invece i file di configurazione. La configurazione può essere importata solo tramite drush, l'interfaccia di sincronizzazione della configurazione o l'installazione del modulo. Se dovesse accadere, durante il runtime, il salvataggio fx post di un tipo di nodo di frontpage della sezione ecc., Sarebbe inutile usare questa strategia :)
googletorp

4

Sto solo imparando D8 ma sembra che abbia trovato un modo molto più semplice per posizionare un blocco a livello di codice (mi è sembrato piuttosto intimidatorio dopo aver letto la risposta di googletorp!)

Quando ho abilitato il mio modulo personalizzato che ha definito il blocco, volevo che il blocco venisse automaticamente posizionato nella regione corretta. I passaggi che ho usato per raggiungere questo obiettivo sono:

  1. Abilitare il modulo e posizionare il blocco utilizzando l'interfaccia utente in /admin/structure/block
  2. Vai alla pagina di esportazione della configurazione del singolo articolo all'indirizzo admin/config/development/configuration/single/export
  3. Selezionare il blocco del tipo di configurazione e per il nome della configurazione selezionare il blocco che è stato appena inserito utilizzando l'interfaccia utente e quindi copiare il codice generato.
  4. Nel tuo modulo crea la cartella /config/install/
  5. Sotto la textarea del codice generato ti dice il nome del file che devi usare. Crea questo file nella /config/installdirectory e copia il codice lì dentro.
  6. Ora quando disinstalli il tuo modulo e poi lo riattivi, il blocco verrà automaticamente posizionato.

non dovresti rimuovere l'UUID perché funzioni per altri sviluppatori o ambienti?
powpow12,

Sì - rimuovere l'UUID sarebbe una buona idea.
Felix Eve,

Puoi anche utilizzare la console Drupal, che si occupa di automatizzare alcune di queste attività: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/…
Beau,


2

L'esempio sopra è abbastanza vicino ma ancora non corretto. L'idea è che devi trovare il tuo ID dell'istanza di blocco (nel mio caso devel_execute_php_1112 (forse perché ho provato a farlo funzionare 1112 volte, rimarrà un mistero)) e quindi l'ID del blocco effettivo (quello che è dichiarato per i blocchi personalizzati nell'annotazione) e il tema. Quindi imposta la regione e sei a posto. Creata un'istanza di un blocco nella regione desiderata.

$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: In realtà ho controllato più tardi il commento sopra - ed è giusto. Non è chiaro che l'id sia qualcosa che devi inventare. Come riscatto per il mio commento zoppo, posterò una soluzione su come creare un'istanza di blocco di un'entità di blocco personalizzata:

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

praticamente lo stesso ma per un plugin scrivi block_content: uuid_of_custom_block_entity_instance

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.