symfony - 是否可以使用原则 2 将 jQuery DataTables 插件集成到 Silex 应用程序中?

标签 symfony doctrine-orm datatables silex service-provider

我想使用 Doctrine 2 将 jQuery DataTables 集成到 Silex 应用程序中。

是否有专门的服务提供商或对象?我正在寻找类似于此 bundle (Symfony2)的东西:

https://github.com/stwe/DatatablesBundle

最佳答案

添加DatatablesProvider.php

创建DatatablesServiceProvider.php

<?php

namespace Dev\Pub\Provider;

use Silex\Application;
use Silex\ServiceProviderInterface;
use Dev\Pub\Provider\DatatablesProvider;

class DatatablesServiceProvider implements ServiceProviderInterface
{
    public function register(Application $app)
    {
        $app['datatables'] = $app->share(function ($app){
            $datatables = new DatatablesProvider();
            return $datatables;
        });
    }

    public function boot(Application $app)
    {
    }
}

注册服务提供商

$app->register(new Dev\Provider\DatatablesServiceProvider());

设置路由和 Controller

$app->match('/doctrine-datatables', function (Request $request) use ($app) {

        // view data config - hardcoded :(
        $labels[] = '';
        $columns[] = array('db' => 'id','dt' => 0);

        $data = array(
            array(
                'name' => 'text1',
                'label' => 'Text 1',
            ),
            array(
                'name' => 'text2',
                'label' => 'Text 2',
            ),
            array(
                'name' => 'text3',
                'label' => 'Text 3',
            ),
        );

        foreach($data as $i => $column) {
            $labels[] = $column['label'];
            $columns[] = array(
                'db' => $column['name'],
                'dt' => $i+1
            );
        }

        $view = array(
            'labels' => $labels,
            'columns' => $columns,
            'filter' => array(),
        );

        if ($request->isXmlHttpRequest()){

            $datatables = $app['datatables'];

            // gets
            $requestUri = $request->getRequestUri();
            $urlparts = parse_url($requestUri);
            parse_str($urlparts['query'], $gets);

            $response = $datatables::simple($gets, $app['orm.em'], 'Dev\Pub\Entity\Form', 'id', $view);
            // error_log(print_r($response,1).' '.__FILE__.' '.__LINE__,0);

            return new JsonResponse($response);
        }
        else {

            $em = $app['orm.em'];

            // @note: this should be in a repository
            $qb = $em->createQueryBuilder();
            $placeholder = 'o';
            $select = '';
            foreach($view['columns'] as $column) {
                $select .= $placeholder.'.'.$column['db'].',';
            }
            $select = rtrim($select, ',');
            $qb
                ->select($select)
                ->from('Dev\Pub\Entity\Form', $placeholder)
            ;
            $data = $qb->getQuery()->getResult();

            return new Response($app['twig']->render('doctrine.html.twig',array(
                'columnLables' => $view['labels'],
                'data' => $data,
            )));
        }

})->bind('doctrine_datatables');

创建 Twig View

<h2>{{ 'Doctrine'|trans }}</h2>
<hr>

<div class="table-responsive">
    <table id="datatables" class="datatables table table-striped table-condensed" cellpadding="0" cellspacing="0" border="0">
        <thead>
            <tr>
                {# render table head field names #}
                {% for label in columnLables %}
                    <th>
                        <p class="text-left">{{ label }}</p>
                    </th>
                {% endfor %}
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>
</div>

设置 JavaScript

$(function(){
    console.log('doctrine.main.js');

    // http://www.datatables.net/examples/index
    // http://stackoverflow.com/questions/11400459/how-to-return-the-specific-page-in-jquery-datatables-paging
    var $dt = $('.datatables')

        // before ajax request
        .on('preXhr.dt', function ( e, settings, data ) {
            // console.log('before xhr');
            // @todo: validate session id
            // data.sessionId = $('#sessionId').val();
        })

        .dataTable({
            'pagingType': 'simple_numbers',
            'scrollX': true,
            'language': {
                'lengthMenu': ' _MENU_ ',
                'search': '<form class="" role="search"><div class="form-group"><div class="input-group">_INPUT_<div class="input-group-addon"><span class="glyphicon glyphicon-search"></span></div></div></div></form>',
                'info': '<p class="lead no-margin"><small>Showing _START_ to _END_ of _TOTAL_ entries</small></p>'
            },
            'dom': '<"row dataTables_toolbar dataTables_toolbar_top"<"col-md-6"<"fg-toolbar"l>><"col-md-6"<"fg-toolbar text-right search"f>>>t<"row dataTables_toolbar dataTables_toolbar_bottom"<"col-md-6"<"fg-toolbar"i>><"col-md-6"<"fg-toolbar text-right"p>>>',
            'processing': true,
            'serverSide': true,
            // 'deferRender': true,
            'ajax': '/doctrine-datatables',
            'createdRow': function (row, data, index) {

                var
                    id = data[0], // assumes index zero is the id
                    prefix = 'dev_pub_formentitytype_forms_'
                ;

                // add id to tr tag
                $(row).attr('data-entity-id', id);

                // // add checkbox input
                // var checkbox = $('#' + prefix + id).clone();
                // $(':first-child', row).html(checkbox);
            }
        }),

        // datatables api object
        api = $dt.DataTable()
    ;

});

关于symfony - 是否可以使用原则 2 将 jQuery DataTables 插件集成到 Silex 应用程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23790638/

相关文章:

php - 在 EntityRepository 中注入(inject) EventDispatcher 的最佳方法是什么?

php - JMSSerializerBundle 在 JSON 中返回 double 字符串

javascript - 数据表 + 服务器端 : Child Rows destroyed

php - 在 Yajra 数据表中找不到 DT_Row_Index

symfony - 通过 Composer 更新时不是 git 存储库错误

Symfony Console Questionn Helper - 如何提示默认值

php - 使用 Doctrine 查询生成器获取所有订购的实体

php - 教义异常 : Deadlock found when trying to get lock

mysql - 如何在 Doctrine2 中获取与其他实体相关的 2 个实体

jquery - 如何在 Datatables.net 的响应式 View 中显示多于 1 行?