Ich bin Anfänger mit CakePHP und habe angefangen, eine erste Anwendung damit umzusetzen, die leicht auf anderen Servern neu aufsetzbar sein soll. Deshalb habe ich einen Installer geschrieben, der folgendes macht:
- Benötigte DB-Tabellen erstellen
- ACO-Datensätze für die Benutzerrechteverwaltung mit ACL anlegen
- ACL initialisieren (Datensätze für die Berechtigungen jedes normalen Users anlegen)
- Einen Administrator anlegen (Benutzerdaten werden im Installer übergeben)
So sieht das dann aus:
- Code: Alles auswählen
- function process() { // führt die Installation durch
if(!$this->db->isConnected()) {
exit('Verbindung zur Datenbank konnte nicht hergestellt werden. Bitte prüfen Sie die Konfiguration in app/config/database.php.');
} else {
echo 'Verbindung zur Datenbank wurde hergestellt'."<br />\n";
if (empty($this->data)) {
echo 'Es wurden keine Daten &uuml;bermittelt'."<br />\n";
} else {
try
{
// Vorhandene Tabellen löschen
if (count($this->db_structure) > 0) {
if ($this->dropTables(array_keys($this->db_structure))) {
echo 'Datenbank wurde geleert.'."<br />\n";
}
}
// Benötigte Tabellen hinzufügen
foreach ($this->db_standard as $name => $columns) {
if ($this->generateTable($name,$columns)) {
echo 'Tabelle '.$name.' wurde angelegt.'."<br />\n";
}
}
// ACL-Tabellen füllen
$this->build_acl();
// Datenbank für ACL initialisieren
$this->initDB();
// Ersten User anlegen
$this->data['User']['group_id'] = 2;
$this->data['User']['activation'] = null;
$this->User->create();
$this->User->data = Sanitize::clean($this->data);
if ($this->User->save($this->User->data)) {
echo 'Der Administrator wurde registriert.'."<br />\n";
} else {
throw new install_exception('Der User konnte nicht angelegt werden.');
}
$this->redirect('/install/finish');
}
catch (install_exception $exception)
{
die('Installation fehlgeschlagen:'."<br/>\n<div>".$exception->getMessage()."</div><br />\n");
}
}
}
}
Die Funktionen "build_acl" und "initDB" entstammen diesem Tutorial und haben beim Aufrufen "von Hand" (im Browser, mit bereits vorhandener DB-Struktur und eingeloggt) ohne Probleme funktioniert.
Leider komme ich trotzdem vor allem mit der ACL in Konflikt. Wenn die Anwendung auf einem neuen Server mit leerer Datenbank installiert wird, sorgen diese zwei Zeilen im App_Controller schon mal für Probleme:
- Code: Alles auswählen
Ich brauche die ACL-Komponenten sowie das User-Model in so gut wie jedem Controller und auch im App_Controller selbst, deswegen würde ich das gerne da drin lassen, allerdings bekomme ich Fehlermeldungen, wenn die entsprechenden Tabellen zu den Komponenten und Models nicht vorhanden sind. Wie löse ich das am besten - Unterbinden der Fehlermeldungen, oder wirklich zusehen, dass die Komponenten und Models nur da eingebunden werden, wo die Datenbank-Tabellen auch wirklich schon vorhanden sind?
Zweites Problem: Auch, wenn ich die Tabellen schon erzeuge und dann den Installer mit importierten Komponenten und Models laufen lasse, treten mehrere Fehler auf:
Einmal von der ACL:
Warning (512): DbAcl::allow() - Invalid node [CORE/cake/libs/controller/components/acl.php, line 325]
Irgendetwas muss da falsch übergeben worden sein, aber ich verstehe nicht was, denn die ACL braucht doch eigentlich nicht mehr als die Datenbank-Tabellen und die gibt es ja! Ich habe es auch schon damit versucht, die ACL-Settings, die ich sonst im App_Controller vornehme, in den Installer zu packen, hilft auch nicht.
Zweiter Fehler:
Fatal error: Call to undefined method stdClass::create() in /var/www/vhosts/makersweb.de/subdomains/dev/httpdocs/projektseite/app/controllers/install_controller.php on line 878
Das passiert beim Anlegen des Users. Wieso kann ich nicht mit "create" einen neuen User erzeugen, obwohl das User-Model doch importiert wird? Oder hat es mit etwas völlig anderem zu tun? Wie gesagt, ich bin noch Anfänger und lebe von guten Tutorials und Google. =)
Ich hab auch schon das Internet nach Lösungen durchforstet, allerdings sind die Probleme wohl einfach zu speziell, um da schnell fündig zu werden. Wäre sehr dankbar, wenn mir jemand helfen könnte!