pdfloresjdav / avlist-bundle
Symfony AvListBundle
Requires (Dev)
- pagerfanta/pagerfanta: dev-master
- symfony/class-loader: 2.1.*
This package is not auto-updated.
Last update: 2024-09-17 20:15:17 UTC
README
在 Symfony2 中轻松创建分页和可排序的列表
- 安装
在您的 composer 中添加以下内容
"appventus/avlist-bundle": "dev-master"
"pdfloresjdav/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)。如果您的路由需要参数,您显然可以通过路由参数选项传递一个数组。此外,由于单例模式问题,您将无法使用 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 提供了一个主题:range。此主题添加了一些基本操作,以便获得类似以下内容:<- [10,20] on 100 ->
如果您想,您可以通过将主题名称设置为 "theme" 选项并将它放在 app/Resources/AvListBundle/views/AvList/yourCustomThemeFileName.html.twig 中来创建自己的主题