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 fileIn diesem Fall war der Name des Verzeichnisses falsch.
Notizen rund um das Thema Programmierung mit dem Schwerpunkt PHP und Zend Framework 2 (ZF2)
Freitag, 25. April 2014
Zendframework2 - Uncaught exception Unable to render template
Bei der folgenden Fehlermeldung hat man meist vergessen eine Datei richtig zu benennen:
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.
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:
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.
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.
Donnerstag, 9. Januar 2014
ZF2 Session benutzen
Um auf die Session zu zu greifen benötigt man nur den Session Container: use Zend\Session\Container;
Möchte man nun auf die Session zugreifen, holt man sich in der Funktion einen neuen Container:$meine_session = new Container('mein_session_name');
Dabei gilt der Sessionname muss immer dann gleich sein wenn auf die gleichen Daten zurück gegriffen wird. Möchte man nun etwas in diesen "Container" speichern gibt man folgendes an:Genauso einfach kann man den wert wieder holen:$meine_session->mein_wert = ’Zu_speichernder_Wert’;
echo $meine_session->mein_wert; //Gibt den String "Zu_speichernder_Wert" aus
Montag, 6. Januar 2014
ZF2 zweite Datebanktabelle Ansprechen, Tablegateway Tabelle wechseln
Im Zendframework 2 kann man pro Tabellenobjekt nur eine Tabelle ansprechen.
Daher muss man entweder ein neues Gatewayobjekt oder ein SQLobjekt erzeugen. Im folgenden Beispiel habe ich ein SQL -Objekt verwendet:
Zuerst lädt man die entsprechenden Klassen:
In der Methode geht man dann wie folgt vor:
// Adapter Einstellungen holen -> die sind in der Sekelleton Application unter: Config / Autoload / local.php bzw. global.php zu finden:
use Zend\Db\ResultSet\ResultSet; tun:
//Neues result-Objekt erzeugen und initialisieren
Daher muss man entweder ein neues Gatewayobjekt oder ein SQLobjekt erzeugen. Im folgenden Beispiel habe ich ein SQL -Objekt verwendet:
Zuerst lädt man die entsprechenden Klassen:
use Zend\Db\TableGateway\TableGateway;
use Zend\Db\Sql\Sql;
use Zend\Db\Sql\Where;
In der Methode geht man dann wie folgt vor:
// Adapter Einstellungen holen -> die sind in der Sekelleton Application unter: Config / Autoload / local.php bzw. global.php zu finden:
$mysql_adapter=$this->tableGateway->getAdapter();// Falls man die Einstellungen sehen möchte:
//echo var_dump ($mysql_adapter);// Erzeugen eines neuen SQL Objektes, falls man möchte kann man hier schon die Tabelle übergeben (Achtung: Join abfragen funktionieren dann nicht):
$sql = new Sql($mysql_adapter);// Dann die Select Anweisung erstellen:
$select = $sql->select();// Auswählen der Tabelle
$select->from('tabelle');// Auswählern der WHERE Anweisung
$select->where('spalte='.$wert);// SQL-Anweisung anzeigen lassen:
echo $select->getSqlString();// SQL Anweisung ausführbar machen:
$selectString = $sql->getSqlStringForSqlObject($select);// Und ausführen:
$result = $mysql_adapter->query($selectString, $mysql_adapter::QUERY_MODE_EXECUTE);// Falls man das Ergebnis direkt auswerten möchte, kann man das mit use Zend\Db\Adapter\Driver\ResultInterface; und
use Zend\Db\ResultSet\ResultSet; tun:
//Neues result-Objekt erzeugen und initialisieren
$resultSet = new ResultSet;//Jede Zeile auswerten:
$resultSet->initialize($result);
foreach ($resultSet as $row) {
echo $row->spalte . PHP_EOL
}
Dienstag, 5. März 2013
mod-rewrite 500 Internal Serverfehler
Wenn man in der htaccess einen Fehler hat kommt es leicht zu einem Internal Serverfehler.
In meinem Fall war es ein überschüssiges Leerzeichen:
RewriteRule ^(.*)_(.*)_(.*).html$ datei.php ?v1=$1
statt:
RewriteRule ^(.*)_(.*)_(.*).html$ datei.php?v1=$1
Also immer gut aufpassen.
In meinem Fall war es ein überschüssiges Leerzeichen:
RewriteRule ^(.*)_(.*)_(.*).html$ datei.php ?v1=$1
statt:
RewriteRule ^(.*)_(.*)_(.*).html$ datei.php?v1=$1
Also immer gut aufpassen.
Freitag, 1. März 2013
Mod-Rewrite schneidet url ab
Es hatte mich einige Zeit gekostet heraus zufinden warum folgender Mod-Rewrite Befehl scheinbar nicht richtig arbeit:
RewriteRule ^(.*).html$ irgendwas.php?v1=$1
Wenn normale Zeichen gesendet wurden, funktioniert das prima aber sobald ein sonderzeichen ins spiel kam änderte sich das. Insbesondere durch das &-Zeichen.
Aus Bequemlichkeit habe ich die Begriffe alle HTML kodiert in er Datenbank gespeichert und so wandern diese dann auch in die Links wo sie urlcodiert ann so aussehen: M%26ouml%3Bbel+Lagerung
Grundsätzlich kein Problem - für PHP aber schon. Da PHP anscheinend vor dem verarbeiten der GET - Parameter diese Decodiert. Was dazu führt das in PHP eine weitere Variable angelegt wird:
Zunächst dachte ich MOD-Rewrite würde einen Fehler Produzieren aber es ist PHP!
Schaut man sich den Query String an wurde alles richtig übermittelt - aber ist decodiert(!):
_SERVER["QUERY_STRING"] v1=Möbel+Lagerung_Wolfsheim_55578
Ich nutze nun halt den Query String. Alternativ kann man auch alle &-Zeichen aus dem Link entfernen und später wieder einfügen.
Edit:
Die oben genannten infos findet man mit der funktion phpinfo() - der Fehler liegt also bei PHP nicht im mod_rewrite
RewriteRule ^(.*).html$ irgendwas.php?v1=$1
Wenn normale Zeichen gesendet wurden, funktioniert das prima aber sobald ein sonderzeichen ins spiel kam änderte sich das. Insbesondere durch das &-Zeichen.
Aus Bequemlichkeit habe ich die Begriffe alle HTML kodiert in er Datenbank gespeichert und so wandern diese dann auch in die Links wo sie urlcodiert ann so aussehen: M%26ouml%3Bbel+Lagerung
Grundsätzlich kein Problem - für PHP aber schon. Da PHP anscheinend vor dem verarbeiten der GET - Parameter diese Decodiert. Was dazu führt das in PHP eine weitere Variable angelegt wird:
| Variable | Value |
|---|---|
| _REQUEST["v1"] | M |
| _REQUEST["ouml;bel_Lagerung_Wolfsheim_55578"] | no value |
| _GET["v1"] | M |
| _GET["ouml;bel_Lagerung_Wolfsheim_55578"] | no value |
Zunächst dachte ich MOD-Rewrite würde einen Fehler Produzieren aber es ist PHP!
Schaut man sich den Query String an wurde alles richtig übermittelt - aber ist decodiert(!):
_SERVER["QUERY_STRING"] v1=Möbel+Lagerung_Wolfsheim_55578
Ich nutze nun halt den Query String. Alternativ kann man auch alle &-Zeichen aus dem Link entfernen und später wieder einfügen.
Edit:
Die oben genannten infos findet man mit der funktion phpinfo() - der Fehler liegt also bei PHP nicht im mod_rewrite
Abonnieren
Posts (Atom)