[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REDAXO Forum • Update von 3.2 auf 4.7.2 - ein Erfahrungsbericht
Seite 1 von 1

Update von 3.2 auf 4.7.2 - ein Erfahrungsbericht

Verfasst: 11. Nov 2018, 16:04
von Koala
Vorgeschichte
Provider schaltet PHP 5.x ab. Bis dahin lief Redaxo 3.2 problemlos (mit wenigen Anpassungen des PHP-Codes an aktuelle PHP-Versionen) seit über 10 Jahren :D
Es gibt keinen aktuellen Datenexport via Redaxo-eigenem Import/Export-Addon. Lediglich die Dateien und die Datenbank existieren. Es gibt (ohne größeren Aufwand für den Entwickler) keine Chance das alte Rex 3.2 zu reaktivieren :?

Was bleibt ist nur ein Update auf eine aktuelle Redaxo-Version. Die Entscheidung fällt erst einmal zu Gunsten von Redaxo 4.7.2, da hier geringere Probleme mit der Anpassung erwartet werden. Ein späteres Update auf Rex5 sollte damit dann auch leichter fallen.
Vorhanden sind PHP 7.0 auf der lokalen Entwicklermaschine und PHP 7.2 auf dem späteren Zielserver.

Hinweis: Es wird dringend empfohlen, dass error-reporting für die Zeit der Anpassungen so einzustellen, dass alle Fehler (E_ALL) ausgegeben werden. Mehr dazu im Schritt 2.

Update-Start
Da die meisten Änderungen an der Datenbank vorzunehmen sind, werden die bisherigen Tabellen per MySQLDumper (der war grad verfügbar, mit phpMyAdmin gehts natürlich auch) erst einmal auf den lokalen Server kopiert und in eine eigene Datenbank gepackt.
Die komplette Dateistrucktur noch per FTP nach lokal holen (die cache_-Dateien aus dem files-Verzeichnis können dabei weggelassen werden).

Es empfiehlt sich von der Datenbank mit den originalen Daten eine Kopie bereit zu halten, falls doch etwas schief läuft :wink:

Mein Vorgehen war im wesentlichen wie hier beschrieben: GIST: REDAXO Update 3.2 auf 4.5.1
Weitere Hinweise finden sich auch in der Redaxo-Doku: Update von REX 3.x auf REX 4.0

Hinweis: Achtet darauf, dass die DB-Tabellen mit "rex_" beginnen. Ist das nicht der Fall, müssen entsprechende Anpassungen bei den SQL-Abfragen gemacht werden!

Schritt 1
Die Datenbank-Tabellen bekommen ein Update. Dazu in phpMyAdmin unter SQL die SQL-Befehle ausführen lassen (alles mit einem mal oder Schrittweise reinkopieren und mit OK den Vorgang starten), wie im GIST unter update_3_2_to_4_5_1.sql hinterlegt (stehen auch hier noch mal mit drin - am Ende).

Die Umstellung der Tabellen auf "utf8_general_ci" ist für die Redaxo-eigenen Tabellen schon mit dabei. Für durch Addons installierte Tabellen muss das händisch gemacht werden.

Um nicht die Datei "change_columns_collation_to_utf8.php" ausführen zu müssen, kann die Änderung der übrigen Tabellen auch händisch in phpMyAdmin ausgeführt werden. Dazu ist diese Zeile zu verwenden ("DEINE-TABELLE" ist durch die zu ändernde Tabelle zu ersetzen):

Code: Alles auswählen

ALTER TABLE `rex_DEINE-TABELLE` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Damit ist die Anpassung der DB-Tabellen schon abgeschlossen.


Schritt 2
Redaxo mit dem normalen Setup installieren. Hierbei wurde aber der Punkt mit dem Neuanlegen der Datenbanktabellen ausgelassen, da es ja schon Tabellen gibt.

Hinweis: Beim Import der DB-Tabellen auf die oben beschriebene Art und Weise wurde auch die User-Tabelle mit übernommen. Diese enthält das Passwort noch im Klartext, wenn nicht bereits eine Verschlüsselung in Rex 3.2 verwendet wurde! Nach dem ersten Login als Admin sollten bei allen Benutzern die Passworte geändert werden. Erst nach der Änderung, ein einfaches erneutes Speichern genügt nicht, werden die Passworte in verschlüsselter Form gespeichert!

Nun in der redaxo/include/master.inc.php die Zeile 114 ändern:

Code: Alles auswählen

//error_reporting(error_reporting() & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
error_reporting(E_ALL);
Redaxo selbst sollte keine Fehler werfen (zumindest unter PHP 7.0 kam da bei mir nix auf).
Warum möchtest du alle Fehler angezeigt bekommen? Nur so können die Fehlerquellen in den Templates und Modulen schnell gefunden und behoben werden.
Wer kann, sollte die Möglichkeit nutzen, die Fehler per Serverkonfiguration in eine Datei umzuleiten und sich diese Datei nebenbei ausgeben lassen. Für Linux geht das z.B. mittels tail -f /Pfad/Zur/FehlerSammelDatei. Für Windows gibt es ebenfalls entsprechende Programme dafür.

Hinweis: In den Templates oder Modulen kann es ebenfalls Änderungen zum error_reporting geben. Diese müssten dann auch angepasst oder besser noch gleich deaktiviert werden, da die Einstellung in der master.inc.php für alles greift.

Hinweis: Diese Einstellung (error_reporting) sollte keinesfalls auf dem Produktivsystem geändert werden bzw. ist dort wieder enstprechend der Vorgabe zurück zu ändern! Warum? Aus Gründen!

Schritt 3
Jetzt gehts ans Eingemachte - die notwendigen Anpassungen im Backend können beginnen.
Das Frontend ansich sollte schon aufrufbar sein, dürfte aber diverse Fehlermeldungen erscheinen lassen - je nach dem, welche Module bzw. Addons bisher verwendet wurden.

Als erstes die Addons ImageManager und Metainfo installieren (und was sonst noch benötigt wird und schon bei der Standardinstallation im Addon-Verzeichnis vorhanden ist).
Dann die Templates anpassen.

Code: Alles auswählen

header('Content-Type: text/html; charset=utf-8');
<meta http-equiv="content-type" content="text/html; charset=utf-8">

Wer Templates in sein Haupttemplate einbindet (z.B. für die Navigation), muss entpsrechende Anpassungen vornehmen:

Code: Alles auswählen

alte Schreibweise, um ein Template einzubinden:
<?php include($REX['INCLUDE_PATH'] .'/generated/templates/2.template'); ?>

neue Schreibweise:
// innerhalb von PHP Tags
$navTemplate = new rex_template(2); 
include $navTemplate->getFile();

// ausserhalb von PHP Tags
REX_TEMPLATE[2]
Habe das auch erst übersehen und mich gewundert, wieso die Navigationen nicht erscheinen :-D

Im Zuge der Fehlerbehebungen gab es auch Überraschungen.
So stellte sich heraus, dass in einigen Modulen noch die einfache Schreibweise für PHP-Tags verwendet wurde, was nun einen Fehler erzeugte.
Aus <? musste nur ein <?php werden.
In einem Modul musste der Aufruf new article zu new rex_article geändert werden.


letzte Worte
Alles in allem funktioniert das Rüberholen der alten Rex 3 Installation in eine neue Rex 4 doch recht einfach, wenn man weiß, welche Änderungen wo vorzunehmen sind.

Was bleibt ist das Feintuning.
Diverse Module versagen ihren Dienst, da es keine entprechenden Addons (mehr) für Redaxo 4 gibt bzw. sich der Code geändert hat. Auf den ersten Blick scheint sogar die Umstellung auf UTF8 ganz gut funktioniert zu haben. Bis auf den E-Mail-Versand über Kontaktformulare sind keine falschen Umlaute zu erkennen gewesen.

Auf dieser Basis sollte ein Upgrade auf Redaxo 5 dann auch nicht mehr allzu schwer fallen. Aber das ist ein anderes Thema :-D



die SQL-Befehle

Code: Alles auswählen

-- Update von Redaxo 3.2 zu Redaxo 4.5.1

ALTER TABLE `rex_action` ADD `preview` TEXT, ADD `presave` TEXT, ADD `postsave` TEXT, ADD `previewmode` TINYINT NULL, ADD `presavemode` TINYINT NULL, ADD `postsavemode` TINYINT NULL;
-- weise die Aktionen den neuen Spalten richtig zu
UPDATE `rex_action` SET `presave` = `action` WHERE `prepost` = '0';
UPDATE `rex_action` SET `postsave` = `action` WHERE `prepost` = '1';
UPDATE `rex_action` SET `presavemode` = `sadd` + 2 * `sedit` + 4 * `sdelete` WHERE `prepost` = '0';
UPDATE `rex_action` SET `postsavemode` = `sadd` + 2 * `sedit` + 4 * `sdelete` WHERE `prepost` = '1';
ALTER TABLE `rex_action` DROP `action`, DROP `prepost`, DROP `sadd`, DROP `sedit`, DROP `sdelete`;
ALTER TABLE `rex_action` ADD `createuser` VARCHAR(255) NOT NULL, ADD `createdate` INT(11) NOT NULL, ADD `updateuser` VARCHAR(255) NOT NULL, ADD `updatedate` INT(11) NOT NULL;
ALTER TABLE `rex_action` ADD `revision` INT(11) NOT NULL DEFAULT '0';

ALTER TABLE `rex_article` DROP `cattype`;
ALTER TABLE `rex_article` DROP `alias`;
ALTER TABLE `rex_article` DROP `fe_user`;
ALTER TABLE `rex_article` DROP `fe_group`;
ALTER TABLE `rex_article` DROP `fe_ext`;
ALTER TABLE `rex_article` ADD `revision` INT( 11 ) NOT NULL DEFAULT '0';
ALTER TABLE `rex_article` ADD `art_online_from` TEXT NULL;
ALTER TABLE `rex_article` ADD `art_online_to` TEXT NULL;
ALTER TABLE `rex_article` ADD `art_description` TEXT NULL;
ALTER TABLE `rex_article` ADD `art_keywords` TEXT NULL;
ALTER TABLE `rex_article` ADD `art_file` VARCHAR(255) NULL;
ALTER TABLE `rex_article` ADD `art_teaser` VARCHAR(255) NULL;
ALTER TABLE `rex_article` ADD `art_type_id` VARCHAR(255) NULL;
-- hole Inhalte in neue Spalten vor dem Löschen der bisherigen Spalten
UPDATE `rex_article` SET `art_description` = `description`;
UPDATE `rex_article` SET `art_keywords` = `keywords`;
UPDATE `rex_article` SET `art_file` = `file`;
UPDATE `rex_article` SET `art_teaser` = '|true|' WHERE `teaser` = '1';
UPDATE `rex_article` SET `art_type_id` = 'Standard' WHERE `type_id` = '1';
UPDATE `rex_article` SET `art_online_from` = `online_from`;
UPDATE `rex_article` SET `art_online_to` = `online_to`;
ALTER TABLE `rex_article` DROP `online_from`;
ALTER TABLE `rex_article` DROP `online_to`;
ALTER TABLE `rex_article` DROP `type_id`;
ALTER TABLE `rex_article` DROP `teaser`;
ALTER TABLE `rex_article` DROP `description`;
ALTER TABLE `rex_article` DROP `keywords`;
ALTER TABLE `rex_article` DROP `file`;
ALTER TABLE `rex_article` CHANGE `attribute` `attributes` TEXT NOT NULL;

ALTER TABLE `rex_article_slice` CHANGE `value1` `value1` text NULL, CHANGE `value2` `value2` text NULL, CHANGE `value3` `value3` text NULL, CHANGE `value4` `value4` text NULL, CHANGE `value5` `value5` text NULL, CHANGE `value6` `value6` text NULL, CHANGE `value7` `value7` text NULL, CHANGE `value8` `value8` text NULL, CHANGE `value9` `value9` text NULL, CHANGE `value10` `value10` text NULL, CHANGE `value11` `value11` text NULL, CHANGE `value12` `value12` text NULL, CHANGE `value13` `value13` text NULL, CHANGE `value14` `value14` text NULL, CHANGE `value15` `value15` text NULL, CHANGE `value16` `value16` text NULL, CHANGE `value17` `value17` text NULL, CHANGE `value18` `value18` text NULL, CHANGE `value19` `value19` text NULL, CHANGE `value20` `value20` text NULL, CHANGE `file1` `file1` varchar(255) NULL, CHANGE `file2` `file2` varchar(255) NULL, CHANGE `file3` `file3` varchar(255) NULL, CHANGE `file4` `file4` varchar(255) NULL, CHANGE `file5` `file5` varchar(255) NULL, CHANGE `file6` `file6` varchar(255) NULL, CHANGE `file7` `file7` varchar(255) NULL, CHANGE `file8` `file8` varchar(255) NULL, CHANGE `file9` `file9` varchar(255) NULL, CHANGE `file10` `file10` varchar(255) NULL, CHANGE `filelist1` `filelist1` text NULL, CHANGE `filelist2` `filelist2` text NULL, CHANGE `filelist3` `filelist3` text NULL, CHANGE `filelist4` `filelist4` text NULL, CHANGE `filelist5` `filelist5` text NULL, CHANGE `filelist6` `filelist6` text NULL, CHANGE `filelist7` `filelist7` text NULL, CHANGE `filelist8` `filelist8` text NULL, CHANGE `filelist9` `filelist9` text NULL, CHANGE `filelist10` `filelist10` text NULL, CHANGE `link1` `link1` varchar(10) NULL, CHANGE `link2` `link2` varchar(10) NULL, CHANGE `link3` `link3` varchar(10) NULL, CHANGE `link4` `link4` varchar(10) NULL, CHANGE `link5` `link5` varchar(10) NULL, CHANGE `link6` `link6` varchar(10) NULL, CHANGE `link7` `link7` varchar(10) NULL, CHANGE `link8` `link8` varchar(10) NULL, CHANGE `link9` `link9` varchar(10) NULL, CHANGE `link10` `link10` varchar(10) NULL, CHANGE `linklist1` `linklist1` text NULL, CHANGE `linklist2` `linklist2` text NULL, CHANGE `linklist3` `linklist3` text NULL, CHANGE `linklist4` `linklist4` text NULL, CHANGE `linklist5` `linklist5` text NULL, CHANGE `linklist6` `linklist6` text NULL, CHANGE `linklist7` `linklist7` text NULL, CHANGE `linklist8` `linklist8` text NULL, CHANGE `linklist9` `linklist9` text NULL, CHANGE `linklist10` `linklist10` text NULL, CHANGE `php` `php` text NULL, CHANGE `html` `html` text NULL;
ALTER TABLE `rex_article_slice` CHANGE `clang` `clang` INT(11) NOT NULL, CHANGE `ctype` `ctype` INT(11) NOT NULL, CHANGE `re_article_slice_id` `re_article_slice_id` INT(11) NOT NULL, CHANGE `article_id` `article_id` INT(11) NOT NULL, CHANGE `createdate` `createdate` INT(11) NOT NULL, CHANGE `updatedate` `updatedate` INT(11) NOT NULL;
ALTER TABLE `rex_article_slice` ADD `next_article_slice_id` int(11);
UPDATE `rex_article_slice` SET `ctype`=`ctype`+1;
ALTER TABLE `rex_article_slice` ADD `revision` INT(11) NOT NULL DEFAULT '0';

ALTER TABLE `rex_clang` ADD `revision` INT(11) NOT NULL DEFAULT '0';

ALTER TABLE `rex_file` ADD `attributes` TEXT NULL AFTER `category_id`;
ALTER TABLE `rex_file` ADD `revision` INT( 11 ) NOT NULL DEFAULT '0';
ALTER TABLE `rex_file` ADD `med_description` TEXT NULL;
ALTER TABLE `rex_file` ADD `med_copyright` TEXT NULL;
-- hole Inhalte in neue Spalten vor dem Löschen der bisherigen Spalten
UPDATE `rex_file` SET `med_description` = `description`;
UPDATE `rex_file` SET `med_copyright` = `copyright`;
ALTER TABLE `rex_file` DROP `copyright`;
ALTER TABLE `rex_file` DROP `description`;
ALTER TABLE `rex_file` CHANGE `filetype` `filetype` VARCHAR(255) NULL, CHANGE `filename` `filename` VARCHAR(255) NULL, CHANGE `originalname` `originalname` VARCHAR(255) NULL, CHANGE `filesize` `filesize` VARCHAR(255) NULL, CHANGE `title` `title` VARCHAR(255) NULL, CHANGE `width` `width` INT(11) NULL, CHANGE `height` `height` INT(11) NULL;

ALTER TABLE `rex_file_category` DROP `hide`;
ALTER TABLE `rex_file_category` ADD `attributes` TEXT NULL;
ALTER TABLE `rex_file_category` ADD `revision` INT( 11 ) NOT NULL DEFAULT '0';

ALTER TABLE `rex_modultyp` DROP `bausgabe`;
ALTER TABLE `rex_modultyp` DROP `func`;
ALTER TABLE `rex_modultyp` DROP `php_enable`;
ALTER TABLE `rex_modultyp` DROP `html_enable`;
ALTER TABLE `rex_modultyp` DROP `perm_category`;
ALTER TABLE `rex_modultyp` DROP `label`;
ALTER TABLE `rex_modultyp` ADD `attributes` TEXT NULL;
ALTER TABLE `rex_modultyp` ADD `revision` INT( 11 ) NOT NULL DEFAULT '0';
RENAME TABLE `rex_modultyp` TO `rex_module`;

ALTER TABLE `rex_module_action` ADD `revision` INT( 11 ) NOT NULL DEFAULT '0';

ALTER TABLE `rex_template` DROP `bcontent`;
ALTER TABLE `rex_template` DROP `date`;
ALTER TABLE `rex_template` ADD `attributes` TEXT NULL;
ALTER TABLE `rex_template` ADD `revision` INT( 11 ) NOT NULL DEFAULT '0';
ALTER TABLE `rex_template` CHANGE `label` `label` VARCHAR(255) NULL, CHANGE `name` `name` VARCHAR(255) NULL, CHANGE `content` `content` TEXT NULL, CHANGE `active` `active` TINYINT(1) NULL;

-- Da im normalen Redaxoexport keine User-Tabelle dabei ist, ist der Bereich kommentiert
ALTER TABLE `rex_user` ADD `cookiekey` varchar(255);
ALTER TABLE `rex_user` ADD `revision` INT(11) NOT NULL DEFAULT '0';
UPDATE `rex_user` SET `status`=1;


DROP TABLE `rex_article_type`;


-- ###################################################
-- INDEXe
-- Da im normalen Redaxoexport keine User-Tabelle dabei ist, ist der entsprechende Bereich kommentiert
-- ###################################################

ALTER TABLE rex_article ADD INDEX `id` (`id`), ADD INDEX `clang` (`clang`), ADD UNIQUE INDEX `find_articles` (`id`, `clang`), ADD INDEX `re_id` (`re_id`);
ALTER TABLE rex_article_slice ADD INDEX `id` (`id`), ADD INDEX `clang` (`clang`), ADD INDEX `re_article_slice_id` (`re_article_slice_id`), ADD INDEX `article_id` (`article_id`), ADD INDEX `find_slices` (`clang`, `article_id`);
ALTER TABLE rex_file ADD INDEX `re_file_id` (`re_file_id`), ADD INDEX `category_id` (`category_id`);
ALTER TABLE rex_file_category DROP PRIMARY KEY, ADD PRIMARY KEY (`id`), ADD INDEX `re_id` (`re_id`);
ALTER TABLE rex_module DROP PRIMARY KEY, ADD PRIMARY KEY (`id`), ADD INDEX `category_id` (`category_id`);
ALTER TABLE rex_user ADD UNIQUE INDEX `login` (`login`(50));


ALTER TABLE `rex_action` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `rex_article` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `rex_article_slice` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `rex_clang` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `rex_file` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `rex_file_category` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `rex_module` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `rex_module_action` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `rex_template` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `rex_user` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;