你好,我试过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')
);
我如何收集选定的标签(在控制器中)并获取通过这些选定标签筛选的所有链接。
我知道的另一个问题是,我们可以为实体生成一个表单,但这种表单呢?
编辑
这是我的指数行动:
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"设置为所需的属性路径。
实际上,最好的做法是创建Type类。制作过滤器的一个很好的捆绑包是https://github.com/lexik/LexikFormFilterBundle
我创建了一个typeGuesser Bundle,它使用lexik的类型来创建一个以EntityFormType类为参数的filterForm。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>=2.8 formTypes更改为FQCN,因此typeGuesser找不到类型名称。需要修复。
这不是处理表单的正确方式-请检查Symfony表单。
解决方案可能是:
控制器
$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) }}