Migrieren: Was ist der Unterschied zwischen prepare () und prepareRow ()?

8

Verwenden des Migrate-Moduls: Ich verstehe, dass prepareRow () einen Filter für die Zeile ausführt und unter bestimmten Bedingungen TRUE oder FALSE zurückgeben sollte, wodurch eine Zeile migriert werden kann oder nicht, aber könnte jemand klarstellen:

  • wann zu verwenden vorbereiten ()
  • wann ist prepareRow () zu verwenden?
  • Warum würden Sie der anfänglichen SQL-Abfrage keinen Filter hinzufügen, um Zeilenergebnisse zu filtern, die Sie möglicherweise entfernen / in eine der oben genannten Optionen aufnehmen?

Vielen Dank!

user4984
quelle
1
Ein Grund, bei SQL-Abfragen nicht zu filtern, besteht darin, eine Zuordnung für die Zeilen hinzuzufügen, die Sie überspringen möchten. Zum Beispiel importiere ich Benutzer auf eine vorhandene Site. Ich möchte Benutzer überspringen, die bereits am Ziel vorhanden sind, und ich möchte eine Zuordnung hinzufügen, als ob der Benutzer tatsächlich importiert worden wäre , damit andere Migrationen, die davon abhängen, reibungslos funktionieren.
Jonathan

Antworten:

9

Dies alles wird ausführlich in der vom Projekt bereitgestellten Dokumentation zu Migrationsklassen behandelt . Insbesondere auf der Seite Commononly Implemented Migration Methods (Commononly Implemented Migration-Methoden) , auf der Folgendes angegeben ist und weitere einfache Implementierungen von Beispielfunktionen enthalten sind. Aus den Dokumenten ...

Funktion prepare_row ($ row)

Die prepareRow () -Methode wird nach dem Laden der Datenzeile von der Quellklasse next () aufgerufen. Das Argument $ row ist ein stdClass-Objekt, das die von der Quelle bereitgestellten Rohdaten enthält. Es gibt zwei Hauptgründe für die Implementierung von prepareRow ():

  1. So ändern Sie die Datenzeile, bevor sie weitere Methoden und Handler durchläuft: Abrufen verwandter Daten, Aufteilen von Quellfeldern, Kombinieren oder Erstellen neuer Quellfelder basierend auf einer bestimmten Logik.
  2. Um eine Zeile bedingt zu überspringen (indem Sie FALSE zurückgeben).

Funktion vorbereiten ($ entity, stdClass $ row)

Die Methode prepare () der Migrationsklasse wird von der Methode prepare () der Zielklasse aufgerufen, nachdem sie alle prepare () -Methoden auf Feldebene aufgerufen hat und unmittelbar bevor das Zielobjekt gespeichert wird. Das $ entity-Argument ist das Zielobjekt, das von den anfänglichen Feldzuordnungen ausgefüllt und von den Methoden auf Feldebene bearbeitet wird. Das Argument $ row ist ein Objekt, das die Daten enthält, nachdem prepareRow () und alle Rückrufe angewendet wurden. Die prepare () -Methode ist die letzte Möglichkeit, das Zielobjekt zu bearbeiten, bevor es in der Drupal-Datenbank gespeichert wird. Es ist wichtig zu bedenken, dass Felder, da sie nach den Feldhandlern aufgerufen werden, in ihrer vollständig erweiterten Form vorliegen (dh in Drupal 7 wird ein Textfeldwert $entity->field_textual_data['und'][0]['value']nicht einfach, sondern angezeigt $entity->field_textual_data).

Das Migrate- Modul ist ein Framework, mit dem Sie einen Migrationsprozess von einem Quelldatenelement zu einem Zielspeicherort und einer Zielkonfiguration kapseln können. Eine Migration besteht aus:

  • Definieren Sie, wo sich die Daten befinden
  • Definieren Sie, wohin die Daten gehen sollen
  • Daten abrufen (Zeile)
  • Desinfizieren Sie die Daten
  • beginnen Sie, die Daten zu verschieben (z. B. in eine Entität)
  • Verschieben Sie die Daten tatsächlich
  • Führen Sie nach dem Verschieben der Daten zusätzliche Aktionen aus.

Die API bietet Hooks, um die Daten zu beeinflussen, die in diesem Lebenszyklus einer Migration verschoben werden. Indem Sie Daten über Ihre erste Abfrage von der Migration ausschließen, begrenzen Sie, wie viel Kontrolle Sie über die Gesamtdaten haben, die Sie verschieben können. Für Submigrationen ist dies möglicherweise hilfreich. Bei einer allgemeinen Inhaltsmigration möchten Sie jedoch, dass Ihre Migration so umfassend wie möglich ist.

Tenken
quelle
Danke Tenken, genau das, wonach ich gesucht habe. Schätzen Sie auch die Gedanken zum Entfernen von Elementen aus der ursprünglichen Abfrage.
user4984
6

Wenn Sie die richtige Zeile auswählen können, indem Sie sie in eine Abfrage schreiben, wählen Sie sie aus. PreprareRow () kann jedoch in komplexeren Systemen verwendet werden, in denen möglicherweise mehrere Parameter erforderlich sind, bevor die Zeile migriert wird. In einem solchen Fall ist es einfacher, alle Zeilen zu durchlaufen und die Logik zeilenweise auszuführen.

prepare () wird nach prepareRow () ausgeführt und ist Ihre letzte Chance, die Entität zu ändern, bevor sie in der Datenbank gespeichert wird.

Weitere Informationen hierzu finden Sie hier: https://www.drupal.org/node/1132582

Neograph734
quelle
Ich fand das kurz und verständlich
Johnathan Elmore
3

Dies ist eine Teilantwort und in keiner Weise vollständig. Ich würde auch gerne mehr über beide erfahren. Dies kann also Teil einer Diskussion sein; obwohl ich aufgrund der folgenden Codefragmente und Beispiele, wie ich die obigen Klassen verwendet habe, eher als Antwort als als Kommentar geschrieben habe.

Lassen Sie mich einige meiner Verwendungen prepareRow () als - veranschaulichen, was es tut.

Vor kurzem gab ich einige Daten zum Importieren aus einer Nicht-Drupal-Datenbank. Für die Entität, zu der ich hinzufüge, müssen Felder eingegeben werden, die ich nicht in meinem Datenimport habe.

Bevor meine Quellklasse erstellt wird, kann ich hinzufügen

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

und dann kann ich in der Funktion prepareRow Folgendes tun

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

Sie können hier bei Bedarf auch php if / else-Anweisungen ausführen.

Ich habe auch die Vorbereitungsfunktion in meinem Code verwendet und verwende sie, um der Entität Werte zuzuweisen.

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

Ich musste dies nur in diesem Szenario verwenden, da ich mein eigenes benutzerdefiniertes Knoten-Plugin erstellt habe.

Auch wenn Sie diesbezüglich Berechnungen durchführen müssen, können Sie dies in prepareRow tun, das vor prepare () ausgeführt wird.

Zum Beispiel hatte ich beim Import einen Wert mit der Bezeichnung "Stadt" - und konnte daraus eine Term-ID machen.

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

Ich hoffe das hilft.

Deejay
quelle