< Zurück

ZF2: Zend Form in Twig Templates ausgeben ZF2: Zend Form in Twig Templates ausgeben

08.03.2015 16:22:00 • Categories: Zend Framework 2, Twig • Tags: Twig, Zend Framework 2, Forms

ZF2: Zend Form in Twig Templates ausgeben

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-&gt;setAttribute('method', 'post');
    $this-&gt;setAttribute('class', 'zf2');


    $this-&gt;add(array(
        'name' =&gt; 'name',
        'type' =&gt; 'Zend\Form\Element\Text',
        'attributes' =&gt; array(
            'required' =&gt; 'required',
        ),
        'options' =&gt; array(
            'label' =&gt; 'Name',
            'label_attributes' =&gt; array(
                'class' =&gt; 'required',
            ),
        ),
    ));

    $this-&gt;add(array(
        'name' =&gt; 'email',
        'type' =&gt; 'Zend\Form\Element\Email',
        'attributes' =&gt; array(
            'required' =&gt; 'required',
        ),
        'options' =&gt; array(
            'label' =&gt; 'Email',
            'label_attributes' =&gt; array(
                'class' =&gt; 'required',
            ),
        ),
    ));

    $this-&gt;add(array(
        'name' =&gt; 'comment',
        'type' =&gt; 'Zend\Form\Element\Textarea',
        'attributes' =&gt; array(
            'required' =&gt; 'required',
        ),
        'options' =&gt; array(
            'label' =&gt; 'Kommentar',
            'label_attributes' =&gt; array(
                'class' =&gt; 'required',
            ),
        ),
    ));

    $this-&gt;add(array(
        'name' =&gt; 'submit',
        'type' =&gt; 'Submit',
        'attributes' =&gt; array(
            'class' =&gt; 'gradient-button',
            'value' =&gt; 'Abschicken',
            'id' =&gt; 'submit',
        ),
    ));


    $this-&gt;add(array(
        'name' =&gt; 'csrf',
        'type' =&gt; 'Zend\Form\Element\Csrf',
        'options' =&gt; array(
            'csrf_options' =&gt; array(
                'timeout' =&gt; 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-&gt;inputFilter)
    {
        $inputFilter = new InputFilter();
        $factory = new InputFactory();


        $inputFilter-&gt;add($factory-&gt;createInput([
            'name' =&gt; 'name',
            'required' =&gt; true,
            'filters' =&gt; array(
                array('name' =&gt; 'StripTags'),
                array('name' =&gt; 'StringTrim'),
            ),
            'validators' =&gt; array(
                array (
                    'name' =&gt; 'NotEmpty',
                    'options' =&gt; array(
                        'messages' =&gt; array(
                            'isEmpty' =&gt; 'Bitte geben Sie Ihren Namen ein.',
                        )
                    ),
                    'break_chain_on_failure' =&gt; true,
                ),
            ),
        ]));

        $inputFilter-&gt;add($factory-&gt;createInput([
            'name' =&gt; 'email',
            'filters' =&gt; array(
                array('name' =&gt; 'StripTags'),
                array('name' =&gt; 'StringTrim'),
            ),
            'validators' =&gt; array(
                array (
                    'name' =&gt; 'Regex',
                    'options' =&gt; array (
                        'pattern' =&gt; '/^[a-zA-Z0-9.!#$%&amp;\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/',
                        'message' =&gt; array (
                            'regexNotMatch' =&gt; 'Bitte geben Sie eine gültige E-Mailadresse ein.',
                        )
                    ),
                    'break_chain_on_failure' =&gt; true,
                ),
                array (
                    'name' =&gt; 'EmailAddress',
                    'options' =&gt; array(
                        'messages' =&gt; array(
                            'emailAddressInvalidFormat' =&gt; 'Bitte geben Sie eine gültige E-Mailadresse ein.',
                        )
                    ),
                    'break_chain_on_failure' =&gt; true,
                ),
                array (
                    'name' =&gt; 'NotEmpty',
                    'options' =&gt; array(
                        'messages' =&gt; array(
                            'isEmpty' =&gt; 'Bitte geben Sie eine E-Mailadresse ein.',
                        )
                    ),
                    'break_chain_on_failure' =&gt; true,
                ),
            ),
        ]));

        $inputFilter-&gt;add($factory-&gt;createInput([
            'name' =&gt; 'comment',
            'required' =&gt; true,
            'filters' =&gt; array(
                array('name' =&gt; 'StripTags'),
                array('name' =&gt; 'StringTrim'),
            ),
            'validators' =&gt; array(
                array (
                    'name' =&gt; 'NotEmpty',
                    'options' =&gt; array(
                        'messages' =&gt; array(
                            'isEmpty' =&gt; 'Bitte geben Sie einen Kommentar ein.',
                        )
                    ),
                    'break_chain_on_failure' =&gt; true,
                ),
            ),
        ]));

        $this-&gt;inputFilter = $inputFilter;
    }

    return $this-&gt;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-&gt;setVariables(
        array(
            'form' =&gt; $form,
        )
    );</pre>

Form in Controller verarbeiten:

        $request = $this->getRequest();
    if ($request-&gt;isPost()) {

            $form-&gt;setData($request-&gt;getPost());


        if ($form-&gt;isValid()) {
            {

                $view-&gt;setVariables(
                    array(
                        'formValid' =&gt; TRUE,
                        'formData' =&gt; $form-&gt;getData()
                    )
                );

                // send mail
                $this-&gt;sendMail($form-&gt;getData());

                return $view;
            }
        }
    }</pre>

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 }}
 

< Zurück | ^ nach oben