appventus / avlist-bundle
Symfony AvListBundle
Requires (Dev)
- pagerfanta/pagerfanta: dev-master
- symfony/class-loader: 2.1.*
This package is auto-updated.
Last update: 2021-12-21 22:33:43 UTC
README
在 Symfony2 中轻松创建分页和可排序列表
- 安装
将以下内容添加到您的 composer 中
"appventus/avlist-bundle": "dev-master"
- 如何使用它?
a) 控制器
这是一个列出实体的经典操作
use Symfony\Component\HttpFoundation\Request;
class FooController extends Controller
{
/**
* Lists all Foo entities.
*
*/
public function indexAction(Request $request)
{
$em = $this->getDoctrine()->getEntityManager();
$qb = $em->getRepository(MyBundle:Foo)->findAll();
// Create an AvList
$list = $this->get('av_list')->getList($qb, null, array(
'max_per_page' => 20,
));
$list->addColumn('title', null, 'myList.column.title', true, 'entity.title');
$list->addColumn('startDate', array(array("name" => "date", "params" => array('d/m/Y'))), 'myList.column.startDate', true, 'entity.startDate');
return array(
'list' => $list,
);
if ($this->get('request')->isXmlHttpRequest()) {
return $this->render($list->getTemplate(), array(
'list' => $list,
));
} else {
return array(
'list' => $list,
);
}
}
}
addColunmn 允许您添加/定义要在列表中显示的列。为了
-
- 您可以定义要显示的字段
-
- 是否有特殊的 Twig 过滤器可以用于变量以正确显示?
-
- 标签(th)
-
- 我们可以在该列上进行排序吗?
-
- 如果是这样,则在哪个字段上
b) 视图(可选)
如果您想覆盖默认视图,您必须编写一个带有布局的索引和一个仅包含列表的片段
index.html.twig
{% extends "MyBundle::layout.html.twig" %}
{% block content %}
<h1>Foo list</h1>
{% include 'MyBundle:Foo:indexPartial.html.twig' with {'list':list}%}
{% endblock %}
是的,它非常简约,但非常重要。
现在是我们的片段
{% if list.pager.nbResults > 0 %}
<div id="{{ list.option('id') }}">
<table class="table">
<thead>
<tr>
<th class="sortable" data-target="f.name">Name</th>
<th class="sortable" data-target="f.price">Price</th>
<th>Description</th>
</tr>
</thead>
<tbody>
{% for foo in list.pager %}
<tr>
<td>{{ foo.name }}</td>
<td>{{ foo.price }}</td>
<td>{{ foo.name }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% include 'AvListBundle:AvList:control.html.twig' with {'list':list}%}
</div>
{% else %}
<p>No Foos :(</p>
{% endif %}
看这里!
- 它是如何工作的?
在部分视图中,您在 th 标签上设置一个可排序的类和一个带有要搜索的字段值的 id。在我们的例子中,实体 Foo 在查询构建器中的别名为 "f",因此要按 Foo 的名称排序,您设置以下 th id:"f.name"。
- 选项
此包使用 PagerFanta 包构建分页器,更具体地说,是 TwitterBootstrapView。此视图提供了选项,并且您可以在实例化 AvList 时将它们作为第二个参数传递
$list = $this->get('av_list');
$list->addOption("proximity", 3);
$list->addOption("previous_message", "Précédent");
请参阅 PagerFanta 文档以获取更多信息
- 页面上的多个列表
如果您需要在单个页面上有多个列表组件,您将不得不定义路由选项(指定一个不同的 URL 调用请求的 URL)。可选地,如果您的路由需要参数,您显然可以通过 route_parameters 选项传递一个数组。此外,您将无法使用 av_list 服务,因为存在单例模式问题(如果您使用服务,您总是使用相同的对象,因此您将覆盖值而不是创建新列表)。
/**
* Lists all Help\FaqItem entities.
*
* @Route("/", name="admin_myentity_list")
* @Route("/ajax/cat/{id}", name="ajax_admin_myentity_list_by_category")
* @Method("GET")
* @Template()
*/
public function indexAction($id = null)
{
$categories = Your_function();
foreach ($categories as $key => $category) {
$list = new AvList($request, $this->get('templating'));
$list->setQueryBuilder($em->getRepository('MyBundle:MyEntity')->createQueryBuilder('e')->where('e.category = :category')->setParameter('category', $category));
$list->setTemplate($partialTemplate);
$list->setOptions(array(
'route' => 'ajax_admin_myentity_list_by_category',
'route_parameters' => array('id' => $category->getId()),
'theme' => 'range',
'maxPerPage' => 5,
'container_class' => $category->getId().'-myentity-list',
'container_id' => $category->getId().'-myentity-list'
));
$params["lists"][$category->getId()] = $list;
}
}
- 自定义控制主题
默认情况下,AvList 提供了一个主题:范围。此主题添加了一些基本操作,例如:<- [10,20] on 100 ->
如果您想,您可以创建自己的主题,将主题名称设置为 "theme" 选项,并将其放在 app/Resources/AvListBundle/views/AvList/yourCustomThemeFileName.html.twig 中