如何用symfony在树枝上显示大表?

时间:2017-02-23 00:46:59

标签: symfony twig

我有一个拥有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 %}

4 个答案:

答案 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