Migration vom EasyBook zum Phoca Guestbook für Joomla!
2010-03-11 23:55 (Kommentare: 54)
Schon seit Längerem scheint die Entwicklung der EasyJoomla-Projekte eher still zu stehen. Letzte Woche sorgte dann eine schon seit Monaten bekannte Sicherheitslücke im EasyBook für Aufruhr in der Community. In einem Gespräch mit Achim auf der CeBIT konnte ich mir dann einen Einblick in die Siutation im Easy-Joomla-Team verschaffen. Somit kam es für mich nicht überraschend, dass die Weiterentwicklung des EasyBooks heute mit einer kurzen Statusmeldung offiziell (vorübergehend?) eingestellt wurde. Ich finde das sehr schade, da auch einige Problemlösungen und Codefragmente von mir mit in das Projekt eingeflossen sind (ich habe damals extra darum gebeten nicht genannt zu werden). Leider sind auch bei mir keine Kapazitäten da um mal schnell das Projekt weiterzuführen, oder eine eigene Lösung zu schreiben. Also habe ich mich damit beschäftigt eine Konvertierung meiner EasyBook Installation zum Phoca Guestbook direkt per MySQL hinzubekommen und dabei eine Migrationsanleitung vom EasyBook zum Phoca Guestbook geschrieben.
Es gibt dazu auch im Forum von Joomla-Downloads.de eine Lösung, doch finde ich meine etwas eleganter.
Schritt 0: Backup und Update
Schritt 0.1: Backup
Ich gehe davon aus, dass meine geneigten Leser in der Lage sind mit Joomla! und phpMyAdmin umzugehen und vernünftig genug sind vor dem Herumspielen an der Datenbank Backups anzulegen oder noch besser das Ganze auf einer lokalen Kopie oder einem Spiegel durchführen und die einzelne Tabellen anschließend überspielen!
Schritt 0.2: Update Easybook 1.0 auf 2.0
Dieser Schritt ist noch ungetestet und nur dann durchzuführen, wenn man eine alte Easybook 1.0 Installation unter Joomla! 1.0 betreibt!
Ersatzdatumsfeld hinzufügen:
ALTER TABLE `jos_easybook`
ADD `gbdate2` datetime NOT NULL default '000-00-00 00:00:00' AFTER `gbdate`;
Timestamps in Datum konvertieren:
UPDATE `jos_easybook`
SET `gbdate2` = FROM_UNIXTIME(`gbdate`, '%Y-%m-%d %H:%i:%s');
Unnötige Felder löschen:
ALTER TABLE `jos_easybook`
DROP `gbedit`,
DROP `gbeditdate`,
DROP `gbdate`;
Felder unbenennen:
ALTER TABLE `jos_easybook`
CHANGE `gbid` `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT,
CHANGE `gbdate2` `gbdate` datetime NOT NULL default '000-00-00 00:00:00';
Schritt 1: Installation
Zuerst sollte das Phoca Guestbook in Joomla! installiert werden.
Schritt 2: Kopieren der Daten
Zum Kopieren der Einträge vom EasyBook nutzen wir die Kopierfunktion von phpMyAdmin. Einfach die Tabelle jos_easybook auswählen, dann den Tab Operationen wählen und jos_phocaguestbook_items als Ziel der Kopie angeben.
Wichtig: es müssen Struktur und Daten kopiert werden. Außerdem sollten wir die Zieltabelle löschen lassen, bevor wir die neuen Daten rüberkopieren. Die entsprechenden Einstellungen sind in der Grafik rot markiert.
Hier noch einmal die erzeugten SQL-Befehle:
DROP TABLE IF EXISTS `jos_phocaguestbook_items`;
CREATE TABLE `jos_phocaguestbook_items` (
`id` int( 10 ) NOT NULL AUTO_INCREMENT ,
`gbip` varchar( 15 ) NOT NULL default '',
`gbname` varchar( 40 ) NOT NULL default '',
`gbmail` varchar( 60 ) default NULL ,
`gbmailshow` tinyint( 1 ) NOT NULL default '0',
`gbloca` varchar( 50 ) default NULL ,
`gbpage` varchar( 150 ) default NULL ,
`gbvote` int( 10 ) default NULL ,
`gbtext` text NOT NULL ,
`gbdate` datetime default NULL ,
`gbcomment` text,
`published` tinyint( 1 ) NOT NULL default '0',
`gbicq` varchar( 20 ) default NULL ,
`gbaim` varchar( 50 ) default NULL ,
`gbmsn` varchar( 50 ) default NULL ,
`gbyah` varchar( 50 ) default NULL ,
`gbskype` varchar( 50 ) default NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM DEFAULT CHARSET = utf8;
INSERT INTO `jos_phocaguestbook_items` SELECT * FROM `jos_easybook`;
Schritt 3: Modifikation der Felder
Schritt 3.1: Modifikation
Das Phoca Guestbook hat andere Bezeichnungen und Eigenschaften für die Datenbankfelder. Die Änderungen sind in der folgenden SQL-Query zusammengefasst:
ALTER TABLE `jos_phocaguestbook_items`
CHANGE `id` `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT,
CHANGE `gbname` `username` VARCHAR( 100 ),
CHANGE `gbmail` `email` VARCHAR( 50 ) NOT NULL,
CHANGE `gbpage` `homesite` VARCHAR( 50 ) NOT NULL,
CHANGE `gbip` `ip` VARCHAR( 20 ) AFTER `homesite`,
CHANGE `gbtext` `content` text NOT NULL,
CHANGE `gbdate` `date` datetime NOT NULL default '000-00-00 00:00:00';
Hier könnte es Probleme mit dem Feld für die Homepage (gbpage bzw. homesite) geben. Das war im EasyBook 150 Zeichen lang und wird auf 50 Zeichen gekürzt. Da Joomla! afaik keinen Vergleich der Installationsdaten mit der Datenbank vornimmt, könnte man auf die Kürzung auch verzichten, aber andererseits… wer hat schon URLs mit mehr als 50 Zeichen?
Schritt 3.2: Hinzufügen von (X)HTML-Zeilenumbrüchen
Im Easybook wurden die Zeilenumbrüche '\n' direkt vor der Ausgabe in richtige (X)HTML-Zeilenumbrüche umgewandelt. Dies ist beim Phoca Guestbook nicht der Fall, da dort die Zeilenumbrüche direkt als (X)HTML-Code in der Datenbank gespeichert werden. Möchte man die '\n' also schon beim Konvertieren der Daten in „richtige” Zeilenumbrüche umwandeln, dann bietet sich folgende query an:
UPDATE `jos_phocaguestbook_items`
SET `content` = REPLACE(`content`,'\n','<br />\n');
Das Phoca Guestbook schreibt den Zeilenumbruch '\n' und den (X)HTML-Code in die Kommentare. Deshalb müssen eventuell neuere Kommentare vom Phoca Guestbook von dieser query ausgeschlossen werden. Dies geht über eine WHERE-Bedingunge in der query: WHERE `date`<'2010-03-30 23:00:00'.
Schritt 3.3: Zusammenführen der Adminkommentare mit den Kommentaren
In Schritt 4 werden die nicht mehr benötigten Felder gelöscht. Dazu gehören auch die Adminkommentare. Möchte man diese behalten, so kann man sie mit einer einfachen Query in die Originalkommentare einfügen:
UPDATE `jos_phocaguestbook_items`
SET `content` = CONCAT(`content`,'\n<div class="admincomment">',`gbcomment`,'</div>')
WHERE `gbcomment` != '';
Die Kommentare werden in einen div-Container mit der Klasse admincomment an das Kommentar des Users angehängt. Die Klasse kann natürlich auch unbenannt werden!
Schritt 4: Löschen von Feldern
Das EasyBook hatte einige Features, die vom Phoca Guestbook nicht unterstützt werden. Die entsprechend überflüssigen Felder werden mit der folgenden SQL-Query gelöscht:
ALTER TABLE `jos_phocaguestbook_items`
DROP `gbmailshow`,
DROP `gbloca`,
DROP `gbvote`,
DROP `gbcomment`,
DROP `gbicq`,
DROP `gbaim`,
DROP `gbmsn`,
DROP `gbyah`,
DROP `gbskype`;
Also im Einzelnen wären das: die Angaben zu den Instant Messengern, die Adminkommentare zu den Einträgen, die Bewertungen, die Ortsangabe und die Angabe, ob der User möchte, dass seine Mailadresse öffentlicht angezeigt wird. Gerade wegen dem letzten Punkt sollte man daher vorsichtig sein und gegebenfalls darauf verzichten die Mailadressen zu den einzelnen Beiträgen plötzlich öffentlich anzuzeigen!
Schritt 5: Hinzufügen neuer Felder
Die folgende SQL-Query fügt die vom Phoca Guestbook zusätzlich benötigten Felder zur Tabelle hinzu:
ALTER TABLE `jos_phocaguestbook_items`
ADD `catid` INT( 11 ) NOT NULL default '0' AFTER `id`,
ADD `sid` INT( 11 ) NOT NULL default '0' AFTER `catid`,
ADD `userid` INT( 11 ) NOT NULL default '0' AFTER `username`,
ADD `title` VARCHAR( 20 ) NOT NULL AFTER `ip`,
ADD `checked_out` INT( 11 ) NOT NULL default '0' AFTER `published`,
ADD `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00' AFTER `checked_out`,
ADD `ordering` INT( 11 ) NOT NULL default '0' AFTER `checked_out_time`,
ADD `params` text NOT NULL AFTER `ordering`;
Schritt 6: Nachbereitung
Das Phoca Guestbook unterstützt das Anlegen mehrere Gästebücher. Deshalb muss man den Einträgen noch die passende ID des Gästebuches zuordnen. Dafür habe ich im Joomla!-Backend ein Phoca Guestbook angelegt und die ID (hier die 1) als catid eingetragen. Außerdem wird die id der Einträge für die Sortierungsspalte übernommen.
UPDATE `jos_phocaguestbook_items`
SET `catid` = '1',
`ordering` = `id`;
Wer sich jetzt noch über den Powered by Eintrag ärgert, der bearbeitet die Datei ~/front/views/phocaguestbook/tmpl/default.php (Zipfile) oder ~/components/com_phocaguestbook/views/phocaguestbook/tmpl/default.php (Joomla!-Installation) und kopiert sie in den Ordner ~/templates/your_template/html/com_phocaguestbook/phocaguestbook/.
Der Powered by Teil steckt in der Templatevariable info:
//vorher
$form2 .= '</form></div>'.$this->tmpl['info'];
//nacher
$form2 .= '</form></div>';
Das Kopieren in den eigenen Templateordner ist nicht unbedingt notwendig, stellt aber eine saubere Möglichkeit dar die eigenen Änderungen bei einem Update nicht zu überschreiben.
PS: Selbstverständlich ist das Phoca Guestbook in den Credits der von mir verwalteten Joomla!-Installationen mit Logo und Backlink gelistet!
Einen Kommentar schreiben
Kommentar von deltapapa | 2010-03-13
Moin Benjamin,
ich hatte Probleme, den letzten Part durchzuführen:
UPDATE `jos_phocaguestbook_items`
SET `catid` = '1',
SET`ordering` = `id`;
Ich habe das dann einzeln gemacht, und da gings.
Vielen Dank,
Dirk
Kommentar von b2m | 2010-03-13
Vielen Dank für den Hinweis. Das eine SET war zu viel.
Kommentar von Albin | 2010-03-18
Hi!
Vielen Dank mal - ich bekomme beim Schritt 1 - beim Kopieren der Tabelle immer folgende Fehlermeldung:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '250DEFAULT CHARSET = utf8' at line 18
Zum Haareraufen…
Kommentar von b2m | 2010-03-18
Das ist natürlich nervig. Ich habe dir die zugehörigen SQL-Befehle herauskopiert und mit in den Bericht aufgenommen. Damit sollte es funktionieren.
Kommentar von Albin | 2010-03-23
Perfekt - jetzt funktionierts!
Vielen vielen Dank!
Kommentar von X-Bit | 2010-03-25
Erst mal 1000 Dank für diese Schritt-für-Schritt Anleitung, da komm sogar ich mit :) !
Dem Anschein nach, gehen die ehemaligen Admin-Kommentare flöten…
Hat wer eine Eingebung, wie ich diese retten könnte?!
Kommentar von b2m | 2010-03-25
Klar habe ich ja geschrieben =) Schau dir mal den neu hinzugefügten Schritt 3.3 an. Der wird dir weiterhelfen.
Kommentar von X-Bit | 2010-03-25
Wow… das macht Spass! Besten Dank!
Kommentar von X-Bit | 2010-03-25
…zu früh gefreut!
#1054 - Unknown column 'gbtext' in 'field list'
Ich geh jetzt mal einen Kaffee trinken, bin schon zu lange dran :(
Danke auf jeden Fall für deine Hilfe!
Kommentar von b2m | 2010-03-25
Mein Fehler - hatte die Schritte 3.1 und 3.3 vertauscht => gbtext. Sollte jetzt aber passen.
Mein aktuelles Projekt: ein Gemeinschaftsblog auf www.aduoscriptum.de.

