মাইগ্রেট মডিউল সহ বহু ভাষাগত সামগ্রী সরান


12

আমি প্রতিটি সারিতে মিশ্র ইংরেজি / ফরাসি সামগ্রী সহ একটি একক মাইএসকিউএল টেবিল পেয়েছি। আমি কীভাবে এটি সঠিক i18n কনফিগার করা ড্রুপাল সাইটে মাইগ্রেট করতে পারি তা চেষ্টা করার চেষ্টা করছি।

আমি একটি ভাষায় সামগ্রী আমদানি করতে মাইগ্রেট পেতে পারি, তবে আমি এটি উভয় ভাষায় এটি আমদানি করতে চাই। এখানে 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
আমি মনে করি না যে আপনার অনুবাদিত নিডগুলি যুক্ত করার জন্য আপনার পোস্ট ইম্পোর্টটি ব্যবহার করা উচিত, যা মাইগ্রেশন ম্যাপিংকে বিশৃঙ্খলা করবে (যেমন আপনি এটি পুনরায় রোল করতে পারবেন না)। একই গ্রুপের মধ্যে দুটি পৃথক মাইগ্রেট স্ক্রিপ্ট হিসাবে এটি করা সঠিক পদ্ধতি হবে এবং 'সোর্স মাইগ্রেশন' পদ্ধতিটি ব্যবহার করে অনুবাদগুলিকে একসাথে যুক্ত করার প্রশ্নটি সমাধান করার জন্য দ্বিতীয় মাইগ্রেশনে tnid যুক্ত করতে পারবেন।
অ্যালান ডিকসন

উত্তর:


2

আপনি দুটি মাইগ্রেশন তৈরি করতে পারেন, উভয় একই ম্যাপিং (নীড ব্যতীত) দিয়ে, তবে একটি ইংরেজীতে নোড এবং দ্বিতীয়টি ফরাসি ভাষায় সংরক্ষণ করে।


1
সত্য, তবে আমি কীভাবে দুজনকে সংযুক্ত করব? আমি এখানে কিছু মোটামুটি কোড পেয়েছি, তবে আমি জানি এটি একবারে করা সম্ভব। pastebin.com/ap1P5DGY আমি মনে করি যে ডক্স এখানে আমার জন্য কিছু অনুপস্থিত - drupal.org/node/1132582 - prepareRow () কি ফিরে হচ্ছে কি? লিঙ্কিং পোস্টপিম্পোর্ট () দিয়ে করা যেতে পারে।
মাইক গিফর্ড

আমাকে আগামীকাল কিছু স্থানান্তরিত সামগ্রী করতে হবে যাতে আমি একবার দেখে নিই। আমি মনে করি আপনাকে দুটি স্থানান্তরের মধ্যে যে ম্যাপিংটি আমদানি করা হয়েছে এমন নিড এবং মূল সামগ্রী আইডির মধ্যে রেকর্ড করা উচিত।
acouch

1

রেডিআর () তে আপনি সত্য বা মিথ্যা প্রত্যাবর্তন করেন। এটি নির্ধারণ করে যে সেই সারিটি সেই নির্দিষ্ট মাইগ্রেশনে প্রক্রিয়াবদ্ধ হয়েছে (এবং সমান গণনা করাও)।

এইভাবে, আপনি প্রতিটি সারির জন্য ভাষাটি সনাক্ত করতে পারেন এবং কেবল সেই সারণির জন্য সত্য ফিরিয়ে দিতে পারেন যা সেই স্থানান্তরের জন্য নির্দিষ্ট ভাষায় সামগ্রী রয়েছে।

সুতরাং আপনি যেমন কিছু করতে পারে:

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

এটি করার আরও একটি কার্যকরী উপায়, আপনি যদি দ্বৈত স্থানান্তর কাজটি করতে চলেছেন তবে প্রতিটি উত্স ক্যোয়ারিতে একটি শর্ত () যুক্ত করতে হবে (যদি আপনি মাইগ্রেটসোর্সএসকিউএল ব্যবহার করছেন) যেমন -> শর্ত ('ল্যাং', 'স্বীকারোক্তি', '=')।


1

(নিম্নলিখিতটি দ্রুপাল to-এর ক্ষেত্রে প্রযোজ্য - ড্রুপাল or বা তার আগে আমি জানি না
I ) আমি অনুমান করি আপনি ইংরেজি এবং ফ্রেঞ্চ নোডের মধ্যে অনুবাদের সম্পর্কটি সংজ্ঞায়িত করতে চান। এটি করতে, প্রথমে প্রতিটি নোডের সংজ্ঞায়িত ভাষা থাকতে হবে prepareRow():

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

দ্বিতীয়ত, আপনি একরকম সংজ্ঞায়িত করতে প্রয়োজন tnidনিজস্ব হতে উৎস-নোডের nidএবং tnidঅনুবাদ নোড হতে nidউৎস নোডের। নোট আপনি উত্স নোডের জন্য এলোমেলো ভাষা চয়ন করতে পারেন, এবং তাই বিভিন্ন বিষয়বস্তুর মধ্যে উত্স-ভাষা মিশ্রিত করা এমনকি গ্রহণযোগ্য। প্রশ্নটি কীভাবে হয়।
(দ্রষ্টব্য, আমি মনে করি এটি আপনার কেবল প্রয়োজন তবে আমি ভুল হতে পারি below আমি নীচের দ্বিতীয় মামলার পদক্ষেপগুলি অনুসরণ করে সফল হয়েছি))

আপনি যদি nidনিজের মাইগ্রেশনে প্রতিটি সারির নোড-নম্বর (= ) স্পষ্টভাবে নির্দিষ্ট করে থাকেন তবে এটি সহজ, কারণ আপনি জানেন যে কোন সারিটি কোনটির সাথে মিল রয়েছে nid, আপনি এই নোডগুলি আমদানি করার আগেও। সুতরাং, আপনি ঠিক tnidপ্রতিটি সারি সেট করতে পারেন । স্পষ্টতই, আপনাকে অবশ্যই সতর্কতা অবলম্বন করা উচিত যে ড্রুপাল সামগ্রীগুলিতে nidবিদ্যমান যে কোনওগুলির সাথে আমদানিটিকে দ্বন্দ্ব না করে nid

আপনি যদি দ্রুপালকে nidপ্রতিটি আমদানি করা সারিটির সিদ্ধান্ত নিতে দেন তবে এটি আরও জটিল। আমি 2 টি পদক্ষেপ দিয়েছিলাম। প্রথমত, আমি সমস্ত উত্স-ভাষা সারি আমদানি করেছি, পরে ব্যবহারের জন্য উত্স নোড হিসাবে চিহ্নিত করার জন্য একটি কাস্টম ক্ষেত্র যুক্ত করেছি। দ্বিতীয়ত, আমি অনুবাদকৃত ভাষার সারিগুলি আমদানি করেছিলাম এবং tidউভয় উত্স এবং অনুবাদকৃত ভাষার নোডগুলি সেট আপ করেছি । এই দুটি ধাপ সম্পূর্ণ ভিন্ন মডিউল হতে পারে, কিন্তু সম্ভবত handier যদি আপনি ঐ দুই varialbe একই (মাইগ্রেশন) দলের পৃথক শ্রেণীর যেমন সংজ্ঞায়িত $apiআপনার Your_ModuleName.migrate.inc

অনুবাদিত ভাষার জন্য দ্বিতীয় ধাপের জন্য, আমি নীচে লিখেছি। সংক্ষেপে, এটি কাস্টম ফিল্ডের উপর ভিত্তি করে এসকিউএল কোয়েরির সাথে উত্স-ভাষা নোডটি সন্ধান করে, এটি 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;
    }
  }

এটাই সব। এর থেকে সহজ বা আরও ভাল উপায় যদি হয় তবে আমি অবাক হই না, তবে এটি আমার পক্ষে কাজ করে। যাইহোক মাইগ্রেশনের সময় অনুবাদগুলি সেট আপ করার সুবিধা আপনি সর্বদা রোলব্যাক করতে পারেন। রেফারেন্স হিসাবে আমার সম্পূর্ণ মাইগ্রেশন কোড (2 টি ভাষার জন্য, স্ট্যাটিক এইচটিএমএল ফাইলগুলি থেকে) গিটহাবটিতে উপলভ্য:
https://github.com/masasakano/migrate_goo

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.