Jak migrować blokowaną zawartość z dewelopera do witryny produkcyjnej?


24

W końcu zacząłem poważnie patrzeć na Drupala 8 i jestem szczególnie zainteresowany zarządzaniem konfiguracją. Natknąłem się na coś, co może być nieco problematyczne i dotyczy niestandardowej zawartości bloku.

Widzę, że system zarządzania konfiguracją jest w stanie wyeksportować konfigurację bloku - region, kompozycję, wagę, widoczność itp. Jednak rzeczywista zawartość bloku nie pojawia się w eksporcie konfiguracji, co jest rozsądne i zrozumiałe.

Podczas importowania tej konfiguracji bloku do witryny produkcyjnej wydaje się, że tak się dzieje, że konfiguracja bloku jest tworzona i umieszczany jest komunikat wstrzymujący, informujący o tym, że blok jest uszkodzony lub go brakuje. Oczywiście zawartość bloku nie istnieje na serwerze produkcyjnym.

Jak migrować niestandardowe bloki z serwera deweloperskiego / pomostowego na serwer produkcyjny? Zdaję sobie sprawę, że bloki w Drupal 8 są obiektami polowymi, takimi jak węzły, więc trzeba będzie migrować w ten sam sposób, i rozumiem, że w Drupal 8 istnieje interfejs API do migracji, ale wydaje się, że został on stworzony do migracji treści z witryn Drupal 6 i 7 do Drupal 8 w przeciwieństwie do witryn Drupal 8 do Drupal 8.

Ten problem dotyczy w szczególności bloków niestandardowych, ponieważ bloki generowane przez inne moduły, takie jak Widoki, będą oczywiście migrowane w ramach konfiguracji.

blocks  8 

W pracach jest kilka rozwiązań dotyczących stopniowania zawartości, w tym moduł wdrażania i podmiotpilot.com (oświadczenie, to mój produkt)
Lararan

Odpowiedzi:



3

Właśnie opublikowałem moduł, który to rozwiązuje. Zasadniczo moduł zapewnia typ bloku oparty na konfiguracji (blok stały), który otacza blok niestandardowy (blok zawartości). Jeśli blok zawartości nie istnieje, jest tworzony z domyślną zawartością lub pusty, jeśli nie ustawiono domyślnej treści. Wszystko odbywa się za pomocą interfejsu użytkownika, nie są potrzebne żadne specjalne pliki ani moduł niestandardowy.

Nazwałem ją Naprawiono zawartość bloku i jest ona opublikowana w:

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


1

Innym podejściem do utrzymywania zawartości dodanej w ramach rozwoju, która również została wypchnięta do życia, jest użycie modułu Treści domyślnej do wyeksportowania zawartości. Jest on zbudowany tak, aby treść mogła zostać wyeksportowana do folderu „treść” profilu instalacyjnego, a następnie moduł, jeśli jest włączony, automatycznie wprowadza zawartość po zainstalowaniu witryny, ale możliwe jest również importowanie zawartości pojedynczo , na przykład w haku aktualizacji, z poniższym kodem w pliku example.install lub 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();
}

Wyeksportuj niestandardowy blok o identyfikatorze 8:

drush dcer block_content 8

(Jeśli nie ustawisz ścieżki profilu w ustawieniach Drush, musisz podać ją powyżej).

I użyj wynikowego eksportu w pliku example.install w następujący sposób:

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

Nie jestem pewien, czy dostrzegam silne zalety synchronizacji konfiguracji bloków w wielu środowiskach, ponieważ bloki są tak splecione z zawartością.

Powodem tego jest to, że z plików yml tworzony jest nowy blok, który nie ma tytułu / treści (treści) i dlatego wyświetla komunikat „uszkodzony / brakujący”.

Możesz spróbować ustawić UUID (jeśli chcesz zrobić blok w obu miejscach - upewnij się, że nazwa maszyny pasuje ...) w swojej tabeli blok_koncepcji programistycznej pasuje do tego, co masz w produkcji (inne relacje wydają się używać encji ID). Następnie, gdy wykonujesz synchronizację konfiguracji, możesz zobaczyć „Zobacz różnice” w plikach yml i być może zobaczyć, co jeszcze musisz zmienić w dev, aby dopasować go do produktywnych podręczników itp. Mam to do pracy, ale wciąż doszedłem do wniosku najłatwiej jest zignorować wszystkie konfiguracje bloków w kodzie, chyba że przejdziesz przez ten proces lub stworzysz dla siebie jakąś synchronizację bloków bazy danych za pomocą block_content, block_content__body i block_content_field_data.

Nie jest to zbyt eleganckie, ale może pozwolić na zachowanie konfiguracji bloków w kodzie. W przeciwnym razie, jeśli nadal będziesz wdrażać bloki za pomocą config, zawsze będą one „uszkodzone lub brakujące”.

Inny post na blogu sugeruje utworzenie niestandardowego bloku w środowisku na żywo, ale nie umieszczanie go. Po zsynchronizowaniu bazy danych z urządzeniem deweloperskim można skonfigurować niestandardowy blok, wyeksportować konfigurację, a ponieważ istnieje on już na żywo, możliwe jest importowanie umieszczenia.


0

Mając ten sam problem, a nie rozwiązanie, tylko dodatki: We wspólnym rozwoju używamy serwera pomostowego, który pobiera z repozytorium i resetuje całą konfigurację. Oznacza to, że konfiguracja bloku jest resetowana automatycznie, po prostu nie możesz umieszczać bloków, które uważasz za „treść” bezpośrednio na tym serwerze.

Łatwo jest korzystać z synchronizacji drush config-export, wiedząc dokładnie, co zrobiłeś i mając pewność, że wszelkie zmiany konfiguracji są przeznaczone do wdrożenia. Ale Drupal decyduje dla nas, że bloki są konfiguracją (podczas gdy oczywiście zawartość bloku jest traktowana jako treść). Wygląda na to, że jest to zepsute przez projekt.

Wydaje mi się, że na ten czas najbardziej praktycznym rozwiązaniem byłoby dodanie powiązanych plików blokowych do pliku .gitignore.


1
Config Ignore jest prawdopodobnie lepszy niż .gitignore
bdanin


0

Myślę, że najlepszym sposobem na poradzenie sobie z tym byłoby:

Tego zazwyczaj używają ludzie, a ja osobiście. Ale synchronizuje całą bazę danych w porównaniu do samej zawartości bloku.


Może to działać, jeśli nie ma problemu z nadpisaniem bazy danych. Teraz, jeśli jedynym pragnieniem jest przeniesienie nowego niestandardowego bloku do istniejącej bazy danych, ta metoda byłaby trudna do wdrożenia.
karolus

Ta odpowiedź ma swoje teoretyczne miejsce. Ale w praktyce nie jest to dobre rozwiązanie, szczególnie jeśli projekt używa podziału konfiguracji lub ma inną konfigurację między środowiskami (co jest bardzo prawdopodobne).
komlenic

0

Proszę mieć ręce na module Structure Sync .

Synchronizacja struktury zapewnia polecenia Drush i ekrany interfejsu administratora do synchronizacji treści, które można również uznać za konfigurację. W tym elementy menu, niestandardowe bloki i warunki taksonomii.

Kroki:

  1. Przejdź do synchronizacji struktury.
  2. Przejdź do zakładki Bloki.
  3. Eksport.
  4. Twoje konfiguracje i zawartość zostaną wyeksportowane do folderu konfiguracji.
  5. Przenieś konfiguracje do innych witryn i zaimportuj.
  6. Przejdź do synchronizacji struktury i kliknij przycisk Importuj.
  7. Gotowy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.