Taşıma modülü ile taşıma


8

Drupal 7 ve en son Migrate modülünü kullanıyorum. Yeni D7 siteme bir OpenCart DB ürünleri taşımak için bir sınıf oluşturmaya çalışıyorum. İhtiyacım olan tüm SQL'i anladım ve programlananların çoğunu aldım. Ama kategorileri nasıl yapacağımı anlamakta biraz sorun yaşıyorum.

Taşıma hedefim Ubercart.

Anlamaya çalıştığım, Migrate'ın bir alt modülü olan migrate_example modülünde oturuyor. Özellikle WineWineMigration sınıfındaki wine.inc dosyasına bakıyorum. Göç terimini anlamaya çalışıyorum.

Ubercart ürünlerinde sınıflandırma terimleri haline gelecek iki listem var. Birincisi kategoriler. Ben kategorileri manuel olarak ayarladım, bu yüzden (Over GROUP_CONCAT SQL func kullanarak) listesini getirmek zaman ben tüm ID dönüşümleri tutacak bir dizi kullanarak eşleyecek kimlikleri bir grup olacak. Bu iyi, ama onlar göç onların BestWith bilgilerine baktığınızda o terimi almak için yukarıdaki WineBestWith sınıfı kullandığını gösterir.

Bununla kafam karıştı çünkü bir tür terimlerin ikincil göçüne benziyor. Olan bu mu? Dahası, bu benim göç dizisi, bu terim sınıfında koymak nerede?

Yapmam gereken bir sonraki şey etiketlerle uğraşmak. OpenCart'ta bir sürü serbest form etiketimiz var. Ubercart'ta manuel olarak bir ürün oluşturduğumda etiketler için otomatik tamamlama alanım var. Bu alana virgülle ayrılmış bir terimler listesi koyabilirim ve birden çok terim oluşturur. Migrate modülünde aynı şeyi yapabilir miyim? Alanı virgülle ayrılmış terimler listesine eşleyebilir miyim? Bu, her ürün için etiketleri buraya ekler mi?

Yanıtlar:


14

Şu anda aynı sorun üzerinde çalışıyorum, bu yüzden karışıklığınızı anlıyorum. Çok fazla sorunuz var, ancak bence bunlar tek bir soru olarak özetlenebilir:

Migrate modülü, normalize edilmiş bir veritabanının Drupal kurulumuna geçirilmesini nasıl ele alır?

Kesinlikle basit değil, ama işte nasıl çalıştığını anladım. Aşağıdan başlayarak (WineWineMigration) başlayacağız ve giderken sorular soracağız.

WineWineMigrationSınıfın en üstündeki koda bakarak başlıyoruz .

...
$this->dependencies = array('WineVariety', 'WineRegion',
  'WineBestWith', 'WineUser', 'WineProducer');
...

Bu Migrate modülüne Wine içeriğinizi taşımak için önce bağımlı geçişlerin (WineVariety, WineRegion, WineBestWith, WineUser, WineProduce) tamamlanması gerektiğini bildirir.

Burada öğrendiğimiz şey, göçlerin diğer göçlere bağlı olabileceğidir .

Sonra şu anda temel şarap bilgilerini tutan tablo ile Drupal düğümü arasındaki eşleme var:

$this->map = new MigrateSQLMap($this->machineName,
  array(
    'wineid' => array(
      'type' => 'int',
      'unsigned' => TRUE,
      'not null' => TRUE,
      'description' => 'Wine ID',
      'alias' => 'w',
    )
  ),
  MigrateDestinationNode::getKeySchema()
);

Bu oldukça basittir, bu yüzden açıklığa ihtiyacınız varsa bunu sağlayacağım.

Çeşitli kategorileri ve şarap nesnelerini bağlamaya gerçekten uygun olmayan bazı geçici şeyleri atlayacağım.

Şimdi saha haritalarına geçiyoruz. Gözlemek:

// Mapped fields
$this->addFieldMapping('title', 'name')
     ->description(t('Mapping wine name in source to node title'));
$this->addFieldMapping('uid', 'accountid')
     ->sourceMigration('WineUser')
     ->defaultValue(1);
// TIP: By default, term relationship are assumed to be passed by name.
// In this case, the source values are IDs, so we specify the relevant
// migration (so the tid can be looked up in the map), and tell the term
// field handler that it is receiving tids instead of names
$this->addFieldMapping('migrate_example_wine_varieties', 'variety')
     ->sourceMigration('WineVariety')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_best_with', 'best_with')
     ->separator(',')
     ->sourceMigration('WineBestWith')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('field_migrate_example_wine_ratin', 'rating');
$this->addFieldMapping('field_migrate_example_top_vintag', 'best_vintages');

Nerede yazdığına bakın:

->sourceMigration(...)

Bu, bu alanı eşleştirmek için önce başka bir taşıma işleminin yerine getirilmesi gerektiğini gösterir. Bunun bahsettiğiniz "ikincil göç" olduğuna inanıyorum. regionAlan eşlemesini burada örnek olarak kullanalım . Yıkılıyor ...

$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));

Bu, kaynak veritabanındaki kategori bölgesinin bir bölge kelime terimiyle eşlendiğini belirtir. TIP yorumu alan eşleme kodu yığınında belirtildiği gibi, eşlemelerin alan_adı temel alınarak yapıldığını varsayar, ancak koyduğunuzda ikincil bir geçişe bağımlı olduğumuz için, bağımlı olduğu taşımayı belirtmeli ve alan adları yerine tids kullanın.

Kaynak veritabanınızdaki normalleştirilmiş her tablo için hemen hemen her biri için bir geçiş belirleyeceksiniz ve daha sonra bu tabloları içeren ilgili alan eşlemelerinde alan eşleme çağrılarınızda bağımlı geçişleri belirleyeceksiniz ve her bir göçün başlangıcındaki bağımlı göç beyanı.

Umarım bu yardımcı olur. Bunu kendim tam olarak anlamıyorum, bu yüzden bu soruyu Migrate'ın veritabanlarıyla nasıl ilişkili olduğu konusundaki anlayışımı geliştirmek için bir fırsat olarak kullandım. Biraz daha öğrendiğimde cevabımı buna göre güncelleyeceğim.


1
Açık bir şeye ihtiyacınız varsa bana bildirin. Yazı biraz fark ettiğim bir beyin dökümü ...
Lester Peabody
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.