Sposta contenuto multilingue con il modulo di migrazione


12

Ho una singola tabella MySQL con contenuto misto inglese / francese in ogni riga. Sto cercando di capire come migrare questo in un sito Drupal configurato i18n.

Posso ottenere Migrate per importare il contenuto in una lingua, ma voglio importarlo in entrambe le lingue. Ci sono 901 righe, quindi alla fine dovrebbe creare 1802 nodi collegati.

Non riesco proprio a capire come impostare il modulo Migrate per eseguire il ciclo due volte e collegare i nodi.

EDIT: ho usato questo ed è stato in grado di unire i due:

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
Non credo che dovresti usare postImport per aggiungere i tuoi nid tradotti, che rovinerebbero la mappatura della migrazione (cioè non sarai in grado di ripristinarla). Farlo come due script di migrazione separati all'interno dello stesso gruppo sarebbe il modo giusto per farlo, e l'utilizzo del metodo "sourceMigration" consente di aggiungere il tnid alla seconda migrazione per risolvere la questione del collegamento delle traduzioni.
Alan Dixon,

Risposte:


2

È possibile creare due migrazioni, entrambe con la stessa mappatura (ad eccezione dei nid), ma una salva i nodi in inglese e la seconda in francese.


1
Vero, ma come collego i due? Ho un po 'di codice approssimativo qui, ma so che è possibile farlo tutto in una volta. pastebin.com/ap1P5DGY Penso che i documenti qui manchino qualcosa per me - drupal.org/node/1132582 - nel preparRow () cosa è tornato? Il collegamento può essere effettuato con postImport ().
Mike Gifford,

Domani dovrò fare alcune migrazioni, quindi darò un'occhiata. Penso che sia necessario esaminare la mappatura tra le due migrazioni che ha una registrazione dei nid che sono stati importati e l'id del contenuto originale.
circa

1

In preparRow () si restituisce vero o falso. Questo determina se quella riga viene elaborata in quella particolare migrazione (e conteggiata anche).

In questo modo, è possibile rilevare la lingua per ogni riga e restituire VERO solo per le righe che contengono contenuto nella lingua specifica per quella migrazione.

così potresti fare qualcosa del tipo:

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

Un modo ancora più efficace per farlo, se hai intenzione di fare la doppia migrazione, sarebbe aggiungere una condizione () a ogni query di origine (se stai usando MigrateSourceSQL), come -> condition ('lang', 'en', '=').


1

(Quanto segue si applica a Drupal 7 - Non conosco Drupal 6 o prima.)
Presumo che tu voglia definire la relazione di traduzione tra i nodi inglese e francese. Per fare ciò, in primo luogo, ogni nodo dovrebbe avere la lingua definita, come definito in prepareRow():

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

In secondo luogo, è necessario in qualche modo definire il tnidnodo sorgente come proprio nide quello tniddel nodo di traduzione essere il nidnodo sorgente. Nota che puoi scegliere la lingua casuale per il nodo sorgente, quindi è anche accettabile mescolare la lingua sorgente tra contenuti diversi. La domanda è come.
(Nota: penso che sia tutto ciò di cui hai bisogno, ma potrei sbagliarmi. Ho seguito i passaggi nel secondo caso di seguito e ci sono riuscito.)

Se specifichi esplicitamente il numero di nodo (= nid) di ogni riga nella tua migrazione, allora è facile, perché sai quale riga corrisponde a quale nid, anche prima di importare quei nodi. Quindi, puoi semplicemente impostare tnidciascuna riga come tale. Ovviamente, devi stare attento a non mettere in conflitto gli importati nidcon nessuno dei messaggi esistenti nidnei contenuti di Drupal.

Se lasci che Drupal decida niddi ciascuna riga importata, è più complicato. Ho fatto con i 2 passaggi. Innanzitutto, ho importato tutte le righe della lingua di origine, aggiungendo un campo personalizzato per identificarlo come nodo di origine per un uso successivo. In secondo luogo, ho importato le righe in lingua tradotta e impostato tutte le tids dei nodi sorgente e in lingua tradotta. Questi due passaggi possono essere moduli completamente diversi, ma sono forse più maneggevoli se li definisci come classi separate nello stesso gruppo (migrazione) nel varialbe $apinel tuo Your_ModuleName.migrate.inc.

Per il secondo passo per la lingua tradotta, ho scritto come segue. In breve, trova il nodo del linguaggio di origine con la query SQL, in base al campo personalizzato field_original_html_filename, che è stato definito al momento dell'importazione .

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

Questo è tutto. Non sono sorpreso se ci sarebbe un modo più semplice o migliore, ma ha funzionato per me. Ad ogni modo un vantaggio nell'impostare le traduzioni durante la migrazione è che puoi sempre eseguire il rollback. Come riferimento il mio intero codice di migrazione (per 2 lingue, dai file HTML statici) è disponibile su GitHub:
https://github.com/masasakano/migrate_goo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.