Symfony2 Twig扩展:创建表单

时间:2013-12-18 15:09:46

标签: forms symfony twig

我希望有一个联系表单块,我可以在不同的页面和模板上重复使用。所以我决定写一个Twig扩展。问题是我无法访问createFormBuilder()函数。第二个问题是我无法访问请求对象进行验证。我目前的代码如下:

<?php

namespace Name\NameBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class ContactExtension extends \Twig_Extension
{
    function getName() {
        return 'contact_extension';
    }

    function getFunctions() {
        return array(
           'contactform' => new \Twig_Function_Method($this, 'contactform'),
        );
    }

    function contactform() {
        $form = $this->createFormBuilder()
           ->add('Name', 'text')
           ->add('Message', 'textarea')
           ->add('Send', 'submit')
           ->getForm();

        return $this->render('NameBundle:forms:contactform.html.twig', array(
            'form' => $form->createView(),
    }
}

但我收到错误&#34;调用未定义的方法createFormBuilder()&#34; ...

如果我将功能更改为function contactform(Request $request) { ... }

,我也会收到错误

我需要添加什么才能将此功能用作对象?或者枝条延伸可能是完全错误的方法?

2 个答案:

答案 0 :(得分:8)

createFormBuilder()是一个Controller帮助程序,允许您通过容器访问控制器中的form.factory服务(下面的代码)

namespace Symfony\Bundle\FrameworkBundle\Controller;
// ...
class Controller extends ContainerAware
{
    // ...
    public function createFormBuilder($data = null, array $options = array())
    {
        return $this->container->get('form.factory')->createBuilder('form', $data, $options);
    }

您在“控制器上下文”中,因此如果您想在扩展程序中使用form.factory服务,则必须注入

<强> BUT,

我不会建议您以这种方式管理您的contactForm(使用Twig Extension功能)。为什么不在适当的控制器中创建contactAction。然后,您可以使用twig render帮助程序

在模板中呈现表单
{{ render(controller('YourBundle:YourController:contactAction')) }} 

答案 1 :(得分:0)

如果你使用Symfony来清除你的代码,你应该在不同的文件中创建Forms(src / forms),然后在你的视图和控制器中调用它。