我想用 Doctrine 2 将 jQuery DataTables 集成到 Silex 应用程序中。
有没有专门的服务提供者或对象?我正在寻找与此捆绑包(Symfony2)类似的东西:
我想用 Doctrine 2 将 jQuery DataTables 集成到 Silex 应用程序中。
有没有专门的服务提供者或对象?我正在寻找与此捆绑包(Symfony2)类似的东西:
创造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');
创建树枝视图
<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()
;
});