Как работать с формами, которые используются на нескольких страницах? - PullRequest
4 голосов
/ 09 августа 2011

У меня есть форма, которую нужно использовать на нескольких страницах:

Контроллер

$emailForm = $this->get('form.factory')->createNamedBuilder('form', 'email_form')
    ->add('email', 'email')
    ->add('subject', 'text')
    ->add('body', 'textarea')
    ->getForm();

$request = $this->get('request');

if ($request->getMethod() == 'POST' && $request->request->has('email_form') ) {
    $emailForm->bindRequest($request);

    if ($emailForm->isValid()) {

        // do stuff ...

        $this->get('session')->setFlash('email_sent', "Woey, mail sent successfully!");

        // Redirect on the same url to prevent double posts
        return $this->redirect($this->generateUrl($this->getRequest()->attributes->get('_route')));
    }
}

return $this->render('Bundle:Form:index.html.twig', array('email_form' => $emailForm->createView()));

Шаблон

{% if app.session.getFlash('email_sent') %}
    <p>{{ app.session.getFlash('email_sent') }}</p>
{% endif %}

<form action="{{ path(app.request.attributes.get('_route')) }}" method="post" {{ form_enctype(email_form) }}>
    {{ form_widget(email_form) }}

    <p><input type="submit" class="submit" value="Send" /></p>
</form>

Это действительно просто стандартная форма Symfony2, почти как в учебнике.

Я не могу понять, как мне эффективно использовать ее на нескольких страницах (в нескольких действиях контроллера), не повторяя себя (слишком много).До сих пор я пытался:

  • поместить логику в базовый контроллер, который является родительским для каждого контроллера, где я хочу иметь эту форму.С этим подходом было 2 проблемы:
    • Я не мог понять, как правильно перенаправить на ту же страницу
    • Мне приходилось вызывать метод из родительского элемента в каждом действии, что на самом деле непроблема, но я думаю, что должен быть какой-то более элегантный способ
  • рендеринга контроллера с использованием встроенных контроллеров в ветке.Однако я не могу понять, , как правильно перенаправить .

Итак, каков общий подход к таким формам?

Редактировать:

Я ищу решение без сценария.

Ответы [ 3 ]

2 голосов
/ 29 января 2012

Я закончил тем, что использовал встроенный контроллер на каждой странице, которая мне была нужна, отправляя по разным URL и сохраняя cookie с реферером. Затем я проверяю форму, сохраняю cookie с результатами, перенаправляю обратно к рефереру и выдаю результаты (ошибки, сообщение спасибо ...). Это, кажется, лучший вариант, когда вы имеете дело со сценариями, в которых вы должны думать об отключенном Javascript. Вы можете легко отключить создание избыточных сеансов cookie / flash, используя простые условия для случаев, когда пользователь публикует сообщения с использованием AJAX.

1 голос
/ 10 августа 2011

Вы должны отправить данные через сообщение ajax.

В контроллере делай свое дело: p Затем визуализируйте форму в шаблоне ветки, не расширяя макеты. (как это было бы в настоящее время)

Тогда в любом представлении вы просто заменяете результат: $ ('# formDiv'). Html (htmlReceivedBack);

Я считаю, что проще всего просто снова заменить весь html div новым рендерингом html; Скорее всего, вы увидите сообщение об успехе или некоторые ошибки формы.

Таким образом, пользователю не нужно менять страницы, просто чтобы отправить сообщение / отзыв.

1 голос
/ 09 августа 2011

Учебник по Symfony2 Forms также обращается к вашему сценарию, см. Создание классов форм Документы Раздел, в котором "вы узнаете, как Создайте свою форму в отдельном классе, что рекомендуется, поскольку ваша форма становится многократно используемой " (Там же).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...