Einige Notizen zur Umsetzung einer Zend Form mit Ausgabe in einem Twig Template.
Form Klasse:
<?php namespace Application\Form; use Zend\Captcha; use Zend\Form\Element; use Zend\Form\Form; class ContactForm extends Form { public function __construct($name = null) { parent::__construct('contact'); $this->setAttribute('method', 'post'); $this->setAttribute('class', 'zf2'); $this->add(array( 'name' => 'name', 'type' => 'Zend\Form\Element\Text', 'attributes' => array( 'required' => 'required', ), 'options' => array( 'label' => 'Name', 'label_attributes' => array( 'class' => 'required', ), ), )); $this->add(array( 'name' => 'email', 'type' => 'Zend\Form\Element\Email', 'attributes' => array( 'required' => 'required', ), 'options' => array( 'label' => 'Email', 'label_attributes' => array( 'class' => 'required', ), ), )); $this->add(array( 'name' => 'comment', 'type' => 'Zend\Form\Element\Textarea', 'attributes' => array( 'required' => 'required', ), 'options' => array( 'label' => 'Kommentar', 'label_attributes' => array( 'class' => 'required', ), ), )); $this->add(array( 'name' => 'submit', 'type' => 'Submit', 'attributes' => array( 'class' => 'gradient-button', 'value' => 'Abschicken', 'id' => 'submit', ), )); $this->add(array( 'name' => 'csrf', 'type' => 'Zend\Form\Element\Csrf', 'options' => array( 'csrf_options' => array( 'timeout' => 600 ) ) )); } }
Form Validieren:
<?php namespace Application\Model\Form; use Zend\InputFilter\Factory as InputFactory; use Zend\InputFilter\InputFilter; use Zend\InputFilter\InputFilterAwareInterface; use Zend\InputFilter\InputFilterInterface; class Contact implements InputFilterAwareInterface { protected $inputFilter; public function setInputFilter(InputFilterInterface $inputFilter) { throw new \Exception("Not used"); } public function getInputFilter() { if (!$this->inputFilter) { $inputFilter = new InputFilter(); $factory = new InputFactory(); $inputFilter->add($factory->createInput([ 'name' => 'name', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array ( 'name' => 'NotEmpty', 'options' => array( 'messages' => array( 'isEmpty' => 'Bitte geben Sie Ihren Namen ein.', ) ), 'break_chain_on_failure' => true, ), ), ])); $inputFilter->add($factory->createInput([ 'name' => 'email', 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array ( 'name' => 'Regex', 'options' => array ( 'pattern' => '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/', 'message' => array ( 'regexNotMatch' => 'Bitte geben Sie eine gültige E-Mailadresse ein.', ) ), 'break_chain_on_failure' => true, ), array ( 'name' => 'EmailAddress', 'options' => array( 'messages' => array( 'emailAddressInvalidFormat' => 'Bitte geben Sie eine gültige E-Mailadresse ein.', ) ), 'break_chain_on_failure' => true, ), array ( 'name' => 'NotEmpty', 'options' => array( 'messages' => array( 'isEmpty' => 'Bitte geben Sie eine E-Mailadresse ein.', ) ), 'break_chain_on_failure' => true, ), ), ])); $inputFilter->add($factory->createInput([ 'name' => 'comment', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array ( 'name' => 'NotEmpty', 'options' => array( 'messages' => array( 'isEmpty' => 'Bitte geben Sie einen Kommentar ein.', ) ), 'break_chain_on_failure' => true, ), ), ])); $this->inputFilter = $inputFilter; } return $this->inputFilter; } }
From in Controller an View übergeben:
$formValidator = new Contact(); $form = new ContactForm(); $form->setInputFilter($formValidator->getInputFilter()); $form->setAttribute('action', $this->url()->fromRoute('kontakt')); $view->setVariables( array( 'form' => $form, ) );
Form in Controller verarbeiten:
$request = $this->getRequest(); if ($request->isPost()) { $form->setData($request->getPost()); if ($form->isValid()) { { $view->setVariables( array( 'formValid' => TRUE, 'formData' => $form->getData() ) ); // send mail $this->sendMail($form->getData()); return $view; } } }
Form in Twig Template ausgeben.
{{ form().prepare() }} {{ form().openTag(form)|raw }} {{ formRow().setInputErrorClass('error').render(form.get('name'))|raw }} {{ formRow().setInputErrorClass('error').render(form.get('email'))|raw }} {{ formRow().setInputErrorClass('error').render(form.get('comment'))|raw }} {{ formRow(form.get('submit'))|raw }} {{ formRow(form.get('csrf'))|raw }} {{ form().closeTag(form)|raw }}