¿Cómo migro el contenido de bloque de un desarrollador a un sitio de producción?

24

Finalmente comencé a mirar Drupal 8 en serio y estoy particularmente interesado en la gestión de la configuración. Me he encontrado con algo que podría ser un poco problemático y que se refiere al contenido de bloque personalizado.

Puedo ver que el sistema de gestión de la configuración puede exportar la configuración del bloque: región, tema, peso, visibilidad, etc. Sin embargo, el contenido real del bloque no aparece en la exportación de la configuración, lo cual es razonable y comprensible.

Al importar esa configuración de bloque a un sitio de producción, lo que parece suceder es que se crea la configuración de bloque y se coloca un mensaje de retención, informando que el bloque está roto o falta. Obviamente, el contenido del bloque no existe en el servidor de producción.

¿Cómo se pueden migrar bloques personalizados de un servidor de desarrollo / preparación a un servidor de producción? Me doy cuenta de que los bloques en Drupal 8 son entidades confiables, como los nodos, por lo que deberán migrarse de la misma manera y entiendo que hay una API de Migrate en Drupal 8, pero parece estar construida para migrar contenido de sitios Drupal 6 y 7 a Drupal 8 en lugar de Drupal 8 a Drupal 8 sitios.

Este problema se refiere específicamente a los bloques personalizados, ya que los bloques generados por otros módulos, como Vistas, obviamente migrarán a través de la configuración.


fuente
Hay varias soluciones de preparación de contenido en proceso que incluyen el módulo de implementación y entitypilot.com (descargo de responsabilidad, ese es mi producto)
larowlan
1
Similar: Error de bloqueo en CMI
kenorb

Respuestas:

7

Otra respuesta que no he visto aquí es usar el módulo Simple Block , que es prácticamente idéntico a la configuración de 'Bloque personalizado' del núcleo, pero en lugar de tener un extraño híbrido de contenido + configuración, tiene todas las configuraciones y contenido de bloque almacenado en la configuración, que se puede exportar e importar limpiamente.

Consulte, para una discusión más detallada en Drupal 8 core: los bloques personalizados no se pueden exportar e importar correctamente .

geerlingguy
fuente
3

Acabo de publicar un módulo contribuido que resuelve esto. Esencialmente, el módulo proporciona un tipo de bloque basado en la configuración (el bloque fijo) que envuelve un bloque personalizado (el bloque de contenido). Si el bloque de contenido no existe, se crea con un contenido predeterminado o está vacío si no se configuró ningún contenido predeterminado. Todo se hace a través de la interfaz de usuario, no se necesitan archivos especiales o módulos personalizados.

Lo llamé Contenido de bloque fijo y se publica en:

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

Manuel Adán
fuente
1

Otro enfoque para mantener el contenido que se agrega como parte del desarrollo que también se activa es usar el módulo Contenido predeterminado para exportar el contenido. Está diseñado para que el contenido se exporte a la carpeta 'contenido' de un perfil de instalación, y luego el módulo, si está habilitado, trae automáticamente el contenido cuando se instala el sitio, pero también es posible importar el contenido un elemento a la vez , como en un enlace de actualización, con el siguiente código en su archivo 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();
}

Exporte un bloque personalizado con un ID de 8:

drush dcer block_content 8

(Si no configura la ruta de su perfil en la configuración de Drush , deberá especificarla arriba).

Y use la exportación resultante en su archivo 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
fuente
0

No estoy seguro de ver grandes ventajas de sincronizar configuraciones de bloques entre múltiples entornos, ya que los bloques están tan entrelazados con el contenido.

La razón de esto es que se está creando un nuevo bloque a partir de los archivos yml que no tiene título / cuerpo (contenido) y, por lo tanto, está dando el mensaje 'roto / faltante'.

Puede intentar hacer que el UUID (si desea hacer el bloque en ambos lugares, asegúrese de que el nombre de la máquina coincida ...) en su tabla de desarrollo block_content coincida con el uuid que tiene en producción (las otras relaciones parecen usar la entidad carné de identidad). Luego, cuando haces una sincronización de configuración, puedes ver 'Ver diferencias' en los archivos yml y posiblemente ver qué más necesitas cambiar en el desarrollador para que coincida con los uuids de producción, etc. Lo hice funcionar, pero aún así me di cuenta Es más fácil ignorar todas las configuraciones de bloque en el código a menos que realice este proceso o cree algún tipo de sincronización de bloque de base de datos para usted usando block_content, block_content__body y block_content_field_data.

No es muy elegante, pero podría permitirle mantener sus configuraciones de bloque en el código. De lo contrario, si sigue implementando bloques con config, siempre estarán "rotos o faltantes".

Otra publicación de blog sugiere crear un bloque personalizado en un entorno en vivo pero no colocarlo. Después de sincronizar la base de datos con el desarrollo, se puede configurar el bloqueo personalizado, exportar la configuración y, dado que ya existe en la importación en vivo de la ubicación, es posible.

ArzobispoLolly
fuente
0

Al tener el mismo problema y no realmente una solución, solo adiciones: en el desarrollo colaborativo, estamos utilizando un servidor provisional que extrae del repositorio y restablece toda la configuración. Esto significa que la configuración de bloque se restablece automáticamente, simplemente no puede colocar bloques que considere "contenido" directamente en ese servidor.

Es fácil usar la sincronización drush config-export mientras se sabe exactamente lo que ha hecho y se asegura de que cualquier cambio de configuración esté destinado a la implementación. Pero Drupal decide por nosotros que los bloques son configuración (mientras que obviamente el contenido del bloque se maneja como contenido). Así que esto parece estar roto por diseño.

Por el tiempo dado, creo que la solución más práctica sería agregar los archivos yml relacionados con el bloque a .gitignore.

hexabinaer
fuente
1
Config Ignore es probablemente mejor que .gitignore: drupal.org/project/config_ignore
bdanin
0

Sin embargo, no estoy seguro, si no encontró ninguna solución, puede consultar este módulo https://www.drupal.org/project/deploy . Hablando francamente, no recuerdo que pueda implementar bloques de inserción de DEV a PROD o no.

Ruslan P
fuente
0

Creo que la mejor manera de manejar esto sería:

Esto es lo que generalmente veo a las personas usando y yo personalmente uso. Pero sincroniza toda la base de datos en comparación con solo el contenido del bloque.

Jigarius
fuente
Eso puede funcionar si no hay problemas con la sobrescritura de una base de datos. Ahora, si el único deseo es mover un nuevo bloque personalizado a una base de datos existente, este método sería difícil de implementar.
karolus
Esta respuesta tiene su lugar, en teoría. Pero en la práctica, esta no es una buena solución, especialmente si el proyecto está usando una división de configuración o tiene una configuración diferente entre entornos (lo cual es muy probable).
komlenic el
0

Tenga manos en el módulo de sincronización de estructura .

La sincronización de estructura proporciona comandos de Drush y pantallas de interfaz de administración para sincronizar contenido que también podría considerarse configuración. Incluyendo elementos de menú, bloques personalizados y términos de taxonomía.

Pasos:

  1. Ir a la sincronización de estructura.
  2. Vaya a la pestaña Bloques.
  3. Exportar.
  4. Sus configuraciones y contenido se exportarán a la carpeta de configuración.
  5. Lleve las configuraciones a otros sitios e importe.
  6. Vaya a sincronización de estructura y haga clic en importar.
  7. Hecho
Pranay Agarwal
fuente