/installer/installer_votings.php
Der Installer ist wohl die zentralste Datei des Moduls. Er definiert nicht nur Abhängigkeiten und Versionsnummern, sondern legt auch die benötigten Tabellen in der Datenbank an und registriert das Modul sowie das Seitenelement. Deshalb soll dieser auch vollständig betrachtet werden.
Siehe hierzu auch
- http://apidocs.kajona.de/v3.3.0/modul_system/interface_installer.html
- http://apidocs.kajona.de/v3.3.0/modul_system/class_installer_base.html).
class class_installer_votings extends class_installer_base implements interface_installer {
public function __construct() {
$arrModule = array();
$arrModule["version"] = "0.1";
$arrModule["name"] = "votings";
$arrModule["name_lang"] = "Module Votings";
$arrModule["moduleId"] = _votings_modul_id_;
parent::__construct($arrModule);
}
Der Kontruktor des Modul-Installers definiert Werte und Metadaten, die der Installer während des Installationsvorgangs abfragt. Von daher sollten diese wie oben gepflegt sein.
Wie ersichtlich wird, ist die Versionsnummer eines Moduls unabhängig von der Versionsnummer des Kajona-Systems.
public function getNeededModules() {
return array("system", "pages");
}
Abhängigkeiten werden dem Installer mit der Methode getNeededModules() bekanntgegeben. Der Installer prüft, ob die gelisteten Module installiert sind, erst dann wird das aktuelle Modul zur Installation angeboten.
public function getMinSystemVersion() {
return "3.3.0";
}
Setzt das Modul gewissen Funktionen von Kajona voraus, so kann die minimal benötigte Version hier angegeben werden. Geprüft wird hier immer gegen die installierte Version des Moduls „system“. Nur wenn dieses in der gleichen oder in einer höheren Versionsnummer vorliegt kann das aktuelle Modul installiert werden.
public function hasPostInstalls() {
$strQuery = "SELECT COUNT(*) FROM "._dbprefix_."element WHERE element_name='votings'";
$arrRow = $this->objDB->getRow($strQuery);
if($arrRow["COUNT(*)"] == 0)
return true;
return false;
}
Über die Methode hasPostInstalls teilt das Modul dem Installer mit, ob es noch nachgelagerte Installationen wie Elemente bereitstellt. Hier wird überprüft, ob das Seitenelement „votings“ bereits installiert wurde.
Die eigentliche Installation des Moduls erfolgt in der Methode install(). Diese wird im Installer an der Stelle der Modul-Installationen aufgerufen.
public function install() {
$strReturn = "";
//votings
$strReturn .= "Installing table votings_voting...\n";
$arrFields = array();
$arrFields["votings_voting_id"] = array("char20", false);
$arrFields["votings_voting_title"] = array("char254", true);
if(!$this->objDB->createTable("votings_voting", $arrFields, array("votings_voting_id")))
$strReturn .= "An error occured! ...\n";
$strReturn .= "Installing table votings_answer...\n";
$arrFields = array();
$arrFields["votings_answer_id"] = array("char20", false);
$arrFields["votings_answer_text"] = array("text", true);
$arrFields["votings_answer_hits"] = array("int", true);
if(!$this->objDB->createTable("votings_answer", $arrFields, array("votings_answer_id")))
$strReturn .= "An error occured! ...\n";
Die vorangegangen Blöcke legen die beiden Tabellen „votings_voting“ sowie „votings_answer“ an. Die Definition der Tabellen erfolgt hierbei komplett ohne SQL, dieses wird passend zur verwendeten Zieldatenbank vom Framework selbst generiert (siehe hierzu auch http://apidocs.kajona.de/v3.3.0/modul_system/class_db.html#createTable). Lediglich die Paramter der einzelnen Spalten werden definiert.
//register the module
$strSystemID = $this->registerModule("votings", _votings_modul_id_, "class_modul_votings_portal.php", "class_modul_votings_admin.php", $this->arrModule["version"], true);
Nachdem die Tabellen angelegt wurden, kann das Modul als solches dem System bekannt gemacht werden. Durch den Aufruf von registerModule() werden die benötigten Einträge in der Datenbank automatisch vorgenommen, ebenso wie die Integration in das Rechtesystem (siehe hierzu auch http://apidocs.kajona.de/v3.3.0/modul_system/class_installer_base.html#registerModule). Es werden also die zum Modul zugehörigen Dateinamen der Admin- und Portal-Klassen gesetzt, die zuvor definierte Modul-ID sowie der Modul-Name und Modul-Version. Der letzte Boolean-Parameter entscheidet, ob das Modul in der Backend-Navigation erscheint oder versteckt wird.
//modify default rights to allow guests to vote
$strReturn .= "Modifying modules' rights node...\n";
$this->objRights->addGroupToRight(_guests_group_id_, $strSystemID, "right1");
return $strReturn;
}
Ein Spezialfall stellt die Rechtekonfiguration des Voting-Moduls dar. Wie in den Anforderungen genannt soll es Gästen per default ermöglicht werden, an Votings teilzunehmen. Für das Recht „Voting“ verwendet das Modul das erste frei zur Verfügung stehende Recht, hier „right1“. Durch den obigen Aufruf von addGroupToRight() wird der Rechte-Knoten des Moduls so verändert, dass Gäste das Recht „right1“ zugewiesen haben. Alle später angelegten Votings erben automatisch vom Modulknoten, so dass das Recht hier ebenfalls vererbt wird und nicht gesondert gesetzt werden muss.
public function postInstall() {
$strReturn = "";
//Register the element
$strReturn .= "Registering votings-element...\n";
//check, if not already existing
$objElement = null;
try {
$objElement = class_modul_pages_element::getElement("votings");
}
catch (class_exception $objEx) {
}
if($objElement == null) {
$objElement = new class_modul_pages_element();
$objElement->setStrName("votings");
$objElement->setStrClassAdmin("class_element_votings.php");
$objElement->setStrClassPortal("class_element_votings.php");
$objElement->setIntCachetime(-1);
$objElement->setIntRepeat(1);
$objElement->setStrVersion($this->getVersion());
$objElement->updateObjectToDb();
$strReturn .= "Element registered...\n";
}
else {
$strReturn .= "Element already installed!...\n";
}
return $strReturn;
}
Je nach dem welchen Wert die Methode hasPostInstalls() zurückliefert, kann der Anwender im Installer-Schritt „Seitenelemente“ weitere, nachgelagerte Installationen durchführen. In der Regel ist das die Installation der zugehörigen Seitenlemente, so auch hier in der Methode postInstall().
public function update() {
$strReturn = "";
//check installed version and to which version we can update
$arrModul = $this->getModuleData($this->arrModule["name"], false);
$strReturn .= "Version found:\n\t Module: ".$arrModul["module_name"].", Version: ".$arrModul["module_version"]."\n\n";
return $strReturn."\n\n";
}
}
Die update() Methode führt, wie der Name schon sagt, Updates eines installierten Moduls durch. Da das Modul Votings hier initial angelegt wird, gibt es natürlich noch keine Updates.
Ein Update des Moduls wird vom Installer dann angeboten, wenn die im Konstruktor genannte Versionsnummer höher als die in der Datenbank bekannte Versionsnummer ausfällt.



