Derzeit beschäftige ich mich damit, die Inhalte aus den alten Versionen unserer Rollerseiten nach Drupal zu integrieren.
Während ich mich bei den Artikeln dazu entschieden habe, diese von Hand zu übernehmen, da sie eh jede Menge Aufarbeitung benötigen, werde ich für die FAQ's, Galerie, ... wohl ein Übernahmescript schreiben müssen.
Ein besonderes Problem dabei sind die zu übernehmenden Bilder, die irgendwie in die cck_image - felder müssen.
Ich werde mir was überlegen und euch dann hier informieren, wie eine Lösung aussieht und was zu beachten ist.
node_import konnte mich beim Import übrigens nicht unterstützen, da es einfach zu rudimentär implementiert ist.
VORGEHENSWEISE:
Einen Import nach Drupal vorzunehmen ist eigentlich keine schwierige Angelegenheit.
Zunächst einmal müssen dazu die entsprechenden Inhaltstypen erstellt werden.
Außerdem empfehle ich die Erzeugung eines Testeintrages, um die Speicherung der Werte nachvollziehen zu können.
Sind die betroffenen Datenbanktabellen bekannt, kann mit der Erstellung des Importscriptes begonnen werden.
In meinem Beispiel handelt es sich um einen Import von Datensätzen aus einer anderen Tabelle, sowie zugehöriger Dateien (Bilder), also schon ein recht kompliziertes Beispiel.
Da es allerdings sehr konkret ist, werde ich hier weniger Codeschnippsel zeigen, sondern lediglich die Art und Weise des Imports beschreiben.
Im ersten Schritt sollten die Quelldaten per Select geholt werden.
Ich habe dazu das Zend Framework und Zend_Db verwendet.
Alle benötigten Daten werden nun in ein Array gelesen, sodass sie im folgenden Schritt durchlaufen werden können.
Für jeden Datensatz werden entsprechend der eigenen Logik auch die Pfade der Dateien gelesen.
Zunächst werden nun die gelieferten Quelldaten auf Korrektheit geprüft und eventuelle Manipulationen vorgenommen.
Nun werden die Dateien ins Zielverzeichnis kopiert (entsprechend dem CCK-Feld-Pfad + Logik), nachdem sie eventuell geprüft wurden.
War das verschieben erfolgreich, werden auch für diese entsprechende Datenbankeinträge in der Tabelle:
- DRUPALALIAS_files
erstellt.
Die dabei erzeugten fid's (last insert id's) werden in einem Array gespeichert.
Im nächsten Schritt werden die neuen Datenbankeinträge erstellt.
Handelt es sich um einen Node mit CCK-Feldern, sind die betroffenen Tabellen in der Regel:
- DRUPALALIAS_node
- DRUPALALIAS_node_revisions
Hier ist es wichtig, dass die Werte zunächst in "DRUPALALIAS_node_revisions" erzeugt werden. Danach wird der Eintrag in "DRUPALALIAS_node" erzeugt, mit der "vid" (last insert id) des neu erzeugten revisions-Eintrages. Danach wird in den Revisions noch einmal der nid-Wert durch die "last insert id" des Node-Eintrags ersetzt.
Um auch die CCK-Werte zu setzen, sind eventuell die folgenden Tabellen zu beachten:
- DRUPALALIAS_content_type_ELEMENTTYPBEZEICHNUNG (Einfache Werte)
- DRUPALALIAS_content_field_ELEMENTTYPBEZEICHNUNG_FELDBEZEICHNUNG (Mehrere Werte)
In unserem Fall verwenden wir ein CCK-Imagefeld und setzen nun das Array der FID-Werte ein, um diese zuzuordnen.
Enthält der Eintrag Taxonomie-Werte, müssen diese ausserdem gesetzt werden.
Die Tabelle dafür heißt:
- DRUPALALIAS_term_node.
Die Werte dazu ergeben sich aus den vorher entstandenen Werten für VID und NID (Versions-ID und Node-Id) sowie der ID des Taxonomie-Wertes, der verwendet werden soll.
Die entsprechenden Begriffe können entweder vorher manuell erzeugt oder auch per Script erstellt werden, dies werde ich allerdings nicht genauer erläutern, da es sich hierbei um einen sehr einfachen Vorgang handelt.
Ist dies erfolgreich, kann der Vorgang für den nächsten Datensatz fortgesetzt werden.
Es ist außerdem möglich in der Tabelle
- DRUPALALIAS_url_alias
die rewrite-Urls zum entsprechenden Node zu setzen. Auch dies ist sehr einfach und wird daher nicht genauer erklärt.
Wie man sieht, ist der gesamte Vorgang letztendlich eine Kleinigkeit.
Wichtig ist es eher, auf die Konsistenz aller Daten zu achten.
Hier können, wenn dies vom RDBMS angeboten wird, Transaktionen sehr hilfreich sein. Allerdings muss der Umgang mit den Dateien dezielt gesteuert werden.
Auch der Einsatz von Exceptionhandling und das gezielte prüfen von Rückgabewerten ist entscheident, um keine Inkonsistenz zuzulassen.
Bei größeren Unsicherheiten und vielen Risikofaktoren ist es sogar zu bedenken, den Import auf einer Kopie der Drupal-Installation auszuführen. In jedem Fall sollte ein Backup gemacht werden.
Zum Schluss möchte ich noch betonen, dass es sicher auch Möglichkeiten gibt, den Import über Drupal-eigene Methoden zu importieren.
Insbesondere aufgrund der großen Datenmengen habe ich mich aber dazu entschieden darauf zu verzichten, da die Gefahr von Fehlermeldungen und unerwartetem Verhalten für mich zu groß war.
Vorschläge sind natürlich jederzeit willkommen.
Falls jemand Codeschnippsel oder weitere Informationen möchte, kann er sich gerne bei mir melden.