【问题标题】:Is it possible to integrate the jQuery DataTables plugin into a Silex application with doctrine 2?是否可以将 jQuery DataTables 插件集成到具有学说 2 的 Silex 应用程序中?
【发布时间】:2014-07-10 12:51:02
【问题描述】:

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

有没有专门的服务提供者或对象?我正在寻找与此捆绑包(Symfony2)类似的东西:

https://github.com/stwe/DatatablesBundle

【问题讨论】:

    标签: symfony doctrine-orm datatables silex service-provider


    【解决方案1】:

    添加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());
    

    设置路由和控制器

    $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 视图

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

    设置 javascripts

    $(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()
        ;
    
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2011-05-07
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2019-12-02
      相关资源
      最近更新 更多