(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 tnid
kaynak düğümün kendi olması nid
ve tnid
çeviri düğümünün nid
kaynak 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 nid
her satırın düğüm numarasını (= ) açıkça belirtirseniz, nid
bu düğümleri içe aktarmadan önce bile hangi satırın hangisine karşılık geldiğini bilirsiniz . Yani, tnid
her satırı sadece bu şekilde ayarlayabilirsiniz . Açıkçası, içe aktarılanları Drupal içeriklerindeki nid
mevcut herhangi biriyle çakışmamaya dikkat etmelisiniz nid
.
Drupal'ın nid
iç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 tid
hem 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 $api
iç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_filename
iç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