माइग्रेट मॉड्यूल के साथ बहुभाषी सामग्री को स्थानांतरित करें


12

मुझे प्रत्येक पंक्ति में मिश्रित अंग्रेजी / फ्रेंच सामग्री के साथ एक एकल MySQL तालिका मिली है। मैं यह पता लगाने की कोशिश कर रहा हूं कि इसे एक उचित i18n कॉन्फ़िगर Drupal साइट में कैसे स्थानांतरित किया जाए।

मुझे सामग्री को एक भाषा में आयात करने के लिए माइग्रेट मिल सकता है, लेकिन मैं चाहता हूं कि इसे दोनों भाषाओं में आयात किया जाए। 901 पंक्तियाँ हैं, इसलिए इसे अंततः 1802 नोड्स बनाने चाहिए जो जुड़े हुए हैं।

मैं सिर्फ यह पता नहीं लगा सकता कि दो बार लूप के माध्यम से माइग्रेट मॉड्यूल कैसे सेट करें और नोड्स को लिंक करें।

संपादित करें: मैंने इसका उपयोग किया और दोनों को मिलाने में सक्षम था:

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
मुझे नहीं लगता कि आपको अपने अनुवादित अनुवादों को जोड़ने के लिए पोस्टमार्टम का उपयोग करना चाहिए, इससे माइग्रेट मैपिंग गड़बड़ हो जाएगी (यानी आप इसे वापस रोल नहीं कर पाएंगे)। एक ही समूह के भीतर दो अलग-अलग माइग्रेट स्क्रिप्ट के रूप में करना, इसे करने का सही तरीका होगा, और 'sourceMigration' विधि का उपयोग करने से आप अनुवादों को जोड़ने के प्रश्न को हल करने के लिए दूसरे माइग्रेशन में tnid जोड़ सकते हैं।
एलन डिक्सन

जवाबों:


2

आप दो माइग्रेशन बना सकते हैं, दोनों एक ही मैपिंग के साथ (शून्य को छोड़कर), लेकिन एक अंग्रेजी में नोड्स बचाता है और दूसरा फ्रेंच में।


1
सच है, लेकिन मैं दोनों को कैसे जोड़ूँ? मुझे यहाँ कुछ मोटा कोड मिला है, लेकिन मुझे पता है कि यह सब एक ही बार में संभव है। pastebin.com/ap1P5DGY मुझे लगता है कि यहां डॉक्स मेरे लिए कुछ याद कर रहे हैं - drupal.org/node/1132582 - रेडर में () क्या है? लिंकिंग पोस्टआईमपोर्ट () के साथ किया जा सकता है।
माइक जिफ़र्ड

मुझे कल कुछ माइग्रेट सामान करना है तो मैं देखूंगा। मुझे लगता है कि आपको उन दो माइग्रेशनों के बीच मैपिंग को देखने की आवश्यकता है, जिसमें उन नोड्स का रिकॉर्ड है जो आयात किए गए हैं और मूल सामग्री आईडी।
अछूता

1

ReadyRow () में आप या तो सही या गलत पर लौटते हैं। यह निर्धारित करता है कि क्या उस पंक्ति को उस विशेष माइग्रेशन में संसाधित किया जाता है (और यहां तक ​​कि गिना जाता है)।

इस तरह, आप प्रत्येक पंक्ति के लिए भाषा का पता लगा सकते हैं और केवल उन पंक्तियों के लिए TRUE लौटा सकते हैं जिनमें उस माइग्रेशन के लिए विशिष्ट भाषा में सामग्री है।

तो आप कुछ ऐसा कर सकते हैं:

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;
}

ऐसा करने के लिए एक और भी अधिक उपयोगी तरीका, यदि आप दोहरी माइग्रेशन चीज़ करने जा रहे हैं, तो प्रत्येक स्रोत क्वेरी (यदि आप माइग्रेटस्सोर्स SQL ​​का उपयोग कर रहे हैं) में एक शर्त () जोड़ेंगे, जैसे कि -> स्थिति ('लैंग') 'en', '=')।


1

(निम्नलिखित Drupal 7 पर लागू होता है - मैं Drupal 6 या उससे पहले के बारे में नहीं जानता।)
मुझे लगता है कि आप अंग्रेजी और फ्रेंच नोड्स के बीच अनुवाद के संबंध को परिभाषित करना चाहते हैं। ऐसा करने के लिए, पहले, प्रत्येक नोड में परिभाषित भाषा होनी चाहिए, जैसा कि परिभाषित किया गया है prepareRow():

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

दूसरा, आपको tnidस्रोत-नोड को किसी तरह परिभाषित करने की आवश्यकता है कि वह स्वयं का हो nidऔर tnidअनुवाद नोड nidका स्रोत नोड का हो। ध्यान दें कि आप स्रोत नोड के लिए यादृच्छिक भाषा का चयन कर सकते हैं, और इसलिए विभिन्न सामग्रियों के बीच स्रोत-भाषा का मिश्रण करना भी स्वीकार्य है। सवाल यह है कि कैसे।
(ध्यान दें कि मुझे लगता है कि आप सभी की जरूरत है, लेकिन मैं गलत हो सकता हूं। मैंने नीचे दिए गए दूसरे मामले में चरणों का पालन किया, और सफल रहा।)

यदि आप nidअपने प्रवास में प्रत्येक पंक्ति के नोड-संख्या (= ) को स्पष्ट रूप से निर्दिष्ट करते हैं , तो यह आसान है, क्योंकि आप जानते हैं कि कौन सी पंक्ति nidउन नोडों को आयात करने से पहले भी, किस से मेल खाती है । इसलिए, आप tnidप्रत्येक पंक्ति को इस प्रकार सेट कर सकते हैं। जाहिर है, आपको सावधान रहना चाहिए कि ड्रुपल सामग्री में nidमौजूदा nidएस के किसी भी के साथ आयातित संघर्ष नहीं करना चाहिए ।

यदि आप ड्रुपल nidको प्रत्येक आयातित पंक्ति का निर्णय लेने देते हैं, तो यह अधिक मुश्किल है। मैंने 2 चरणों के साथ किया। सबसे पहले, मैंने सभी स्रोत-भाषा पंक्तियों को आयात किया, बाद के उपयोग के लिए स्रोत नोड के रूप में इसे पहचानने के लिए एक कस्टम फ़ील्ड जोड़ दिया। दूसरा, मैंने अनुवादित-भाषा की पंक्तियों को आयात किया और tidस्रोत और अनुवादित-भाषा नोड्स दोनों के सभी सेट किए । ये दो चरण पूरी तरह से अलग-अलग मॉड्यूल हो सकते हैं, लेकिन संभवत: यदि आप उन दोनों को अलग-अलग वर्गों के रूप में एक ही (माइग्रेशन) समूह के रूप में परिभाषित करते हैं $api, तो आपके संस्करण में Your_ModuleName.migrate.inc

अनुवादित भाषा के लिए दूसरे चरण के लिए, मैंने निम्नानुसार लिखा। संक्षेप में, यह कस्टम फ़ील्ड के आधार पर SQL क्वेरी के साथ स्रोत-भाषा नोड को ढूँढता है field_original_html_filename, जिसे आयात किए जाने पर परिभाषित किया गया था।

// 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;
    }
  }

बस इतना ही। मुझे आश्चर्य नहीं है कि अगर कोई आसान या बेहतर तरीका होगा, लेकिन यह मेरे लिए काम करता है। वैसे भी माइग्रेशन के दौरान अनुवाद सेट करने का एक फायदा यह है कि आप हमेशा रोलबैक कर सकते हैं। एक संदर्भ के रूप में मेरा संपूर्ण माइग्रेशन कोड (स्थिर HTML फ़ाइलों से 2 भाषाओं के लिए) GitHub पर उपलब्ध है:
https://github.com/masasakano/migrate_goo

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.