Freitag, 29. Januar 2016

ZF2 Modul.php Die Steuerzentrale eines Modules

Der Modulmanager sucht zuerst die Datei Modul.php diese muß den folgenden Kriterien entsprechen:

  1. Muß sie einen Namespace enthalten der den selben Namen trägt wie das Modul. Bsp.: Das Modul "Album" muß den Namespace "Album" verwenden.
  2. Muß sie eine Klasse mit dem Namen "Module" enthalten.
  3. Muß sie Konfiguratioenen enthalten für mindestens folgende drei Systeme:
    • view_manager
    • controllers
    • router

Ist der Namespace nicht definiert kommt es zu einem Fehler wie:

Fatal error: Uncaught exception 'Zend\ModuleManager\Exception\RuntimeException' with message 'Module (Album) could not be initialized.'

Der View_Manager ist für die Ausgabe der Anwendung zuständig.
Der Abschnitt "Controllers" ist für die Logische Abwiklung zuständig und wird oft von Diensten unterstützt (Schlüsselwort: "service_manager" )

Donnerstag, 28. Januar 2016

ZF2 application.config.php Einwohnermeldeamt der Anwendung

Die application.config.php der Skeleton Anwendung sieht ungefähr so aus:

return array(
    'modules' => array(
        'Application',
        'Album',
    ),
    'module_listener_options' => array(
        'config_glob_paths'    => array(
            'config/autoload/{,*.}{global,local}.php',
        ),
        'module_paths' => array(
            './module',
            './vendor',
        ),
    ),
);
 in dem Array "modules", müssen alle Module angemeldet werden, die in der Anwendung verwendet werden.

Der Modulmanager übernimmt den Rest und sucht dieses Modul in den Verzeichnisssen die in dem Array "modul_listener_options" unter dem zweiten Array 'module_paths' hinterlegt wurden. In diesem Fall sind das die Verzeichnisse  "/module" und "/vendor" die sich im Wurzelverzeichnis der Anwendung befinden müssen.

Dort wird nach einem Verzeichniss mit dem Namen des Modules gesucht in dem Fall des Tutorials nachdem Namen 'Album'. Dort wird nach einer Datei mit dem Namen "Module.php" gesucht.

../ (Wurzelverzeichnis der Anwendung)
/config/application.config.php
/data
/module
   /Album
       Module.php
/public
/vendor

Diese Datei muß den Namespace "Album" (sprich den Modulnamen) verwenden und eine Klasse Namens "Module". (Oder kurz ausgedrückt es wird in der Datei Module.php Nach der Qualifzierten Namen der Klasse "Album/Module" gesucht.)

Mittwoch, 27. Januar 2016

ZF2 Modul Verzeichnisse

Aufbau der Verzeichnisstruktur eines Modules 
     /module
         /Album
             /config
             /src
                 /Album
                     /Controller
                     /Form
                     /Model
             /view
                 /album
                     /album

Die Verzeichnisstruktur wurde dem aktuellen Tutorial 2.4 aus der ZF2 Dokumentation entnommen.

"/module" ist das Verzeichnis in dem sich alle Module befinden, die nicht zu dem Zend-Framework gehören, aber in der Anwendung bzw Applikation Verwendung finden sollen.

"/Album" ist das Modul das wir gerade bearbeiten / schreiben. Wobei natürlich Album immer in den aktuellen Modulnamen geändert werden muß.

"/config" ist unser Verzeichnis wo wir alle Einstellungen speichern - für den Fall das es Einstellungen gibt, die nur Lokal gelten, kann man noch ein Verzeichnis mit "/local" anlegen oder die entsprechende Datei mit "local.php" benennen. Dadurch wird es leichter beim verteilen, diese Datei weg zu lassen oder zu ändern.

"/src" ist das eigentliche Programm-Verzeichnis hier finden sich alle funktionen und strukturen, die nichts direkt mit der Ausgabe zu tun haben. Aber durchaus Werte für die Ausgabe bereitstellen können.

"/Album" ist das Verzeichnis zu dem Namespace Album. Sollten weiter Namensbereiche definiert werden, müssen auch mehrere Verzeichnisse entsprechend angelegt werden.
 
"/Controller" hier findet die eigentliche Steuerung des Modules bzw. der Funktion statt.
 
"/Form" hier ist die Steuerung von Eingabeformularen zu Hause. 
 
"/Model" hier werden die Datenstrukturen überprüft und funktionen zu Datenbankstrukturen hinterlegt, wobei Funktionen für einnen austausch von Daten auch in einem eigenen "/Mapper" Verzeichnis angelegt werden können.

"/Service" hier nicht mit aufgeführt, enthält Dienste/Funktionen zum ändern von Daten.

"/view" hier findet die eigentliche Ausgabe statt.

"/album" Name des Modules. 
 
"/album" Name des Namespace.Darunter finden sich dann die einzelnen Dateien für die Ausgabe.

Freitag, 25. April 2014

Datenbank Einstellungen ändern Zendframework2 - Skelletton Applikation

Die Einstellungen für die Datenbank sind in dem Unterverzeichnis "config" - "autoload" zu finden.

In der Datei "global.php" befindet sich eine Zeile die so oder ähnlich aussieht:
'dsn' => 'mysql:dbname=datenbank;host=localhost',
 dabei ist "datenbank" auf den Namen der verwendeten Datenbank zu ändern. In den meisten fällen dürfte die Datenbank auf dem gleichen Server liegen, wie die PHP - Dateien. Sollte das nicht der Fall sein, so muss der Wert unter Host auf den Namen des Servers geändert werden, auf dem die Datenbank liegt.

Der Vollständigkeit sei erwähnt, das in der Datei local.php Nutzername und Passwort hinterlegt sind.    

Zendframework2 - Uncaught exception Unable to render template

Bei der folgenden Fehlermeldung hat man meist vergessen eine Datei richtig zu benennen:
Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'Zend\View\Renderer\PhpRenderer::render: Unable to render template "cms/cms/index"; resolver could not resolve to a file
 In diesem Fall war der Name des Verzeichnisses falsch.

Dienstag, 21. Januar 2014

Welche ID wurde beim TableGateway automatisch eingefügt?

Wenn man mit einer Datenbank - Tabelle arbeitet die mit autoincrement arbeitet, möchte man oft wissen welche ID zu letzt eingefügt wurde.

Sofern man das TableGateway vom Zendframework2 benutzt genügt der Befehl $this->tableGateway->lastInsertValue; direkt nach dem ausführen des Datenbankbefehls.

Die Methode saveAlbum wie folgt abgeändert liefert dann immer die ID zurück:

public function saveAlbum(Album $album)
{
$data = array(
'artist' => $album->artist,
'title' => $album->title,
);
$id = (int)$album->id;
if ($id == 0) {
$this->tableGateway->insert($data);

$insertid = $this->tableGateway->lastInsertValue; //Autoincrement - wert abrufen
return $insertid; //und zurückliefern
} else {
if ($this->getAlbum($id)) {

$this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Form id does not exist');
}
}
}


Vermutlich würde es return $this->tableGateway->lastInsertValue; auch tun.

Montag, 20. Januar 2014

URL Parameter übergabe in Zendframework 2 (ZF2)

Wenn man sich das Tutorial von ZF2 ansieht stellt man fest, das dort keine Parameter mit ?newparam=xxx übergeben werden.

Doch wie funktioniert das ganze dann?

Parameter die über die URL übergeben werden, werden durch das Routensystem vom Zendframework gesendet. Das laäuft wie folgt ab:

Jedem Parameter wird eine Aktion zugewiesen wie anlegen(add), ändern (edit) und löschen (delete).
Nach der Aktion, wird der dazugehörige Parameter notiert.
Das sieht dann in der Url so aus: album/edit/1

die Aktion wird im Controller einer Action zugeordnet, dadurch ist es zum einem möglich Suchmaschinen freundliche URL's zu generieren, auf der anderen Seite aber auch mit dem übergebenen Parameter gleich eine Aktion zu verbinden die dann ausgeführt wird.

So kann man dann gleich eine ID in der Session speichern oder wie im Fall des Tutorials ein Album ändern oder löschen.

Möchte man mehr als einen Parameter übergeben, muss man die Route entsprechend ändern.

moduleconfig.php:

'router' => array(
        'routes' => array(
            'album' => array(
                'type'    => 'segment',
                'options' => array(
                    'route'    => '/album[/:action][/:id][/:newparam]', //Parameter einfügen
                    'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                        'newparam'     => '[0-9]+', //prüfung des neuen Paramters
                    ),
                    'defaults' => array(
                        'controller' => 'Album\Controller\Album',
                        'action'     => 'index',
                    ),
                ),
            ),
        ),
    ),

mit $this->params('newparam') kann man nun wieder auf diesen neu eingefügten Parmeter Zugreifen.

Auf der Seite wo der Link erstellt wird sieht das dann so aus (Bsp.: index.phtml):

echo $this->url('adresses', array('action'=>'index', 'id' => $id, 'newparam' => 'xxx' ));


Durch diese Technik und dadurch das man nur das nötigste über die Url überträgt, sollte sich die Notwendigkeit Seiten als Canonical also gleichen Inhalts definieren zu müssen reduzieren oder bestenfalls sogar ganz vermeiden lassen.