您好我试过Symfony,我是一个非常新手。 我正在寻找一种优雅的方式来过滤列表。
让我解释一下:
我有两个实体:链接和标记。它们处于多种关系中。
在我的索引视图中,我创建了此表单。我做了一个findAll()来获取select的所有标签:
<form method="GET" action="">
<input class="btn btn-default" type="submit"/>
<select name="tags[]" class="selectpicker" multiple="yes">
{% for tag in tags %}
<option value="{{ tag.id }}"> {{ tag.title }}</option>
{% endfor %}
</select>
</form>
这是我通过DESC获取所有链接顺序的方式:
$links = $em->getRepository('TestDefaultBundle:Link')->findBy(
array(),
array('id' => 'desc')
);
如何收集所选标签(在控制器中)并按所选标签抓取所有链接过滤器。
我知道另一个问题我们可以为实体生成一个表单但是这种形式呢?
修改
这是我的indexAction:
public function indexAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$tags = $em->getRepository('LanCrmBundle:LinkTag')->findAll();
// Create the filter form.
$form = $this->createFormBuilder()
->add('tags', 'entity', array(
'class' => 'LanCrmBundle:LinkTag',
'multiple' => true,
'expanded' => false,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.title', 'ASC');
}
))
->add('OK', 'submit')
->getForm()
;
$form->handleRequest($request);
if ($form->isValid()) {
$data = $form->getData();
// Get all links filtered by tags.
// How to use the $data to filter my links?
$links = $em->getRepository('LanCrmBundle:Link')->findBy(
array(),
array('id' => 'desc')
);
} else {
// Get all links.
$links = $em->getRepository('LanCrmBundle:Link')->findBy(
array(),
array('id' => 'desc')
);
}
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$links,
$this->get('request')->query->get('page', 1),
4
);
return $this->render('LanCrmBundle:Link:index.html.twig', array(
'pagination' => $pagination,
'tags' => $tags,
'form' => $form->createView()
));
}
我有这个错误:
在传递给选择字段的“Lan \ CrmBundle \ Entity \ LinkTag”类型的对象上找不到“__toString()”方法。要改为读取自定义getter,请将选项“property”设置为所需的属性路径。
StringCastException:在传递给选择字段的“Lan \ CrmBundle \ Entity \ LinkTag”类型的对象上找不到“__toString()”方法。要改为读取自定义getter,请将选项“property”设置为所需的属性路径。
答案 0 :(得分:3)
实际上,最佳做法是创建Type类。一个伟大的捆绑来制作过滤器 https://github.com/lexik/LexikFormFilterBundle
我创建了一个typeGuesser Bundle,它使用lexik的类型创建一个filterForm,并将EntityFormType类作为参数。 https://github.com/juanmf/FilterTypeGuesserBundle
安装了两个bundle,并且你的Type Class就位了,代码对于过滤器和一个方法(我在README.md中留下了一个例子)来减少这个以创建查询。
private function createFilterForm($docType)
{
$adapter = $this->get('dd_form.form_adapter');
$type = $this->getFormForDocument($this->getClassFromDocType($docType));
return $adapter->adaptForm(
$type,
$this->generateUrl('document_search', array('docType' => $docType)),
array('pdfPath', 'pdfPages', 'batchStatus', 'createdInBatch', 'documentType')
);
}
注意:从Sf&gt; = 2.8开始,formTypes更改为FQCN,因此typeGuesser无法找到类型名称。需要修复。
答案 1 :(得分:1)
这不是处理表单的正确方法 - 请检查Symfony forms。
解决方案可能是:
控制器
$form = $this->createFormBuilder()
->add('tag', 'entity', array(
'class' => 'TestDefaultBundle:YoutTagEntity',
'multiple' => true,
'expanded' => false,
'query_builder' => function(EntityRepository $er){
return $er->createQueryBuilder('u')
->orderBy('u.title', 'ASC')
},))
->add('OK', 'submit')
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
// data is an array of values from form, for example: $data['tag']
$data = $form->getData();
//here you can now pass variables to another query
$links = $em->getRepository('TestDefaultBundle:Link')->findBy(
array(),
array('id' => 'desc')
);
}
// ... render the form
树枝:
{{ form(form) }}