ben*_*h-o 2 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(),
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到错误"调用未定义的方法createFormBuilder()"...
如果我将功能更改为,我也会收到错误 function contactform(Request $request) { ... }
我需要添加什么来使用这个函数一个对象?或者枝条延伸可能是完全错误的方法?
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);
}
Run Code Online (Sandbox Code Playgroud)
您不在此处使用"控制器上下文",因此如果您想form.factory在扩展程序中使用该服务,则必须注入它.
但,
我不会建议您以contactForm这种方式管理(使用Twig Extension功能).为什么不在contactAction适当的控制器中创建一个.然后,您可以使用twig renderhelper 在模板中呈现表单,
{{ render(controller('YourBundle:YourController:contactAction')) }}
Run Code Online (Sandbox Code Playgroud)