Blok içeriğini bir geliştiriciden bir üretim sitesine nasıl geçiririm?


24

Sonunda Drupal 8'e ciddi bir şekilde bakmaya başladım ve özellikle konfigürasyon yönetimi ile ilgileniyorum. Biraz sorunlu olabilecek ve özel blok içeriğiyle ilgili bir şeyle karşılaştım.

Konfigürasyon yönetim sisteminin blok konfigürasyonunu dışa aktarabildiğini görebiliyorum - bölge, tema, ağırlık, görünürlük vb. Ancak gerçek blok içeriği uygun ve anlaşılabilir olan konfigürasyon ihracatında karşımıza çıkmıyor.

Bu blok konfigürasyonunu bir üretim sitesine içe aktarırken, gerçekleşen görünen, blok konfigürasyonunun oluşturulması ve bir tutma mesajının yerleştirilmesidir, bloğun kırıldığını veya eksik olduğunu bildirir. Açıkçası, blok içeriği üretim sunucusunda mevcut değil.

Özel bloklar dev / aşamalı bir sunucudan bir üretim sunucusuna nasıl geçirilir? Drupal 8'deki blokların düğümler gibi tutulabilir varlıklar olduğunu ve aynı şekilde taşınmaları gerektiğini ve Drupal 8'de bir Migrate API'sinin olduğunu anlıyorum, ancak bunun Drupal 6 ve 7 sitelerinden içerik geçirmek için oluşturulduğunu biliyorum Drupal 8 yerine Drupal 8 ila Drupal 8 bölgesi.

Bu sorun özellikle Görünümler gibi diğer modüllerin ürettiği bloklar gibi özel bloklarla ilgili olarak konfigürasyon olarak taşınır.

blocks  8 

Dağıtım modülü ve entitypilot.com (feragatname, bu benim ürünüm) de dahil olmak üzere çeşitli içerik düzenleme çözümleri var
larowlan

1
Benzer:
CMI'daki

Yanıtlar:


7

Burada bahsetmediğim bir başka cevap , çekirdeğin 'Özel Blok' kurulumuyla hemen hemen aynı olan Basit Blok modülünü kullanmaktır , ancak garip bir içerik + yapılandırma hibritine sahip olmak yerine, tüm Blok ayarlarına ve içeriğine sahipsiniz. Konfigürasyonda saklanır, ki bunlar temiz bir şekilde ihraç edilebilir ve alınabilir.

Bakınız, Drupal 8 çekirdeğinde daha fazla tartışma için: Özel bloklar uygun şekilde verilemez ve alınamaz .


3

Bunu çözen katkıda bulunan bir modülü yayınladım. Temel olarak, modül, özel bir bloğu (içerik bloğu) saran yapılandırmaya (sabit blok) dayalı bir blok tipi sağlar. İçerik bloğu yoksa, varsayılan bir içerik ile oluşturulur veya varsayılan içerik ayarlanmadıysa boştur. Her şey UI aracılığıyla yapılır, özel bir dosyaya veya özel bir modüle gerek yoktur.

Sabit blok içeriği olarak adlandırdım ve şu adreste yayınlandı:

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


1

Gelişimin bir parçası olarak eklenen içeriği korumaya yönelik bir başka yaklaşım da, yayına sokmak için Varsayılan İçerik modülünü kullanmaktır . İçeriğin bir yükleme profilinin 'içerik' klasörüne dışa aktarılması için oluşturulmuştur ve daha sonra etkinleştirilirse modül, site yüklendiğinde içeriği otomatik olarak içeriye getirir, ancak içeriği bir kerede bir öğe almak da mümkündür. bir güncelleme kancası gibi, example.install veya example.profile dosyanızdaki aşağıdaki kodla:

<?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();
}

8 kodlu bir özel bloğu dışa aktarın:

drush dcer block_content 8

( Profil yolunuzu Drush ayarlarında ayarlamazsanız, yukarıda belirtmeniz gerekir.)

Elde edilen dışa aktarımı example.install dosyanızda şöyle kullanın:

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

Bloklar içerikle iç içe olduğundan, çoklu ortamlar arasında blok yapılandırmalarını senkronize etmenin herhangi bir güçlü avantajını gördüğümden emin değilim.

Bunun nedeni, başlık / gövdesi (içeriği) olmayan yml dosyalarından yaratılan yeni bir bloğun var olmasıdır ve bu nedenle 'kırık / eksik' mesajı veriyor.

UUID'yi (her iki yerde de blok yapmak istiyorsanız - makine adının eşleştiğinden emin olun ...) geliştirme bloğunuzda bulunmaya çalışabilirsiniz blok_content tablonuz üretimde kullandığınız sıvılarla eşleşiyor (diğer ilişkiler varlık kullanıyor gibi görünüyor) İD). Daha sonra, bir config senkronizasyonu yaptığınızda, yml dosyalarındaki 'Farklılıkları görüntüle'yi görebilir ve muhtemelen üretim sıvılarıyla eşleşmesini sağlamak için dev üzerinde neyi değiştirmeniz gerekebileceğini görebilirsiniz, vb. Bu işlemi yapmazsanız ya da block_content, block_content__body ve block_content_field_data kullanarak kendiniz için bir tür veritabanı bloğu senkronizasyonu oluşturmadıkça tüm blok konfigürasyonlarınızı kodda yok saymak en kolaydır.

Çok zarif değil, ancak blok yapılandırmalarınızı kodda tutmanıza izin verebilir. Aksi takdirde, config ile blokları dağıtmaya devam ederseniz, her zaman 'kırılmış veya eksik' olacaktır.

Başka bir blog yazısı , canlı ortamda özel bir blok oluşturmayı ama yerleştirmeyi önermiyor. Veritabanını dev ile senkronize ettikten sonra, özel blok yapılandırılabilir, konfigürasyon dışa aktarılabilir ve yerleştirmenin canlı içe aktarılmasında zaten mevcut olduğundan mümkündür.


0

Aynı soruna sahip olmak ve gerçekten bir çözüm bulmak değil, sadece ekler: İşbirlikçi gelişimde, depodan gelen ve tüm yapılandırmayı sıfırlayan bir hazırlama sunucusu kullanıyoruz. Bu, blok config otomatik duvarları sıfırlıyor demektir, doğrudan "sunucu" olarak kabul ettiğiniz blokları "içerik" olarak yerleştiremezsiniz.

Tam olarak ne yaptığınızı bilerek ve herhangi bir yapılandırma değişikliğinin konuşlandırma amaçlı olduğundan emin olduktan sonra, drush config-export senkronizasyonunu kullanmak kolaydır. Ancak Drupal bizim için blokların konfigürasyon olduğuna karar verir (tabii ki blok içeriği içerik olarak ele alınır). Yani bu tasarım tarafından kırılmış gibi görünüyor.

Verilen süre için en pratik çözümün blokla ilişkili yml dosyalarını .gitignore'ye eklemek olduğunu düşünüyorum.


1
Config Ignore, muhtemelen .gitignore'dan daha iyidir: drupal.org/project/config_ignore
bdanin, 14:17


0

Bunun üstesinden gelmenin en iyi yolu şöyle olacağını düşünüyorum:

Genelde insanları kullanırken ve şahsen kullandığım şey budur. Ancak veritabanının tamamını yalnızca blok içeriğiyle karşılaştırıldığında senkronize eder.


Bir veritabanı üzerine yazma ile ilgili bir sorun yoksa işe yarayabilir. Şimdi, tek arzu yeni bir özel bloğu mevcut bir veritabanına taşımaksa, bu yöntemin uygulanması zor olacaktır.
karolus

Bu cevabın teoride yeri var. Ancak pratikte bu, özellikle proje konfigürasyon bölmesini kullanıyorsa ya da ortamlar arasında farklı bir konfigürasyona sahipse (ki bu büyük olasılıkla) iyi bir çözüm değildir.
komlenic

0

Lütfen Yapı Senk modülünü elinize alın .

Yapı senkronizasyonu, yapılandırma olarak da düşünülebilecek içeriği senkronize etmek için Drush komutları ve yönetici arayüzü ekranları sunar. Menü öğeleri, özel bloklar ve taksonomi terimleri dahil.

Adımlar:

  1. Yapı senkronizasyonuna git.
  2. Bloklar sekmesine gidin.
  3. İhracat.
  4. Konfigürasyonlarınız ve içeriğiniz konfigürasyon klasöründe dışa aktarılacaktır.
  5. Konfigürasyonları diğer sitelere ve İçe Aktar'a götürün.
  6. Yapı senkronizasyonuna gidin ve içe tıklayın.
  7. Bitti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.