Neues Formular erstellen und im Controller einbinden

13.02.2010 | Zend Framework

(hier: Abfrage vor Löschaktion im BugController)

1. Zend_Tool ausführen:


zf create action delete bug

erzeugt entsprechende deleteAction im BugController.php und /views/scripts/bug/delete.phtml mit Dummy-Inhalt.

2. Formular-Klasse erstellen:

application/forms/BugDeleteForm.php

Formularelemente in der Klasse definieren (hier mit ein paar Extras, s. Kommentare):


<?php
class Form_BugDeleteForm extends Zend_Form {

 public function init() {

  $this->removeDecorator('DtDdWrapper');// funktioniert nicht, muss fuer alle Formelemente doch extra gesetzt werden
  $this->setDecorators(array('FormElements','Form')); // entfernt dl-Wrapper des gesamten Formulars
  
  $this->setAttribs(array('class' => 'form')); // Klasse fuer form-tag
  $id = $this->createElement('hidden','id', array ('decorators' => array('ViewHelper'))); // entfernt 'DtDdWrapper'
  $this->addElement($id);

  $confirmed = $this->createElement('hidden','confirmed', array ('value' => 1 , 'decorators' => array('ViewHelper')));
  $this->addElement($confirmed);

  $this->addElement('submit', 'submit', array(
  'label' => 'Bugreport löschen',
   'decorators'=>array( 'ViewHelper'),// entfernt 'DtDdWrapper'
   'attribs' => array( 'class' => 'button'))); // Klasse fuer button

  $btnBack = new Zend_Form_Element_Button('btnBack'); // setzt Button-Element
  $btnBack->setLabel('abbrechen')
  ->setAttribs(array(
                       'id' => 'back',
                       'onclick' => 'javascript: history.back();',
                       'class' => 'button',
                         ))
        ->removeDecorator('DtDdWrapper'); // wichtig
        $this->addElement($btnBack);

        // Button-Elemente zu einer Gruppe zusammenfassen
         $this->addDisplayGroup(array(
                                     'submit',// hier kann die Reihenfolge noch geaendert werden
                 'btnBack',
                                     ), 'Buttons', array('legend' => 'Aktion') ); // legend wird hier nicht gezeigt -> Grund?
       
         $this->getDisplayGroup('Buttons')->setDecorators(array( 
    'FormElements', 
                array('HtmlTag', array('tag' => 'div', 'class' => 'buttons')), // setzte umschliessenden Tag fuer die Gruppe -> nuetzlich!         
                       )); 

 }
}

3. BugController-Action definieren:


 public function deleteAction()
 {
  $bugModel = new Model_Bug();
  $id = $this->_request->getParam('id');
  $bugDeleteForm = new Form_BugDeleteForm();
  $bugDeleteForm->setAction('/bug/delete/id/'.$id);
  $bugDeleteForm->setMethod('post');

  if ($this->getRequest()->isPost()) {
   if ($this->_request->getParam('confirmed')){
    $bugModel->deleteBug($id);
    return $this->_forward('list');
   }

  } else {
   $bug = $bugModel->find($id)->current();
   $bugDeleteForm->populate($bug->toArray()); 
   $this->view->id = $id; // id der view übergeben
   $this->view->form = $bugDeleteForm;
  }
 }

Besonderheit: wenn das Formular versendet wurde und eine Variabel ("confirmed") vorhanden ist, wird die Löschaktion gestartet.Diese ist eine Datenbankaktion und ist demzufolge definiert im Bug-Model. Im Formular wird nochmal ein hidden-Field für die ID des zu löschenden Datensatzes definiert. Gefüllt wird der Wert der Variablen mit der populate-Methode. Das ist hier eigentlich unnötig, da die ID schon mit der Formular-Aktion übergeben wird, wird aber zu Demo-Zwecken beibehalten.

Die ID müßte AUSSERHALB des Formulars angezeigt im View-Script um einen Text wie "Datensatz mit der ID xy wirklich löschen?" ausgeben zu können. Darum mittels $this->view->id = $id die Id als View-Variable übergeben.

4. View anpassen

Das View-Script unter views/scripts/bug/delete.phtml sieht so aus:


<h2>Bugreport l&ouml;schen</h2>
<p>Soll der Bugreport mit der ID <?php echo $this->id; ?> unwiderruflich gel&ouml;scht werden?</p>
<p><br/></p>
<?php
echo $this->form->render();
?>