Beim Update auf 3.2 werden nur die Core Module migriert. Das ist anders auch kaum möglich, da bei externen Erweiterungen ja die DCA bzw. database.sql mit geändert werden müsste, sonst schlägt Contao nach der Migration gleich vor diese wieder rückgängig zu machen (so war das in der RC Version noch).
Also muss man als Erweiterungsprogrammierer nun selber migrieren.
Hier mal grob an eins meiner Module skizziert wie man da ran gehen könnte.
Als erstes natürlich muss das Datenbankfeld geändert werden. Das macht man natürlich direkt in der DCA / database.sql, hier mal bei der DCA:
vorher für Single Felder:
PHP-Code:
'sql' => "varchar(255) NOT NULL default ''",
jetzt
PHP-Code:
'sql' => "binary(16) NULL",
Für multiSRC Felder bleibt es bei:
PHP-Code:
'sql' => "blob NULL",
Jetzt muss man dafür sorgen, dass nur bei einem Update, dieses Feld migriert wird und auch nur wenn es nicht bereits migriert wurde.
Ich tue das mittels der runonce.php, diese wird VOR dem DB Update aufgerufen.
Dazu prüfe ich, ob die Tabelle überhaupt existiert.
Wenn ja, hat es noch das alte Format? Wenn ja, migrieren.
In dem Beispiel sind hier 2 Tabellen mit je einem Feld betroffen, ich prüfe aber nur eines, denn wenn dann....
Für die Migration stellt Contao 3.2 nun 3 Methoden zur Verfügung:
PHP-Code:
// Ein singleSRC-Feld umwandeln
Database\Updater::convertSingleField($table, $field);
// Ein multiSRC-Feld umwandeln
Database\Updater::convertMultiField($table, $field);
// Ein orderSRC-Feld umwandeln
Database\Updater::convertOrderField($table, $field);
In meinem Beispiel (Ausschnitt) sind das beides Single Felder:
PHP-Code:
class BannerRunonceJob extends Controller
{
public function __construct()
{
parent::__construct();
$this->import('Database');
}
public function run()
{
//Check for update to C3.2
if ($this->Database->tableExists('tl_banner'))
{
$arrFields = $this->Database->listFields('tl_banner');
$blnDone = false;
//check for one table and field
foreach ($arrFields as $arrField)
{
if ($arrField['name'] == 'banner_image' && $arrField['type'] != 'varchar')
{
$blnDone = true;
}
}
// Run the version 3.2 update in two tables
if ($blnDone == false)
{
Database\Updater::convertSingleField('tl_banner', 'banner_image');
Database\Updater::convertSingleField('tl_banner_category', 'banner_default_image');
}
}
}
}
$objBannerRunonceJob = new BannerRunonceJob();
$objBannerRunonceJob->run();
Hinweis: Die convert* Methoden legen <feldname>_backup Felder an zur Migration und löschen diese nicht.
Nach der Migration wird also im Backend angezeigt, man könnte diese löschen.
Kann man machen, sollte man aber erst wenn alles funktioniert. So könnte man im Falle eine Falles per Hand die Migration wieder rückgängig machen.
Auch könnte man in der runonce prüfen ob alles OK ist und diese Felder selber löschen.
Ich hoffe es hilft jemandem, bei mir funktioniert es jedenfalls.
Lesezeichen