Como migrar o conteúdo do bloco de um desenvolvedor para um site de produção?

24

Finalmente comecei a olhar seriamente para o Drupal 8 e estou particularmente interessado no gerenciamento de configurações. Encontrei algo que poderia ser um pouco problemático e que diz respeito ao conteúdo de blocos personalizados.

Percebo que o sistema de gerenciamento de configuração é capaz de exportar a configuração do bloco - região, tema, peso, visibilidade etc. No entanto, o conteúdo real do bloco não é encontrado na exportação da configuração, o que é razoável e compreensível.

Ao importar essa configuração de bloco para um site de produção, o que parece acontecer é que a configuração do bloco é criada e uma mensagem de espera é colocada no local, informando que o bloco está quebrado ou ausente. Obviamente, o conteúdo do bloco não existe no servidor de produção.

Como os blocos personalizados podem ser migrados de um servidor de desenvolvimento / temporariedade para um servidor de produção? Percebo que os blocos no Drupal 8 são entidades de campo como nós e, portanto, precisam ser migrados da mesma maneira. Entendo que existe uma API Migrate no Drupal 8, mas isso parece ter sido desenvolvido para a migração de conteúdo dos sites Drupal 6 e 7 para Drupal 8 em oposição aos sites Drupal 8 e Drupal 8.

Esse problema refere-se especificamente aos blocos personalizados, pois os blocos gerados por outros módulos, como o Views, serão obviamente migrados como configuração.


fonte
Existem várias soluções de conteúdo de preparo nas obras, incluindo módulo de implementar e entitypilot.com (disclaimer, esse é o meu produto)
larowlan
11
Similar: Erro de bloco no CMI
kenorb

Respostas:

7

Outra resposta que não vi mencionada aqui é usar o módulo Simple Block , que é praticamente idêntico à configuração do 'Custom Block' do núcleo, mas em vez de ter um híbrido estranho de conteúdo + configuração, você tem todas as configurações e conteúdo do bloco armazenado na configuração, que pode ser exportada e importada corretamente.

Consulte, para uma discussão mais aprofundada no núcleo do Drupal 8: Blocos personalizados não podem ser exportados e importados adequadamente .

geerlingguy
fonte
3

Acabei de publicar um módulo contribuído que resolve isso. Essencialmente, o módulo fornece um tipo de bloco com base na configuração (o bloco fixo) que envolve um bloco personalizado (o bloco de conteúdo). Se o bloco de conteúdo não existir, ele será criado com um conteúdo padrão ou vazio se nenhum conteúdo padrão foi definido. Tudo é feito através da interface do usuário, nenhum arquivo especial ou módulo personalizado é necessário.

Eu o nomeei Conteúdo de bloco fixo e é publicado em:

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

Manuel Adan
fonte
1

Outra abordagem para manter o conteúdo adicionado como parte do desenvolvimento também levado ao vivo é usar o módulo Conteúdo Padrão para exportar o conteúdo. Ele foi criado para o conteúdo a ser exportado para a pasta 'content' de um perfil de instalação e, em seguida, o módulo, se ativado, traz automaticamente o conteúdo quando o site é instalado, mas também é possível importar o conteúdo, um item de cada vez. , como em um gancho de atualização, com o código abaixo em example.install ou 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();
}

Exporte um bloco personalizado com um ID 8:

drush dcer block_content 8

(Se você não definir o caminho do seu perfil nas configurações de Drush, precisará especificá-lo acima.)

E use a exportação resultante no seu arquivo example.install como este:

<?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

mlncn
fonte
0

Não tenho certeza se vejo fortes vantagens em sincronizar configurações de blocos entre vários ambientes, pois os blocos estão tão entrelaçados com o conteúdo.

A razão para isso é que há um novo bloco sendo criado a partir dos arquivos yml que não possui título / corpo (conteúdo) e, portanto, está dando a mensagem 'quebrado / ausente'.

Você pode tentar criar o UUID (se quiser fazer o bloco nos dois lugares - verifique se o nome da máquina corresponde ...) na tabela de desenvolvimento block_content corresponde ao que você possui na produção (os outros relacionamentos parecem usar a entidade identidade). Então, quando você faz uma sincronização de configuração, pode ver as 'Visualizar diferenças' nos arquivos yml e, possivelmente, ver o que mais você precisa alterar no dev para fazer com que ele corresponda aos uuids de produção, etc. Consegui que isso funcionasse, mas ainda assim é mais fácil ignorar todas as suas configurações de bloco no código, a menos que você passe por esse processo ou crie algum tipo de sincronização de bloco de banco de dados para si mesmo usando block_content, block_content__body e block_content_field_data.

Não é muito elegante, mas pode permitir que você mantenha suas configurações de bloco no código. Caso contrário, se você continuar implantando blocos com a configuração, eles sempre estarão 'quebrados ou ausentes'.

Outra postagem do blog sugere a criação de um bloco personalizado no ambiente ativo, mas não o colocando. Após a sincronização do banco de dados com o dev, o bloco personalizado pode ser configurado, exportado a configuração e, como ele já existe na importação ao vivo da veiculação, é possível.

ArcebispoLolly
fonte
0

Tendo o mesmo problema e não realmente uma solução, apenas acréscimos: no desenvolvimento colaborativo, estamos usando um servidor intermediário que extrai do repositório e redefine toda a configuração. Isso significa que a configuração do bloco está sendo redefinida automaticamente; você simplesmente não pode colocar os blocos que considera como "conteúdo" diretamente nesse servidor.

É fácil usar a sincronização drush config-export, sabendo exatamente o que você fez e tendo certeza de que quaisquer alterações nas configurações são destinadas à implantação. Mas Drupal decide para nós que os blocos são de configuração (enquanto obviamente o conteúdo do bloco é tratado como conteúdo). Portanto, isso parece estar quebrado pelo design.

Pelo tempo previsto, acho que a solução mais prática seria adicionar os arquivos yml relacionados ao bloco no .gitignore.

hexabinaer
fonte
11
Configuração Ignorar é provável melhor do que .gitignore: drupal.org/project/config_ignore
bdanin
0

No entanto, também não tenho certeza, se você não encontrou nenhuma solução, consulte este módulo https://www.drupal.org/project/deploy . Francamente falando, não me lembro de poder implantar blocos push do DEV para o PROD ou não.

Ruslan P
fonte
0

Eu acho que a melhor maneira de lidar com isso seria:

Isso é o que eu costumo ver pessoas usando e eu pessoalmente uso. Mas sincroniza o banco de dados inteiro em comparação apenas com o conteúdo do bloco.

Jigarius
fonte
Isso pode funcionar se não houver nenhum problema com a substituição do banco de dados. Agora, se o único desejo é mover um novo bloco personalizado para um banco de dados existente, esse método seria difícil de implementar.
karolus
Essa resposta tem seu lugar, em teoria. Mas, na prática, essa não é uma boa solução, especialmente se o projeto estiver usando a divisão de configuração ou tiver uma configuração diferente entre os ambientes (o que é muito provável).
Komlenic
0

Por favor, tenha em mãos o módulo de sincronização de estrutura .

A sincronização de estrutura fornece comandos Drush e telas da interface do administrador para sincronizar o conteúdo que também pode ser considerado configuração. Incluindo itens de menu, blocos personalizados e termos de taxonomia.

Passos:

  1. Vá para a sincronização da estrutura.
  2. Vá para a guia Blocos.
  3. Exportação.
  4. Suas configurações e conteúdo serão exportados na pasta de configuração.
  5. Leve as configurações para outros sites e Importar.
  6. Vá para a sincronização da estrutura e clique em importar.
  7. Feito
Pranay Agarwal
fonte