Переміщення багатомовного вмісту за допомогою модуля міграції


12

У мене є одна таблиця MySQL зі змішаним англійським / французьким вмістом у кожному рядку. Я намагаюся зрозуміти, як перенести це на належний веб-сайт Drupal, налаштований на i18n.

Я можу змусити Migrate імпортувати вміст однією мовою, але я хочу, щоб він імпортував його на обидві мови. Існує 901 рядок, тому в кінцевому підсумку слід створити 1802 вузли, які пов'язані між собою.

Я просто не можу зрозуміти, як налаштувати модуль Міграція, щоб провести цикл двічі та зв’язати вузли.

EDIT: Я використав це і зміг об'єднати два:

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
Я не думаю, що вам слід використовувати postImport для додавання перекладених нід, що зіпсує переміщення карти (тобто ви не зможете повернути його назад). Зробити це двома окремими сценаріями міграції в одній групі було б правильним способом, і використання методу 'sourceMigration' дозволяє додати tnid до другої міграції, щоб вирішити питання про з'єднання перекладів разом.
Алан Діксон

Відповіді:


2

Ви можете створити дві міграції, обидва з однаковим відображенням (за винятком нід), але один зберігає вузли англійською, а другий - французькою.


1
Щоправда, але як я пов’язую це два? У мене тут є якийсь грубий код, але я знаю, що це можливо зробити все і відразу. pastebin.com/ap1P5DGY Я думаю, що в документах тут щось не вистачає для мене - drupal.org/node/1132582 - у PrepaRow () що повернено? Зв'язування може бути здійснено за допомогою postImport ().
Майк Гіффорд

Я повинен зробити завтра мігрувати речі, тож я погляну. Я думаю, що вам потрібно переглянути карту між двома міграціями, яка містить запис імпортованих нід та оригінальний ідентифікатор вмісту.
акут

1

У PripravRow () ви повертаєте істинне або хибне. Це визначає, чи обробляється цей рядок у цій конкретній міграції (і рахується парною).

Таким чином, ви можете виявити мову для кожного рядка та повернути лише 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;
}

Ще більш ефективним способом зробити це, якщо ви збираєтеся робити подвійні міграції, було б додати умову () до кожного запиту джерела (якщо ви використовуєте MigrateSourceSQL), наприклад -> condition ('lang', '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з будь-яким із існуючих nids у вмісті Drupal.

Якщо ви дозволите Drupal вирішувати nidкожен імпортований рядок, тоді це складніше. Я зробив з 2 кроків. По-перше, я імпортував усі рядки мови джерела, додавши спеціальне поле для ідентифікації його як вузла джерела для подальшого використання. По-друге, я імпортував рядки з перекладною мовою та налаштував усі tids і вихідних, і перекладних мовних вузлів. Ці два кроки можуть бути абсолютно різними модулями, але, можливо, зручніші, якщо ви визначаєте ці два як окремі класи в тій же (міграційній) групі в varialbe $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-файлів) доступний на GitHub:
https://github.com/masasakano/migrate_goo

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.