我为简单的一个字段简报注册表单创建了一个新的表单类型。在我的网站上多次在不同页面上嵌入此内容的最佳方式是什么?
我可以在每个控制器中创建一个具有不同名称的新表单,以便在我的twig模板中显示,但这看起来有点混乱。理想情况下,我希望能够在页面上添加多个表单,并将它们轻松添加到模板中。
我已尝试过{% render controller('MyBundle:EmailSubscribe:subscribe') %}
,但这并不适用于多个插页,而且我确信无论如何都有更好的方法。有任何想法吗?
答案 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。
如果我误解了你的问题,希望有助于通知我。