2011-08-09 5 views
4

여러 페이지에 사용되는 양식을 처리하는 방법?

여러 페이지에서 사용해야하는 양식이 있습니다.

$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 가지 문제가있었습니다.
    • 동일한 페이지로 올바르게 리디렉션하는 방법을 파악할 수 없었습니다.
    • 모든 작업에서 부모로부터 메소드를 호출해야했지만 실제로는 문제가되지 않았습니다.
    • 렌더링 컨트롤러 (나뭇 가지에서 embedded controllers 사용). 그러나, 나는 how to redirect properly을 추측 할 수 없었다.

    그런데 이러한 양식에 대한 일반적인 접근 방식은 무엇입니까?

    편집 :

    스크립트없는 솔루션을 찾고 있습니다.

+0

이 블로그 게시물은 유사한 문제를 다룰 때 도움이됩니다. https://phpcoderblog.wordpress.com/2014/06/26/symfony2-using-same-form-for-all-pages-symfony2-put- symfony2-use-all-pages-symfony2-same-form-on-every-page-symfony2-how-to-use-contact-form-on-each-page-symfony2-how-to-use- contact-form-on-al/ – Sam

답변

2

내가 필요로하는 모든 페이지에서 임베디드 컨트롤러를 사용하고, 다른 URL에 게시하고 리퍼러로 쿠키를 저장하는 일이 발생했습니다. 그런 다음 폼 유효성 검사, 결과가 포함 된 쿠키 저장, 리퍼러로 리디렉션 및 결과 렌더링 (오류, 감사 메시지 ...). 이것은 장애가있는 자바 스크립트에 대해 생각해야하는 시나리오를 다룰 때 가장 좋은 옵션 인 것 같습니다.사용자가 AJAX를 사용하여 게시하는 경우 간단한 조건을 사용하여 중복 쿠키/플래시 세션 생성을 쉽게 비활성화 할 수 있습니다.

+0

나는 그 옛것을 알고 있지만,이 문제는 나를 당황하게했다. 좋은 것. – Flosculus

1

"당신이 양식에 재사용되고 권장되는 독립 클래스에서 양식을 작성하는 방법을 배울 수 있습니다"하는 Creating Form ClassesDocs 절 참조뿐만 아니라 시나리오를 해결합니다 (같은 책을.) .

+1

네, 수업은 하나의 논리이고, 처리 논리는 다른 것입니다. 각 액션 메소드에 꽤 많은 로직을 써야합니다. 나는 모든 로직 (렌더링, 유효성 검사 및 기타 모든 것들을 포함하여)을 분리 된 방법으로 "분리하여"필 요한 곳에 템플릿에 포함시키는 임베디드 컨트롤러와 더 비슷한 것을 기대하고있었습니다. –

1

아약스 게시물을 통해 데이터를 제출해야합니다.

컨트롤러에서 다음을 수행하십시오. p 그런 다음 레이아웃을 확장하지 않고 나뭇 가지 템플릿에서 양식을 렌더링하십시오. (현재처럼)

다음보기에서 결과를 바꿉니다. $ ('# formDiv') .html (htmlReceivedBack);

전체 html div를 새로운 렌더링 된 html로 다시 바꾸는 것이 가장 쉽다는 것을 알았습니다. 대부분의 경우 성공 메시지 또는 일부 양식 오류가 표시됩니다.

이 방법을 사용하면 메시지/피드백 만 보내기 위해 페이지를 변경할 필요가 없습니다.

+0

그리고 자바 스크립트가 비활성화 된 사용자는 어떻게해야합니까? –

+2

당신은 여전히 ​​그 grannies의 그 1 %에 대한 점진적 향상과 함께 할 수 있습니다. js를 통해서만 액션을 연결하고 url은 제거하지 않습니다. 그런 다음 xmlhttprequest가 아닌 경우에만 레이아웃을 활성화해야합니다. 그래서 양식은 페이지에 있습니다 (말하자면). 그러나 진지하게 ... 1 %입니다 - 당신은 그런 고객을 원하지 않습니다 ... 그들은 문제입니다 ... – Tjorriemorrie

+5

소원 나는 의견을 말할 수 있습니다. 나는 당신의 고객에 대해 모른다. 그러나 나는 내 생각에 그들이 문제라고 생각했기 때문에 내 매출의 1 %를 잃지 않을 것이다. – Simon

관련 문제