在多个页面中添加了多个Symfony表单

时间:2014-09-25 16:43:37

标签: php forms symfony

我为简单的一个字段简报注册表单创建了一个新的表单类型。在我的网站上多次在不同页面上嵌入此内容的最佳方式是什么?

我可以在每个控制器中创建一个具有不同名称的新表单,以便在我的twig模板中显示,但这看起来有点混乱。理想情况下,我希望能够在页面上添加多个表单,并将它们轻松添加到模板中。

我已尝试过{% render controller('MyBundle:EmailSubscribe:subscribe') %},但这并不适用于多个插页,而且我确信无论如何都有更好的方法。有任何想法吗?

3 个答案:

答案 0 :(得分:1)

可能会使用Twig扩展名吗?这个任务是我当前项目中的下一个任务(电子商务项目,我需要在类别页面上显示多个addToCart表单),我还计划用Twig函数执行此操作,例如(我做了&# 39;尚未测试):

private $formFactory;

public function __construct(FormFactoryInterface $formFactory)
{
    $this->formFactory = $formFactory;
}

public function getFunctions() {
    return [
        new \Twig_SimpleFunction('newsletter_form', [$this, 'getNewsletterForm']),
    ];
}

public function getNewsletterForm()
{
    $formFactory = $this->formFactory;
    $form = $formFactory->create('my_form_alias', null_OR_data);

    return $form->createView();
}

并在模板中将其用作newsletter_form

答案 1 :(得分:1)

我是xurshid29的答案的粉丝

我所做的是simplay渲染控制器就像你的回答所暗示的那样。但这导致只处理一个表单,并使未处理的表单出现Cannot extra fields等错误。

解决方案:

从原始控制器传递请求。

在控制器中

function myAction(Request $request){
    $this->render('path:to:template.html.twig', array('request'=>$request));
}

在我的树枝模板中 我只是将请求传递给该控制器。

{% render(controller('path:to:controller',{request:request} %}

现在,您可以为该表单创建基本模板,并将其包含在整个站点的任何模板中。这对我来说对FOSUserBundle特别有用!

可能有某种树枝功能app.request?我一直懒得去试一试。但在这种情况下,您不必从原始控制器传递请求。


关于此主题的额外提示

我喜欢这样做允许我在任何地方插入我的表单以便快速开发,为每个表单构建一个控制器/模板,比如“加入我们的邮件列表”等。

控制器 - 此控制器的目标是处理表单并输出“成功”或显示表单。

public function emailSubscribeFormAction(Request $request){
    $email = new Email() //Presumed Entity for form
    $form = /* Create Form Here */->getForm();
    $form->handleRequest($request);
    if($form->isValid()){
        $form = "success"; //Change form into a string
    }
    $this->render('path:to:email-form.html.twig', array(
        'form'=>($form=="success") ? $form : $form->createView();, // Either pass success or the form view
        'request'=>$request

}

Twig email-form.html.twig

{% if form == "success" %}
   <h4 id="form-success">Thanks for joining!</h4>
   <script>
       window.location = "#form-success" /*Bring the user back to the success message*/
   </script>
{% else %}
   <h4>Come on, Join Our Mailing List!</h4>
   {{ form(form) }}
{% endif %}

现在您可以在任何地方渲染该控制器,而不必担心其他事情。 可以使用多种形式,但我可能已经读过像这样渲染控制器有缺点吗?

答案 2 :(得分:0)

如果我正确理解您的问题,您希望在页面中多次嵌入相同的表单,这将针对多个页面进行。因此,假设对于page_1,您希望嵌入subscribe_form N次,您显然可以创建一个表单并将此表单类型添加N次,如下所示:

$form = $this->createFormBuilder()
        ->add('subscribe1',new SubscribeType())
        ->add('subscribe2',new SubscribeType())
        ... 
        ->add('subscribeN',new SubscribeType())
        ->getForm();

所以你也可以在这样的for循环中执行此操作:

$form = $this->createFormBuilder();
for ($i = 1; $i<N+1; $i++){
    $formName = 'subscribe'.$i;
    $form->add($formName,new SubscribeType());
}
$form->getForm();

现在,您可以按照说明将此代码包含在控制器中,并在每个twig模板中将变量N作为参数传递。此外,您可以通过javascript执行此操作,尤其是如果要在表单中使用allow_add选项动态添加这些表单(SubscribeType)。有关此文档的文档位于:http://symfony.com/doc/current/cookbook/form/form_collections.html#allowing-new-tags-with-the-prototype

如果我误解了你的问题,希望有助于通知我。