我有一个拥有3,000条记录的实体,当我渲染index.html.twig时,信息大约需要35秒才能显示数据表。
我的问题是,如何执行表格的渲染?
我环顾四周但没有运气!
请帮帮我。
谢谢,
控制器
#!/usr/bin/env python3
import netifaces
x = netifaces.interfaces()
i = x[0]
for i in x:
if i != 'lo':
print(i)
face = netifaces.ifaddresses(i)
print(face)
i += i
else:
continue
嫩枝:
public function indexAction()
{
if ($this->getUser() == NULL){
return $this->redirect($this->generateUrl('login_route'));
}
$em = $this->getDoctrine()->getManager();
$session = $this->get('session');
$id_empresaa = $session->get('idempresa');
$session->set('viewProd', 1);
$entities = $em->getRepository('NivalInventarioBundle:InProducto')->findBy(array(
'idEmpresaa' => $id_empresaa
));
return $this->render('NivalInventarioBundle:InProducto:index.html.twig', array(
'entities' => $entities,
));
}
使用Javascript:
{% extends 'NivalInventarioBundle:Default:index.html.twig' %}
{% block content %}
{% block inventario_menu %}
{{ parent() }}
{% endblock %}
<h3>Productos</h3>
<div class="row" style = margin-bottom:55px;">
<div class="col-md-12">
<table id="ftable" class="table table-condensed table-striped table-bordered" cellspacing="0" width="100%">
<thead>
<tr>
<th>Código</th>
<th>Nombre</th>
<th>Unidad</th>
<th>Costo</th>
<th>Sub-Linea</th>
<th>Linea</th>
<th>Invent.</th>
<th>Factura</th>
<th>Activo</th>
<th width="60px">Opción</th>
</tr>
</thead>
<tbody>
{% for entity in entities %}
<tr>
<td>{{ entity.idProducto }}</td>
<td>{{ entity.nombre }}</td>
<td>{{ entity.unidadMedida.nombre }}</td>
<td class="text-right">{{ entity.costoPromedio|number_format(4) }}</td>
<td>{{ entity.subLinea.nombre }}</td>
<td>{{ entity.subLinea.linea.nombre }}</td>
<td>
{% if entity.inventariable == 0 %}
No
{% elseif entity.inventariable == 1 %}
Sí
{% endif %}
</td>
<td>
{% if entity.facturable == 0 %}
No
{% elseif entity.facturable == 1 %}
Sí
{% endif %}
</td>
<td>
{% if entity.activo == 0 %}
No
{% elseif entity.activo == 1 %}
Sí
{% endif %}
</td>
<td class = "actions">
<a href="{{ path('inproducto_show', { 'id': entity.idProducto }) }}"
class = "btn btn-sm btn-info glyphicon glyphicon-search" data-toggle="tooltip" title="Ver"></a>
{% if app.user.nivel > 60 %}
<a href="{{ path('inproducto_edit', { 'id': entity.idProducto }) }}"
class = "btn btn-sm btn-primary glyphicon glyphicon-edit" data-toggle="tooltip" title="Editar"></a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if app.user.nivel > 30 %}
<div class="col-md-12">
<a href="{{ path('inproducto_new') }}"
class = "btn btn-success glyphicon glyphicon-plus" data-toggle="tooltip" title="Nuevo"></a>
</div>
{% endif %}
</div>
{% endblock %}
答案 0 :(得分:3)
加载一个包含3000条记录的HTML表格非常繁重,使用完整框架,ORM和模板引擎来实现这一点的工作量更大。
这种情况的最佳方法是在表格上动态加载记录,仅查询您正在显示的内容并进行真正的分页。你可以用两种方式做到这一点:
选项1
您可以按照DataTables documentation关于如何操作,然后实现JS调用,控制器操作来获取数据和HTML模板。如果你了解Symfony的方法并不难,但这可能会有很多工作。
选项2
使用DatatablesBundle让它为您处理一切。它非常简单,并且拥有良好的文档,甚至还有example存储库。
答案 1 :(得分:1)
尽管表中有3000条记录很重(如前所述),35秒对于表来说非常重要。合理的时间应该少于1-2秒,因为Twig是相当快的引擎。
在模板中找到<td>{{ entity.unidadMedida.nombre }}</td>
。您可能尚未在实体中定义EAGER fetch,因此在请求unidadMedida
字段时会调用SQL查询时间。
打开您的Symfony探查器页面(在开发模式下,它通常是/_profiler/
)并检查您有多少个Doctrine查询。当然如果有数千个数据库请求加载时间也不够。
答案 2 :(得分:1)
以下是我与Paginator一起使用的示例代码(工作):
$pagination = $paginator->paginate(
$query, /* query NOT result */
$request->query->getInt('page', 1)/*page number*/,
10/*limit per page*/
);
最后一个参数10
设置每页的项目数。我相信这对你来说是个很好的解决方案(我的意思是使用paginator)。
答案 3 :(得分:0)
我实施了KnpPaginatorBundle,它非常好用,我推荐它:https://github.com/KnpLabs/KnpPaginatorBundle