Модификация поведения форм Symfony 2 - PullRequest
0 голосов
/ 20 января 2012

Я использую Symfony 2.

Работа моих форм работает следующим образом:

  • Формы отправляются в Ajax (JQuery)

  • Если в моей форме есть ошибки, я получаю XML-ответ со всеми сообщениями об ошибках


    <errors>
    <error id="name">This field cannot be blank</error>
    <error id="email">This email address is not valid</error>
    <error id="birthday">Birthday cannot be in the future</error>
    </errors>

  • Если в моем сообщении нет ошибкиформа, я получаю ответ XML с URL перенаправления

    <redirect url="/confirm"></redirect>

  • У меня вопрос : как я могу «навсегда» изменить поведение форм в Symfony 2 такчто я мог бы использовать контроллер, как показано ниже:

    public function registerAction(Request $request)
    {
    $member = new Member();

    $form = $this->createFormBuilder($member)
    ->add('name', 'text')
    ->add('email', 'email')
    ->add('birthday', 'date')
    ->getForm();

    if($request->getMethod() == 'POST') {
    $form->bindRequest($request);

    if($form->isValid()) {
    // returns XML response with redirect URL
    }
    else {
    // returns XML response with error messages
    }
    }

    // returns HTML form
    }

Спасибо за вашу помощь,

С уважением,

Ответы [ 2 ]

1 голос
/ 11 марта 2012

Обработчик формы - это то, как я это делаю. Проверьте форму в formHandler и создайте свой ответ json или xml в контроллере в зависимости от ответа от formHandler.

<?php
namespace Application\CrmBundle\Form\Handler;

use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\Request;
use Application\CrmBundle\Entity\Note;
use Application\CrmBundle\Entity\NoteManager;

class NoteFormHandler
{
    protected $form;
    protected $request;
    protected $noteManager;

    public function __construct(Form $form, Request $request, NoteManager $noteManager)
    {
        $this->form = $form;
        $this->request = $request;  
        $this->noteManager = $noteManager;
    }

    public function process(Note $note = null)
    {
        if (null === $note) {
            $note = $this->noteManager->create();
        }

        $this->form->setData($note);

        if ('POST' == $this->request->getMethod()) {
            $this->form->bindRequest($this->request);

            if ($this->form->isValid()) {
                $this->onSuccess($note);

                return true;
            } else { 
                $response = array();
                foreach ($this->form->getChildren() as $field) {
                    $errors = $field->getErrors();
                    if ($errors) {
                        $response[$field->getName()] = strtr($errors[0]->getMessageTemplate(), $errors[0]->getMessageParameters());
                    }
                }

                return $response;
            }
        }

        return false;
    }

    protected function onSuccess(Note $note)
    {
        $this->noteManager->update($note);
    }
}

Это возвращает только 1 сообщение об ошибке на поле, но это помогает мне.

0 голосов
/ 21 января 2012

Рассмотрите возможность инкапсуляции этой логики в службу «обработчик форм», аналогично тому, что сделано в FOSUserBundle:

https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Form/Handler/RegistrationFormHandler.php

...