Как повторно отобразить форму с предыдущими значениями при сбое проверки?

У меня есть форма, которая должна пройти некоторые другие проверки, кроме необычных (около 4 полей зависят друг от друга). Дело в том, что когда это не удается, я перенаправляю пользователя обратно, но тогда форма теряет свои значения, я этого не хочу. Я знаю, что это можно сделать с помощью сеанса, но может быть и более «здоровый» способ. Код обычный:

public function printAction()
{
    if ($this->getRequest()->getMethod() == "POST")
    {
        $form->bindRequest($this->getRequest());
        if ($form->isValid())
        {
             .... more validation.... Failed!
             return $this->redirect($this->generateUrl("SiteHomePeltexStockStockHistory_print"));
             // and this is when I lose the values.... I dont want it
        }
    }
}

person John Smitth    schedule 08.04.2013    source источник


Ответы (3)


Вы можете использовать одно и то же действие для запросов GET и POST, связанных с формой. Если проверка не удалась, просто не перенаправляйте, и та же форма будет отображаться повторно с введенными значениями и сообщениями об ошибках проверки:

/**
 * @Template
 */
public function addAction(Request $request)
{
    $form = /* ... */;        

    if ($request->isMethod('POST')) {
        $form->bind($request);

        if ($form->isValid()) {
            // do something and redirect
        }

        // the form is not valid, so do nothing and the form will be redisplayed
    }

    return [
        'form' => $form->createView(),
    ];
}
person Elnur Abdurrakhimov    schedule 08.04.2013
comment
не по теме, можете ли вы отредактировать свой ответ здесь stackoverflow.com/questions/10025278/, я случайно проголосовал за него и хотел бы изменить это голосование, спасибо. - person Alexandrin Rus; 30.08.2013

Вы можете передать свои параметры на новую страницу при создании нового перенаправления:

$this->redirect($this->generateUrl('SiteHomePeltexStockStockHistory_print', array('name1' => 'input1', 'name2' => 'input2', 'name3' => $input3, ....)));

или напрямую передать массив значений сообщения:

$this->redirect($this->generateUrl('SiteHomePeltexStockStockHistory_print', array('values' => $values_array)));
person Ali Jabbar    schedule 08.04.2013

Вы можете сделать что-то вроде этого

class FooController extends Controller
{
    /**
     * @Route("/new")
     * @Method({"GET"})
     */
    public function newAction()
    {
        // This view would send the form content to /create
        return $this->render('YourBundle:form:create.html.twig', array('form' => $form));
    }

    /**
     * @Route("/create")
     * @Method({"POST"})
     */
    public function createAction(Request $request)
    {
        // ... Code
        if ($form->isValid()) {
            if (/* Still valid */) {
                // Whatever you do when validation passed
            }
        }

        // Validation failed, just pass the form
        return $this->render('YourBundle:form:create.html.twig', array('form' => $form));
    }
}
person Touki    schedule 08.04.2013