블록 컨텐츠를 개발자에서 프로덕션 사이트로 마이그레이션하려면 어떻게합니까?


24

마침내 Drupal 8을 진지하게 살펴보기 시작했으며 특히 구성 관리에 관심이 있습니다. 약간 문제가 될 수 있고 사용자 정의 블록 내용과 관련이 있습니다.

구성 관리 시스템이 영역, 테마, 무게, 가시성 등과 같은 블록 구성을 내보낼 수 있지만 실제 블록 내용은 구성 내보내기에서 나오지 않으므로 합리적이고 이해할 수 있습니다.

해당 블록 구성을 프로덕션 사이트로 가져올 때 발생하는 것은 블록 구성이 생성되고 보류 메시지가 배치되어 블록이 손상되었거나 누락되었음을보고하는 것입니다. 분명히 블록 컨텐츠는 프로덕션 서버에 존재하지 않습니다.

개발자 / 스테이징 서버에서 프로덕션 서버로 커스텀 블록을 어떻게 마이그레이션 할 수 있습니까? Drupal 8의 블록은 노드와 같은 필드 가능한 엔티티이므로 동일한 방식으로 마이그레이션해야하며 Drupal 8에 Migrate API가 있음을 이해하지만 Drupal 6 및 7 사이트에서 컨텐츠를 마이그레이션하기 위해 빌드 된 것으로 보입니다. Drupal 8-Drupal 8 사이트와 달리 Drupal 8

이 문제는 특히 뷰와 같은 다른 모듈에 의해 생성 된 블록이 구성으로 분명히 마이그레이션되므로 사용자 지정 블록에 관한 것입니다.

blocks  8 

deploy 모듈 및 entitypilot.com (면책 조항, 그것이 내 제품 임)을 포함하여 몇 가지 컨텐츠 스테이징 솔루션이 있습니다.
larowlan

답변:


7

여기서 언급하지 않은 또 다른 대답은 코어의 '사용자 정의 블록'설정과 거의 동일한 단순 블록 모듈 을 사용하는 것이지만 내용 + 구성의 이상한 하이브리드 대신 모든 블록 설정 및 내용이 있습니다. 구성에 저장되어 깔끔하게 내보내고 가져올 수 있습니다.

Drupal 8 코어에 대한 자세한 내용은 사용자 정의 블록을 제대로 내보내고 가져올 수 없습니다를 참조하십시오 .


3

방금이 문제를 해결하는 기여 모듈을 게시했습니다. 기본적으로 모듈은 사용자 정의 블록 (컨텐츠 블록)을 래핑하는 구성 (고정 블록)을 기반으로 한 유형의 블록을 제공합니다. 컨텐츠 블록이 없으면 기본 컨텐츠로 작성되거나 기본 컨텐츠가 설정되어 있지 않으면 비어 있습니다. 모든 것은 UI를 통해 이루어지며 특별한 파일이나 사용자 정의 모듈이 필요하지 않습니다.

나는 그것을 고정 블록 내용으로 명명했고 그것은 다음에 출판되었다 ​​:

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


1

개발의 일부로 추가 된 컨텐츠를 유지하기위한 또 다른 방법은 기본 컨텐츠 모듈을 사용하여 컨텐츠를 내보내는 것입니다. 컨텐츠를 설치 프로파일의 'content'폴더로 내보낼 수 있도록 빌드 된 다음 사이트를 설치할 때 모듈이 컨텐츠를 자동으로 가져 오지만 한 번에 한 항목 씩 컨텐츠를 가져올 수도 있습니다 example.install 또는 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();
}

ID가 8 인 사용자 블록을 내 보냅니다.

drush dcer block_content 8

Drush 설정에서 프로필 경로를 설정 하지 않으면 위에서 지정해야합니다.

다음과 같이 example.install 파일에서 결과 내보내기를 사용하십시오.

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

블록이 콘텐츠와 너무 얽혀 있기 때문에 여러 환경에서 블록 구성을 동기화 할 때 어떤 장점이 있는지 잘 모르겠습니다.

그 이유는 제목 / 본문 (내용)이없는 yml 파일에서 새 블록이 생성되어 '깨진 / 누락'메시지가 표시되기 때문입니다.

개발 block_content 테이블에서 UUID를 만들려면 (두 곳에서 블록을 만들고 싶다면-머신 이름이 일치하는지 확인하십시오 ...) 프로덕션에서 가지고있는 UUID와 일치하십시오 (다른 관계는 엔티티를 사용하는 것처럼 보입니다) 신분증). 그런 다음 구성 동기화를 수행하면 yml 파일에서 '차이점보기'를 볼 수 있으며 프로덕션 uuid와 일치시키기 위해 dev에서 변경해야 할 사항이 있는지 확인할 수 있습니다. 이 프로세스를 거치거나 block_content, block_content__body 및 block_content_field_data를 사용하여 직접 데이터베이스 블록 동기화를 작성하지 않으면 코드에서 모든 블록 구성을 무시하는 것이 가장 쉽습니다.

매우 우아하지는 않지만 블록 구성을 코드로 유지할 수 있습니다. 그렇지 않으면 config로 블록을 계속 배포하면 항상 '손상되거나 누락'됩니다.

또 다른 블로그 게시물 은 실제 환경에서 커스텀 블록을 생성하지만 배치하지 말 것을 제안합니다. 데이터베이스를 dev에 동기화 한 후 사용자 정의 블록을 구성하고 구성을 내보낼 수 있으며 배치의 실시간 가져 오기에 이미 존재하므로 가능합니다.


0

동일한 문제가 있지만 실제로는 해결 방법이 아닌 추가 사항 만 있습니다. 공동 개발에서는 리포지토리에서 가져와 모든 구성을 재설정하는 준비 서버를 사용하고 있습니다. 이는 블록 구성이 자동으로 재설정됨을 의미하며, 단순히 "콘텐츠"로 간주하는 블록을 해당 서버에 직접 배치 할 수 없습니다.

수행 한 작업을 정확히 알고 구성 변경 사항이 배포를위한 것인지 확인하면서 drush config-export 동기화를 사용하기 쉽습니다. 그러나 Drupal은 블록이 구성 (블록 컨텐츠는 컨텐츠로 처리됨)을 결정합니다. 따라서 이것은 의도적으로 고장난 것 같습니다.

주어진 시간 동안 가장 실용적인 해결책은 블록 관련 yml 파일을 .gitignore에 추가하는 것입니다.


1
구성 무시는 .gitignore보다 낫습니다. drupal.org/project/config_ignore
bdanin


0

나는 이것을 처리하는 가장 좋은 방법은 다음과 같다고 생각합니다.

이것은 내가 사람들이 일반적으로 사용하고 개인적으로 사용하는 것을 본 것입니다. 그러나 블록 내용과 비교하여 전체 데이터베이스를 동기화합니다.


데이터베이스 덮어 쓰기에 문제가없는 경우 작동 할 수 있습니다. 새로운 커스텀 블록을 기존 데이터베이스로 옮기는 것이 유일한 방법이라면이 방법을 구현하기가 어려울 것입니다.
karolus

이 대답은 이론적으로 그 자리에 있습니다. 그러나 실제로 이것은 프로젝트가 구성 분할을 사용하거나 환경간에 구성이 다른 경우 (아마도 가능성이있는) 좋은 솔루션이 아닙니다.
komlenic

0

온 손 제발 구조 동기화 모듈.

구조 동기화는 구성으로 간주 될 수있는 컨텐츠를 동기화하기위한 Drush 명령과 관리 인터페이스 화면을 제공합니다. 메뉴 항목, 사용자 정의 블록 및 분류 용어를 포함합니다.

단계 :

  1. 구조 동기화로 이동하십시오.
  2. 블록 탭으로 이동하십시오.
  3. 수출.
  4. 구성 및 내용이 구성 폴더로 내보내집니다.
  5. 다른 사이트로 구성을 가져오고 가져 오기.
  6. 구조 동기화로 이동하여 가져 오기를 클릭하십시오.
  7. 끝난
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.