Zend_Form mit mehreren Submit-Buttons

Benötigt man für ein Zend Formular mehrere Ausgänge, so bieten sich folgende Lösungen an:

  • Buttons, die per Javascript Aktionen auslösen
  • mehrere Submitbuttons

Variante 2 lässt sich recht einfach umsetzen. Zunächst ein Blick in den interessanten Teil des Formulars:

$delete = new Zend_Form_Element_Submit('delete');
$delete->setLabel('Löschen');

$duplicate = new Zend_Form_Element_Submit('duplicate');
$duplicate->setLabel('Duplizieren');

$submit = new Zend_Form_Element_Submit('submit');
$submit->setLabel('Absenden')

$this->addElements(array($delete, $duplicate, $submit));

Wir haben also drei verschiedene Submitbuttons angelegt und diese dann dem Formular zugewiesen. Als nächstes schauen wir uns die Formularverarbeitung bspw. im Controller an:

$form = new MyNewForm();
if ($this->getRequest()->isPost()) {
    $formData = $this->getRequest()->getPost();

    if ($form->submit->isChecked() 
        && $form->isValid($formData)) {
        // Form valide und Submitbutton wurde gedrückt
    }

    if ($form->delete->isChecked() 
        && $form->isValid($formData)) {
        // Form valide und Delete-Button wurde gedrückt
    }

    if ($form->duplicate->isChecked() 
        && $form->isValid($formData)) {
        // Form valide und Duplicate-Button wurde gedrückt
    }
}

Wir prüfen also zunächst, ob das Formular abgeschickt wurde, danach ob das Formular valide ist und der jeweilige Button gedrückt wurde. Über die Methode isChecked() des jeweiligen Formularelements bekommen wir jetzt recht simpel heraus, ob der Button gedrückt wurde.

[via]

Zend_Db_Select mit fehlender Variable in WHERE-Clause

Nehmen wir folgenden Anwendungsfall an:

$userSelect = new Zend_Db_Select($db);
$userSelect->from('User')
           ->where('Name = ?', $name);

Im Normalfall sollte die Query wie folgt aufgelöst werden:

WHERE Name = 'MeinName'

Für den Fall, dass $name = NULL, also es nicht übergeben wird, erzeugt Zend folgendes Query, welches folglich einen SQL Fehler wirft:

WHERE NAME = ?

Um diesen Fall zu vermeiden, castet man die Variable in den Datentyp, den das Tabellenfeld hat, bspw. in einen String:

->where('Name = ?', (string) $name);

Ist nun $name = NULL, so erhalten wir dennoch eine korrekte Syntax:

WHERE Name = ''

Cheat-Sheet für Zend application.ini

Mittels der application.ini in Zend Framework Projekten kann man seine Zend-Anwendung auf recht simple Art konfigurieren. Doch nur die Wenigsten kennen alle Konfigurationsmöglichkeiten der application.ini. Aus diesem Grund hat Florian Eibeck ein, aus meiner Sicht sehr sinnvolles, Cheat-Sheet für eben diese Konfigurationsdatei bereit gestellt, welche eben alle Möglichkeiten aufzeigt. Aktuell basiert die Datei auf Zend Framework 1.11.11 und wird ständig weiter gepflegt.

Link: Zend Framework: Cheat-Sheet application.ini

Zend_Db_Select mit IN in WHERE-Clause

Möchte man über Zend_Db_Select in einer WHERE-Clause das IN benutzen, so muss man die für das IN übergebenen Werte nicht selber per implode() auseinander klamüsern. Dies kann das Zend_Db_Select für euch übernehmen. Siehe dazu nachfolgendes Beispiel:

$data = array(1,3,4);
$select->where('status_id IN(?)', $data);

Gefunden via Stackoverflow

Zend Framework – Errorhandling in Modul auslagern

Bei größeren Projekten kommt man evtl. auf die Idee das Errorhandling der Webapplikation in ein eigenes Modul auszulagern. Mit Hilfe des Zend Frameworks sind dazu drei Schritte notwendig:

  • Error-Modul anlegen
  • Error-Plugin zum Setzen des Standard-Error-Moduls
  • application.ini und Bootstrap.php der Anwendung konfigurieren

Weiterlesen →

Zend Tutorial – Modulabhängiger Wechsel des Layouts

Das Wechseln des Design in Abhängigkeit von eurem Modul kann im Zend Framework über ein Plugin realisiert werden. Legt dazu im Ordner application/Plugin/Layout die Datei Changer.php an und füge folgenden Inhalt in die Datei:

class Plugin_Layout_Changer extends Zend_Controller_Plugin_Abstract
{
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        //Prüft ob eine Layoutdatei in Abhängigkeit vom Modulnamen existiert
        if(is_file(Zend_Layout::getMvcInstance()->getLayoutPath()
        .$request->getModuleName().'.phtml'))
        {
            //wenn ja, dann diese setzen
            Zend_Layout::getMvcInstance()->setLayout($request->getModuleName());
        }
        else
        {
            //wenn nicht, dann Standardlayout setzen, hier: bibo
            Zend_Layout::getMvcInstance()->setLayout('bibo');
        }
    }
} 

Jetzt müsst ihr noch in eurer Bootstrap-Datei eurer Anwendung das Plugin initialisieren. Fügt dazu einfach folgende Methode eurer Bootstrap-Klasse hinzu:

protected function _initLayoutChanger()
{
	$this->bootstrap('frontController');
	$this->getResource('frontController')
		 ->registerPlugin(new Plugin_Layout_Changer());
}

Überprüft, ob folgende Einträge in eurer application.ini vorhanden sind:

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
autoloadernamespaces.0 = "Plugin_"

Nun ändert sich automatisch das Layout, in Abhängigkeit von eurem Modulnamen. Achtet darauf, dass die entsprechende Layoutdatei im Ordner application/layouts/scripts/ genauso benannt ist, wie euer Ordnername des Moduls. Bei mir existieren beispielsweise im Ordner application/modules/ die Module „bibo“ und „login“. Demzufolge heißen meine Layoutscripte im Ordner application/layouts/scripts auch „bibo.phtml“ und „login.phtml“. Existiert keine entsprechende Layoutdatei, wird das in der Changer.php im else Zweig angegebene Layout geladen (in meinem Fall das Layoutscript bibo.phtml).

Zend Tutorial – 05 – View Helper

Um Layout- & Viewscripte zu entschlacken und von Programmcode zu befreien (MVC-Prinzip), gibt es in Zend die Möglichkeit View-Helper einzusetzen. View Helper können auch dazu verwendet werden, um wiederkehrenden Code in seperaten Dateien abzulegen und somit doppelten Code zu vermeiden.

Ich erkläre das Prinzip beispielhaft für das Einbinden eines Copyrights incl. Jahreszahl (bspw.: © 2005 – 2011).
Weiterlesen →