Geçiş Modülüyle Çok Dilli İçeriği Taşıma


12

Her satırda karışık İngilizce / Fransızca içerikli tek bir MySQL masam var. Bu uygun bir i18n yapılandırılmış Drupal sitesine geçirmek için nasıl anlamaya çalışıyorum.

Migrate'ın içeriği bir dile almasını sağlayabilirim, ancak her iki dile de içe aktarmasını istiyorum. 901 satır vardır, bu yüzden sonuçta bağlı 1802 düğümleri oluşturmalıdır.

Migrate modülünü iki kez döngü yapmak ve düğümleri bağlamak için nasıl ayarlayacağımı anlayamıyorum.

EDIT: Bunu kullandım ve ikisini birleştirebildim:

public function postImport() {
parent::postImport();

// $ii should really be determined by $count_query
$ii = 2000;
for ($i = 1; $i < $ii; $i++) {
  // Confirm SQL in phpMyAdmin to verify
  $query = "SELECT n.nid, tid.field_bv_transfer_id_value
    FROM {field_revision_field_bv_transfer_id} tid
    INNER JOIN node n ON tid.entity_id = n.nid
    WHERE tid.field_bv_transfer_id_value = $i;";
  $result = db_query($query);

  // Reset for each import
  $currentRowCount = $current_translateid = 0;
  foreach ($result as $record) {
    if ($currentRowCount % 2 == 0) {
      $node = node_load($record->nid);
      $node->pathauto_perform_alias = FALSE;
      $node->tnid = $record->nid;
      $current_translateid = $record->nid;
      node_save($node);
    } else {
      $node = node_load($record->nid);
      $node->pathauto_perform_alias = FALSE;
      $node->tnid = $current_translateid;
      node_save($node);
    }
    $currentRowCount++;
  }
}

}


1
Çevrilmiş eşlemelerinizi eklemek için postImport'u kullanmanız gerektiğini düşünmüyorum, bu da geçiş eşlemesini bozacaktır (yani geri alamayacaksınız). Aynı grup içinde iki ayrı geçiş komut dosyası olarak yapmak, bunu yapmanın doğru yolu olacaktır ve 'sourceMigration' yöntemini kullanmak, çevirileri birbirine bağlama sorununu çözmek için ikinci geçişe tnid eklemenize izin verir.
Alan Dixon

Yanıtlar:


2

Her ikisi de aynı eşlemeyle (nids hariç) iki taşıma oluşturabilirsiniz, ancak biri İngilizce düğümleri, ikincisi Fransızca'yı kaydeder.


1
Doğru, ama ikisini nasıl bağlarım? Burada bazı kaba kodlar var, ama hepsini bir kerede yapmanın mümkün olduğunu biliyorum. pastebin.com/ap1P5DGY Buradaki belgelerin benim için bir şey eksik olduğunu düşünüyorum - drupal.org/node/1132582 - preparRow () 'de neler döndü? Bağlama postImport () ile yapılabilir.
Mike Gifford

Yarın biraz göçmenlik yapmak zorundayım ki bakalım. Sanırım içe aktarılan nids kaydı ile orijinal içerik kimliği arasındaki iki taşıma arasındaki haritaya bakmanız gerekiyor.
acouch

1

PreparRow () öğesinde true veya false değerini döndürürsünüz. Bu, söz konusu satırın belirli bir taşıma işleminde işlenip işlenmediğini (ve hatta çift sayılarak) belirlenir.

Bu şekilde, her satırın dilini algılayabilir ve yalnızca o taşıma için belirli dilde içerik içeren satırlar için TRUE değerini döndürebilirsiniz.

böylece şöyle bir şey yapabilirsiniz:

public function prepareRow($row){
  $return = FALSE
  if ($row->lang == "fr"){
   $return = TRUE;
  }
  // Only rows with a source 'lang' value of 'fr' are processed
  return $return;
}

Bunu yapmanın daha da etkili bir yolu, ikili geçişleri yapacaksanız, her kaynak sorgusuna (MigrateSourceSQL kullanıyorsanız) -> condition ('lang', 'tr', '=').


1

(Aşağıdaki Drupal 7 için geçerlidir - Drupal 6 veya öncesi hakkında bilmiyorum.)
İngilizce ve Fransızca düğümleri arasındaki çeviri ilişkisini tanımlamak istediğinizi düşünüyorum. Bunu yapmak için, ilk olarak, her bir düğümün tanımlandığı dile sahip olması gerekir prepareRow():

$this->addFieldMapping('language', 'language_code');
$row->lang_dest = 'fr'; // or "en", depending on the row.

İkincisi, bir şekilde tnidkaynak düğümün kendi olması nidve tnidçeviri düğümünün nidkaynak düğümün olması için bir şekilde tanımlamanız gerekir . Kaynak düğüm için rastgele bir dil seçebileceğinizi unutmayın, bu nedenle kaynak dilin farklı içerikler arasında karıştırılması bile kabul edilebilir. Soru nasıl.
(Tek ihtiyacın olduğunu düşünüyorum, ama yanılmış olabilirim. Aşağıdaki ikinci davadaki adımları izledim ve başarılı oldum.)

Taşıma işleminizdeki nidher satırın düğüm numarasını (= ) açıkça belirtirseniz, nidbu düğümleri içe aktarmadan önce bile hangi satırın hangisine karşılık geldiğini bilirsiniz . Yani, tnidher satırı sadece bu şekilde ayarlayabilirsiniz . Açıkçası, içe aktarılanları Drupal içeriklerindeki nidmevcut herhangi biriyle çakışmamaya dikkat etmelisiniz nid.

Drupal'ın nidiçe aktarılan her satırın karar vermesine izin verirseniz , daha zor olur. 2 Adım ile yaptım. İlk olarak, daha sonra kullanmak üzere kaynak düğümü olarak tanımlamak için özel bir alan ekleyerek tüm kaynak dil satırlarını içe aktardım. İkincisi, çevrilmiş dil satırlarını içe aktardım ve tidhem kaynak hem de çevrilmiş dil düğümlerinin tümünü ayarladım . Bu iki adım tamamen farklı modüller olabilir, ancak bu ikisini, içindeki değişken $apiiçinde aynı (geçiş) grupta ayrı sınıflar olarak tanımlarsanız belki de daha kullanışlı olur Your_ModuleName.migrate.inc.

Tercüme edilen dilin ikinci adımı için şöyle yazdım. Kısacası, field_original_html_filenameiçe aktarılırken tanımlanan özel alana bağlı olarak SQL sorgusu ile kaynak dil düğümünü bulur .

// In prepareRow()
//   Set up tnid, obtaining the nid from the node already imported.
    $this->addFieldMapping('tnid', 'row_tnid');
    //
    $field_name = 'field_original_html_filename';
    $query = sprintf("SELECT n.entity_id FROM {field_data_%s} n WHERE n.%s_value = '%s'",
                     $field_name, $field_name, $fbasename_trans);     // entity_id == nid of Node
    $result = db_query($query);
    $nid_trans = $result->fetchCol()[0];
    $row->row_tnid = $nid_trans;      // In my case, it is guaranteed there is only one candidate.

// In prepare()
//   Forcibly set up (Change) tnid of the node already imported.
  public function prepare(&$node, $row) {
    if (isset($node->tnid) && ($source = node_load($node->tnid))) {
      $node->translation_source = $source;
    }
  }

Hepsi bu. Daha kolay veya daha iyi bir yol olursa şaşırmadım, ama benim için çalıştı. Her neyse, geçiş sırasında çevirileri ayarlamanın bir avantajı her zaman geri alabilirsiniz. Referans olarak tüm taşıma kodumu (statik HTML dosyalarından 2 dil için) GitHub'da bulabilirsiniz:
https://github.com/masasakano/migrate_goo

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.