Migrare: qual è la differenza tra apprendi () e apprendi ()?


8

Utilizzo del modulo Migrate: capisco che preparRow () esegue un filtro sulla riga e dovrebbe restituire VERO o FALSO in base ad alcune condizioni, che consente la migrazione o meno di una riga, ma qualcuno potrebbe chiarire:

  • quando usare Prep ()
  • quando usare PrepRow ()
  • perché non si dovrebbe aggiungere un filtro nella query sql iniziale per filtrare i risultati delle righe che è possibile rimuovere / includere in uno dei precedenti

Grazie!


1
Un motivo per non filtrare alla query sql è l'aggiunta di un mapping per le righe che si decide di saltare. Ad esempio, sto importando utenti su un sito esistente. Voglio saltare gli utenti che già esistono sulla destinazione e voglio aggiungere una mappatura come se l'utente fosse effettivamente importato , quindi altre migrazioni a seconda di ciò funzionano in modo smothly.
jonhattan,

Risposte:


9

Tutto ciò è approfondito nella documentazione relativa alle classi di migrazioni fornita dal progetto. In particolare nella pagina Metodi di migrazione comunemente implementata che dice quanto segue e include ulteriori implementazioni di funzioni di esempio semplici. Dai documenti ...

funzione prepar_row ($ row)

Il metodo preparRow () viene chiamato dal metodo next () della classe di origine, dopo aver caricato la riga di dati. L'argomento $ row è un oggetto stdClass contenente i dati non elaborati forniti dall'origine. Esistono due motivi principali per implementare preparRow ():

  1. Per modificare la riga di dati prima che passi attraverso altri metodi e gestori: ad esempio, recuperare i dati correlati, suddividere i campi di origine, combinare o creare nuovi campi di origine basati su una logica.
  2. Per saltare in modo condizionale una riga (restituendo FALSE).

preparazione della funzione ($ entity, stdClass $ row)

Il metodo Prep () della classe di migrazione viene chiamato dal metodo apprendi la classe di destinazione, dopo che ha chiamato tutti i metodi (() a livello di campo e immediatamente prima che l'oggetto di destinazione venga salvato. L'argomento $ entity è l'oggetto di destinazione come popolato dai mapping dei campi iniziali e manipolato dai metodi a livello di campo; l'argomento $ row è un oggetto che contiene i dati dopo una preparazione di callback e di eventuali callback. Il metodo apprendi () è l'ultima possibilità di manipolare l'oggetto di destinazione prima che venga salvato nel database Drupal. È importante ricordare che, poiché viene chiamato dopo i gestori dei campi, i campi avranno le loro forme completamente espanse (cioè, in Drupal 7 un valore del campo di testo sarà $entity->field_textual_data['und'][0]['value']invece che semplicemente $entity->field_textual_data).

Il modulo Migrate è un framework che consente di incapsulare un processo di migrazione da un dato di origine a una posizione e configurazione di destinazione. Una migrazione è composta da:

  • definire dove si trovano i dati
  • definire dove dovrebbero andare i dati
  • recuperare un dato (riga)
  • disinfettare i dati
  • iniziare a spostare i dati (diciamo in un'entità)
  • sposta effettivamente i dati
  • dopo aver spostato i dati, eseguire ulteriori azioni

L'API fornisce hook per influire sui dati che vengono spostati in questo ciclo di vita di una migrazione. Escludendo i dati dalla migrazione tramite la query iniziale, si limita la quantità di controllo che si ha sul totale dei dati che è possibile spostare. Per le migrazioni secondarie potresti trovare questo utile. Ma in una migrazione generale dei contenuti vorresti che la migrazione fosse il più completo possibile.


Grazie Tenken, esattamente quello che stavo cercando. Apprezzo anche le considerazioni sulla rimozione di elementi dalla query iniziale.
user4984

6

Se è possibile selezionare la riga giusta scrivendola in una query, cercarla, tuttavia preprareRow () può essere utilizzato in sistemi più complessi in cui potrebbero essere necessari diversi parametri prima che la riga venga migrata. In tal caso, è più semplice eseguire tutte le righe ed eseguire la logica su una riga per riga.

preparazione () viene eseguita dopo preparRow () ed è la tua ultima possibilità di modificare l'entità prima che venga salvata nel database.

Ulteriori informazioni al riguardo sono disponibili qui: https://www.drupal.org/node/1132582


Ho trovato questo conciso e comprensibile
Johnathan Elmore,

3

Questa è una risposta parziale e in nessun modo completa. Mi piacerebbe anche scoprire di più su entrambi. Quindi questo può far parte di una discussione; anche se ho scritto come risposta anziché come commento a causa dei seguenti frammenti di codice ed esempi di come ho usato le classi di cui sopra.

Permettetemi di illustrare alcuni dei miei usi apprendi () come - che fa come dice.

Di recente stavo fornendo alcuni dati da importare da un database non drupal. L'entità a cui sto aggiungendo richiede l'inserimento di campi che non ho nell'importazione dei dati.

Quindi, prima che venga creata la mia classe di origine, posso aggiungere

  $source_fields = array(
    'changed' => t('Timestamp of when the change was made.'),
    'created' => t('Timestamp of when the node was Created.'),
 );

e quindi nella funzione preposiziona posso fare quanto segue

$nowtimestamp = mktime(date('Y-m-d'));
$row->changed = $nowtimestamp;
$row->created = $nowtimestamp;

puoi anche eseguire istruzioni php if / else qui se necessario.

Ho anche usato la funzione di preparazione nel mio codice e la sto usando per assegnare valori all'entità.

$account->field_job_location [und][0]['tid'] = $row->job_location_tid;

Ho dovuto usare questo in questo scenario solo quando ho creato il mio plug-in nodo personalizzato.

Inoltre, se hai bisogno di fare calcoli su questo, allora puoi farlo in preparazioneRow che viene eseguito prima di prepar ()

Ad esempio, nell'importazione avevo un valore con l'etichetta "Città" e potevo trasformarlo in un ID termine.

 if ($TownCity == 'London' ){
            $row->job_location_tid = '10';
      } else {
        $row->job_location_tid = '11';
      } 

Spero che questo possa essere d'aiuto.

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.