Contao Tipps
Datei /system/runonce.php
Die Datei runonce.php tut genau das, was der Name schon vermuten läßt, sie wird nur einmal ausgeführt. Erreicht wird dies dadurch, das die Datei nach der Ausführung gelöscht wird. Die runonce.php wird man daher kaum finden, genutzt wird diese vom Live Update sowie von Modulen die nach der Installation noch einiges initialisieren/updaten/migrieren wollen.
Von Contao 2.9 zu 2.10 gab es eine Änderung diesbezüglich was Ort und Zeitpunkt des Aufrufes betrifft. Es ist möglich, für beide Arten gleichzeitg kompatibel zu sein und wird deshalb hier auch mit beschrieben.
Code-Beispiele sind im Wiki zu finden: runonce Code-Beispiele
Verwendung ab Contao 2.10
Ab Contao 2.10 ist die runonce Nutzung modulbasiert. Das heißt, jedes Modul bringt seine eigene runonce.php in der Verzeichnistruktur des Moduls mit. Nicht mehr wie in 2.9 im System Verzeichis.
Ablageort
Die runonce.php muss im config Verzeichnis des Moduls liegen. Beispiel:
/system/modules/banner/config/runonce.php
Der Ablageort /system/runonce.php funktioniert zwar auch noch, sollte aber nicht mehr verwendet werden, da es zu gegenseitigem Überschreiben kommen kann. (siehe dazu Problemfall in 2.9 [Wiki])
Aufruf durch Contao
Contao ruft die runonce.php Dateien aller aktiven Module auf (sofern vorhanden) direkt vor einem Datenbank Update bzw. dem Test ob dieser notwendig ist. Das passiert somit bei zwei Ereignissen:
- Installation oder Update oder Deinstallation einer Erweiterung über den Erweiterungskatalog bzw. die Erweiterungsverwaltung.
- Liveupdate von Contao
Installiert man eine Erweiterung manuell oder macht ein manuelles Update von Contao, muss wie üblich die install.php aufgerufen werden, bzw. im Backend über Erweiterungsverwaltung - Datenbank aktualisieren, um den Vorgang auszulösen.
Verwendung in Contao 2.9 und älter
In Contao 2.9 und älter gibt es für alle Module und das Liveupdate einen gemeinsamen Ort im Verzeichnis /system für das Ablegen der runonce.php. Dies führte in der Vergangenheit zu Problemen durch gegenseitiges Überschreiben der runonce.php. Eine Lösung, wenn sich alle Entwickler dran halten, folgt im nächsten Abschnitt.
Spezialfall: runonce.php für 2.9 und 2.10
Wenn ein Modul definiert ist für 2.9 und 2.10 zu funktionieren und bringt es eine runonce.php mit, muss diese beide Aufruforte (System und Modul Verzeichnis) unterstützen. Hier ist von der Idee, diese einfach an beiden Orten abzulegen und somit zweimal mitzubringen, dringend abzuraten. Grund ist der Problemfall wie bei Contao 2.9 schon beschrieben. Eine Lösung folgt im nachfolgendem Code-Beispiel.
Dabei wird eine Universal-Runonce im /system Verzeichnis abgelegt, welche dann die runonce.php in den config Verzeichnissen der aktiven Module sucht und aufruft. Im Prinzip wird hier die Contao 2.10 Variante nachgeahmt.
UniversalRunonce
class UniversalRunonce extends Controller
{
/**
* Initialize the object
*/
public function __construct()
{
parent::__construct();
// Fix potential Exception on line 0 because of __destruct method
// (see https://github.com/contao/core/issues/2236)
$this->import((TL_MODE=='BE' ? 'BackendUser' : 'FrontendUser'), 'User');
$this->import('Database');
}
/**
* Execute all runonce files in module config directories
*/
public function run()
{
$this->import('Files');
$arrModules = scan(TL_ROOT . '/system/modules/');
foreach ($arrModules as $strModule)
{
if ((@include(TL_ROOT . '/system/modules/' . $strModule . '/config/runonce.php')) !== false)
{
$this->Files->delete('system/modules/' . $strModule . '/config/runonce.php');
}
}
}
}
/**
* Instantiate controller
*/
if (version_compare(VERSION, '2.10', '<'))
{
$objUniversalRunonce = new UniversalRunonce();
$objUniversalRunonce->run();
}
Wenn nun jeder Modulentwickler dieses Universal-Runonce Prinzip für Contao 2.9 verwenden würde, wäre das Problem des Überschreibens dort beseitigt. Logisch, oder? Also, los!