Come migrare il contenuto del blocco da uno sviluppatore a un sito di produzione?


24

Ho finalmente iniziato a guardare Drupal 8 sul serio e sono particolarmente interessato alla gestione della configurazione. Mi sono imbattuto in qualcosa che potrebbe essere un po 'problematico e che riguarda il contenuto dei blocchi personalizzati.

Vedo che il sistema di gestione della configurazione è in grado di esportare la configurazione del blocco - regione, tema, peso, visibilità ecc. Tuttavia il contenuto del blocco effettivo non si trova nell'esportazione della configurazione, il che è ragionevole e comprensibile.

Durante l'importazione di quella configurazione di blocco in un sito di produzione, ciò che sembra accadere è la configurazione di blocco creata e un messaggio di mantenimento inserito, che segnala che il blocco è rotto o mancante. Ovviamente il contenuto del blocco non esiste sul server di produzione.

Come è possibile migrare i blocchi personalizzati da un server di sviluppo / gestione temporanea a un server di produzione? Mi rendo conto che i blocchi in Drupal 8 sono entità fieldable come nodi e quindi dovranno essere migrati allo stesso modo e capisco che esiste un'API Migrate in Drupal 8 ma questo sembra essere costruito per la migrazione di contenuti dai siti Drupal 6 e 7 a Drupal 8 invece di Drupal 8 a Drupal 8 siti.

Questo problema riguarda in particolare i blocchi personalizzati in quanto i blocchi generati da altri moduli come Views verranno ovviamente migrati come configurazione.

blocks  8 

Esistono diverse soluzioni di gestione temporanea dei contenuti, tra cui il modulo deploy e entitypilot.com (disclaimer, questo è il mio prodotto)
larowlan

Risposte:


7

Un'altra risposta che non ho visto menzionato qui è di utilizzare il modulo Simple Block , che è praticamente identico alla configurazione del 'Custom Block' del core, ma invece di avere uno strano ibrido di content + config, hai tutte le impostazioni e il contenuto di Block memorizzato nella configurazione, che può essere esportato e importato in modo pulito.

Vedi, per ulteriori discussioni in Drupal 8 core: i blocchi personalizzati non possono essere esportati e importati correttamente .


3

Ho appena pubblicato un modulo contribuito che risolve questo. In sostanza, il modulo fornisce un tipo di blocco basato sulla configurazione (il blocco fisso) che avvolge un blocco personalizzato (il blocco del contenuto). Se il blocco di contenuto non esiste, viene creato con un contenuto predefinito o vuoto se non è stato impostato alcun contenuto predefinito. Tutto viene eseguito tramite l'interfaccia utente, non sono necessari file speciali o moduli personalizzati.

L'ho chiamato contenuto a blocchi fissi ed è pubblicato su:

https://www.drupal.org/project/fixed_block_content


1

Un altro approccio per mantenere attivo il contenuto aggiunto come parte dello sviluppo è quello di utilizzare il modulo Contenuto predefinito per esportare il contenuto. È costruito per il contenuto da esportare nella cartella "contenuto" di un profilo di installazione, quindi il modulo, se abilitato, inserisce automaticamente il contenuto quando il sito è installato, ma è anche possibile importare il contenuto un elemento alla volta , ad esempio in un hook di aggiornamento, con il codice seguente in example.install o example.profile:

<?php
/**
* Import a piece of content exported by default content module.
*/
function example_import_default_content($path_to_content_json) {
  list($entity_type_id, $filename) = explode('/', $path_to_content_json);
  $p = drupal_get_path('profile', 'guts');
  $encoded_content = file_get_contents($p . '/content/' . $path_to_content_json);
  $serializer = \Drupal::service('serializer');
  $content = $serializer->decode($encoded_content, 'hal_json');
  global $base_url;
  $url = $base_url . base_path();
  $content['_links']['type']['href'] = str_replace('http://drupal.org/', $url, $content['_links']['type']['href']);
  $contents = $serializer->encode($content, 'hal_json');
  $class = 'Drupal\\' . $entity_type_id . '\Entity\\' . str_replace(' ', '', ucwords(str_replace('_', ' ', $entity_type_id)));
  $entity = $serializer->deserialize($contents, $class, 'hal_json', array('request_method' => 'POST'));
  $entity->enforceIsNew(TRUE);
  $entity->save();
}

Esporta un blocco personalizzato con un ID di 8:

drush dcer block_content 8

(Se non imposti il ​​percorso del tuo profilo nelle impostazioni Drush, dovrai specificarlo sopra.)

E usa l'esportazione risultante nel tuo file example.install in questo modo:

<?php
/**
* Add the footer block content.
*
* Implements hook_update_N().
*/
function example_update_8001() {
  example_import_default_content('block_content/136efd63-021e-42ea-8202-8b97305cc07f.json');
}

http://data.agaric.com/easily-add-content-update-hooks-use-default-content-module-exports-create-content-needs-be-sync-conf


0

Non sono sicuro di vedere grandi vantaggi nella sincronizzazione delle configurazioni dei blocchi tra più ambienti poiché i blocchi sono così intrecciati con il contenuto.

La ragione di ciò è che viene creato un nuovo blocco dai file yml che non ha titolo / corpo (contenuto) e quindi fornisce il messaggio "rotto / mancante".

Potresti provare a rendere l'UUID (se vuoi creare il blocco in entrambi i posti - assicurati che il nome della macchina corrisponda ...) nella tabella di sviluppo block_content corrisponda a ciò che hai in produzione (le altre relazioni sembrano usare l'entità id). Quindi, quando si esegue una sincronizzazione di configurazione, è possibile vedere "Visualizza differenze" nei file yml e possibilmente vedere cos'altro è necessario modificare su dev per farlo corrispondere agli uuidi di produzione, ecc. Ho ottenuto che funzioni, ma ho ancora capito è più semplice ignorare tutte le configurazioni dei blocchi nel codice a meno che non si esegua questo processo o si crei un tipo di sincronizzazione dei blocchi del database per sé usando block_content, block_content__body e block_content_field_data.

Non è molto elegante ma potrebbe permetterti di mantenere le tue configurazioni di blocco nel codice. Altrimenti, se continui a distribuire blocchi con config, saranno sempre "rotti o mancanti".

Un altro post sul blog suggerisce di creare un blocco personalizzato nell'ambiente live ma di non posizionarlo. Dopo aver sincronizzato il database con dev, è possibile configurare il blocco personalizzato, esportare la configurazione e poiché è già presente nell'importazione live del posizionamento.


0

Avere lo stesso problema e non una vera soluzione, solo aggiunte: nello sviluppo collaborativo stiamo usando un server di gestione temporanea che estrae dal repository e reimposta tutta la configurazione. Ciò significa che la configurazione dei blocchi viene ripristinata automaticamente, semplicemente non è possibile posizionare i blocchi considerati "contenuti" direttamente su quel server.

È facile usare la sincronizzazione della config-export di drush pur sapendo esattamente cosa hai fatto ed essere sicuro che eventuali modifiche alle configurazioni siano pensate per la distribuzione. Ma Drupal decide per noi che i blocchi sono configurazione (mentre ovviamente il contenuto del blocco viene gestito come contenuto). Quindi questo sembra essere rotto dal design.

Per il momento, credo che la soluzione più pratica sarebbe quella di aggiungere i file yml relativi ai blocchi a .gitignore.


1
Config Ignore è probabilmente meglio di .gitignore: drupal.org/project/config_ignore
bdanin


0

Penso che il modo migliore per gestire questo sarebbe:

Questo è ciò che di solito vedo le persone che usano e che uso personalmente. Ma sincronizza l'intero database rispetto solo al contenuto del blocco.


Ciò può funzionare se non si verificano problemi con la sovrascrittura del database. Ora, se l'unico desiderio è quello di spostare un nuovo blocco personalizzato in un database esistente, questo metodo sarebbe difficile da implementare.
Karolus,

Questa risposta ha il suo posto, in teoria. Ma in pratica, questa non è una buona soluzione, specialmente se il progetto utilizza la suddivisione della configurazione o ha una diversa configurazione tra gli ambienti (il che è molto probabile).
komlenic

0

Si prega di avere le mani sul modulo di sincronizzazione della struttura .

La sincronizzazione della struttura fornisce comandi Drush e schermate dell'interfaccia di amministrazione per la sincronizzazione di contenuti che potrebbero anche essere considerati configurazione. Compresi voci di menu, blocchi personalizzati e termini di tassonomia.

passi:

  1. Vai a sincronizzazione struttura.
  2. Vai alla scheda Blocchi.
  3. Esportare.
  4. Le configurazioni e i contenuti verranno esportati nella cartella di configurazione.
  5. Porta le configurazioni su altri siti e importa.
  6. Vai a sincronizzazione struttura e fai clic su Importa.
  7. Fatto
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.