我有一个控制器,我在其中创建一个表单,其中包含两个下拉列表.
当我渲染我的视图时,我希望在页面的顶部和底部具有相同的表单元素.问题是表单elemet(下拉列表)仅显示在页面顶部,即使我要求twig将它们也放在底部.
这是我想要的:

1和2是下拉列表.我想在页面的顶部和底部复制它.
关于如何做到这一点的任何想法?
顶部内容和底部内容(两个下拉列表位于其中)位于单个sseparate twig文件(searchPanel.html.twig)中,此文件包含在页面中
{% include "MyBundle:Search:searchPanel.html.twig" %}
Run Code Online (Sandbox Code Playgroud)
这是searchPanel.html.twig
<div class="searchPanel">
<form action="{{ path }}" method="POST" {{ form_enctype(form) }}>
Papers per page
{{ form_widget(form.papers_per_page, { 'class': 'ppp'}) }}
/ Sort by
{{ form_widget(form.sort_by, { 'class': 'sort'}) }}
{{ form_rest(form) }}
/ Papers ({{ papers_number }} results)
<input type="submit" class="updateSearchResults" value="Update"></input>
</form>
Run Code Online (Sandbox Code Playgroud)
您的方法中的一个问题是,Symfony的Form-component将呈现带有id的表单元素,如果您在页面上呈现两次相同的表单,则会复制该表单元素.您也可能遇到csrf_token问题.形式的要点不是要复制的.
这就是我要做的.创建一个包含您的paginator表单的twig-template而不使用Symfony\Form,即静态创建所有表单元素并将其传递给paginator-object(或数组)以获取数据而不是使用form_widget().像这样的东西:
<form action="{{ path(app.request.attributes.get('_route') }}" method="POST">
<select name="paginator[per_page]">
{% for per_page in paginator.papers_per_page %}
<option value=""{{ per_page }}">{{ per_page }}</option>
{% endfor %}
</select>
</form>
Run Code Online (Sandbox Code Playgroud)
表单操作会自动将数据提交到当前路由,因此您可以将其嵌入到不同的操作中,并将数据提交给同一操作.在POST时,您可以使用post-data创建一个paginator-object,然后将其添加为表单的数据.之后你就像往常一样使用isValid().
在您的控制器中,您可以获得如下数据:
use Symfony\Component\HttpFoundation\Request;
// ...
public function PaperController()
{
public function listAction(Request $request)
{
if ($request->getMethod() == 'POST') {
$data = $request->request->get('paginator');
$paginator = new Paginator($data);
$form = new PaginatorFormType();
$form->setData($paginator);
if ($form->isValid()) {
// ...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以轻松地在您的视图中嵌入表单,如下所示:
{{ include 'AcmeDemoBundle:Form:paginator.html.twig' with { 'paginator': paginator } }}
Run Code Online (Sandbox Code Playgroud)
基本上,您只需使用控制器中的Form-component进行验证.如果要设置某些默认值或添加其他参数,可能需要从该模板创建宏,但对于您的用例,这应该足够了.也许其他人有更好的解决方案,但这就是我在其中一个项目中遇到类似问题的方法.
| 归档时间: |
|
| 查看次数: |
9662 次 |
| 最近记录: |