(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