tegansnyder / idiorm-datatable-json-bridge
PHP Idiorm ORM 与流行的 DataTables JavaScript 库之间的桥梁。
Requires
- php: >=5.2.0
- j4mie/idiorm: 1.5.1
README
Idiorm ORM 与流行的 DataTables JavaScript 库之间的桥梁,旨在抽象出将数据库数据映射到 DataTables 所期望的 JSON 数据时的一些痛点。
在此处提供工作代码示例: https://github.com/tegansnyder/idiorm-datatable-json-bridge-example
安装
此软件包最好使用 composer 载入,并支持 PHP 版本 > 5.2。要将此软件包安装到您的项目中,请将这些行添加到您的 composer.json 文件中
"require": { "tegansnyder/idiorm-datatable-json-bridge": "*" }
使用
使用此库需要在您希望检索 DataTables 格式化 JSON 的地方,将任何 ORM 类的实例替换为 OrmDatatableBridge。它还要求您在获取结果集时使用 get_datatable 替代 find_many、find_one 或 find_array。
示例
以下是一个非常简单的示例,展示了您可以使用之前相同的 Idorim 功能。
$datatable_json = ORMDatatableBridge::for_table('products') ->where( [ 'name' => 'Test Product 1', 'price' => 23 ] ) ->get_datatable(); echo $datatable_json;
返回值
{
"recordsTotal": 1,
"recordsFiltered": 1,
"data": [
{
"id": "1",
"name": "Test Product 1",
"price": "23",
"weight": "12lbs"
}
]
}
隐藏 DT 列示例
隐藏数据和 ID 列可以设置以在后续的 jQuery 中访问数据。参考: https://datatables.net.cn/manual/server-side#Returned-data
$datatable_json = ORMDatatableBridge::for_table('products') ->get_datatable( [ 'DT_RowId' => [ 'type' => 'dynamic', 'key' => 'products_' ], 'DT_RowData' => [ 'weight' => 'total_weight_{{weight}}', 'price' => '{{price}}' ] ] );
返回值
{
"recordsTotal": 3,
"recordsFiltered": 3,
"data": [
{
"id": "1",
"name": "Test Product 1",
"price": "23",
"weight": "12lbs",
"DT_RowData": {
"weight": "total_weight_12lbs",
"price": "23"
}
},
{
"id": "2",
"name": "Test Product 2",
"price": "44",
"weight": "66lbs",
"DT_RowData": {
"weight": "total_weight_66lbs",
"price": "44"
}
},
{
"id": "3",
"name": "Test Product 3",
"price": "100",
"weight": "205lbs",
"DT_RowData": {
"weight": "total_weight_205lbs",
"price": "100"
}
}
]
}
高级示例
如果您像我一样,您可能会发现自己需要将数据列包裹在自定义 HTML 中。您可能还希望在数据表中添加一些动态列,并添加按钮来编辑或删除行。以下是一些您可以传递给 get_datatable 方法的示例高级选项。
$datatable_json = ORMDatatableBridge::for_table('products') ->where('id', 1) ->get_datatable( [ 'DT_RowId' => [ 'type' => 'dynamic', 'key' => 'id', 'prepend' => 'id_' ], 'DT_RowData' => [ 'weight' => 'ship_weight_{{weight}}' ], 'dynamic_columns' => [ [ 'key' => 'edit', 'column_template' => '<a href="edit.php?id={id}}">Edit</a>' ], [ 'key' => 'delete', 'column_template' => '<a href="/delete.php?id={{id}}">Delete</a>' ] ], 'wrap_columns' => [ [ 'key' => 'id', 'column_template' => '<a href="/view.php?id={{id}}">{{id}}</a>' ], [ 'key' => 'name', 'column_template' => '<a href="/view.php?id={{id}}">{{name}}</a>' ] ], 'wrap_all' => [ 'columns' => '<section class="datatable-column {{col_name}}">{{column_data}}</section>' ] ] );
返回值
{
"recordsTotal": 1,
"recordsFiltered": 1,
"data": [
{
"id": "<section class=\"datatable-column\"><a href=\"/view.php?id=1\">1</a></section>",
"name": "<section class=\"datatable-column\"><a href=\"/view.php?id=<a href=\"/view.php?id=1\">1</a>\">Test Product 1</a></section>",
"price": "<section class=\"datatable-column\">23</section>",
"weight": "<section class=\"datatable-column\">12lbs</section>",
"DT_RowId": "id_1",
"DT_RowData": {
"weight": "ship_weight_12lbs"
},
"edit": "<section class=\"datatable-column\"><a href=\"edit.php?id={id}}\">Edit</a></section>",
"delete": "<section class=\"datatable-column\"><a href=\"/delete.php?id=1\">Delete</a></section>"
}
]
}
附加选项
很多时候,您可能不想在您的前端实际使用结果集中的某些列。您可以选择从 JSON 输出中隐藏这些列。在后台数据库查询中,它们仍然可以被选择和使用在模板中,但不会包括在 JSON 输出的列中。以下是一个示例
$datatable_json = ORMDatatableBridge::for_table('products') ->select( [ 'name', 'id', 'price' ] ) ->get_datatable( [ 'hide_columns' => [ 'id' ] ] );
在上面的示例中,我包括了一个名为 hide_column 的参数,并将其值设置为 id。我仍然可以基于此值进行模板化(以下是一个示例)
$datatable_json = ORMDatatableBridge::for_table('products') ->select( [ 'name', 'id', 'price' ] ) ->get_datatable( [ 'hide_columns' => [ 'id' ], 'wrap_columns' => [ [ 'key' => 'id', 'column_template' => '<a href="/product/view/{{id}}" target="_self">{{name}}</a>' ] ], ] );
获取列名
如果您想获取要用于标记 HTML 表格头的列名列表,您可以通过发出 just_columns 参数来进行另一个查询以获取它们。请注意,您仍然可以提供 hide_columns 参数。
$datatable_json = ORMDatatableBridge::for_table('products') ->select( [ 'name', 'id', 'price' ] ) ->get_datatable( [ 'hide_columns' => [ 'id' ], 'just_columns' => true ] );
重命名列名
如果您发现自己通过从上述查询中获取列名来自动填充 HTML 表格头,您可能还希望为了显示目的重命名一些列名。例如,您可能有一个数据库中的列名为 store_price,您希望表格头中的显示为 Store Price。为此,请参见下面的示例
$datatable_json = ORMDatatableBridge::for_table('products') ->select( [ 'name', 'id', 'store_price' ] ) ->get_datatable( [ 'column_display_names' => [ 'name' => 'Name', 'store_price' => 'Store Price' ] ] );
重排列
如果您需要通过使用 column_order 选项重排选择语句的输出,请参阅下面的示例。请注意,如果您之前已使用 column_display_names 选项重命名列,则在重新排序时必须使用新名称。以下是一个重排的示例
$datatable_json = ORMDatatableBridge::for_table('products') ->select( [ 'name', 'id', 'store_price' ] ) ->get_datatable( [ 'column_order' => [ 'store_price', 'id', 'name' ] ] );
记录计数
为了向Datatables提供适当的记录数,它需要计算分页。这个库包含一些用于控制用于获取计数记录的选项。为了获取这个计数,它重写了Idiorm的_build_select方法,通过将您提供的查询包裹在SELECT COUNT(*)语句中,并从您的查询中删除任何强加的限制和偏移量来执行一个初始的COUNT查询,以获取完整的记录数。然后,它使用这个结果来填充JSON中的recordsTotal部分。我认为没有更好的方法了,但我欢迎建议。对于idorim原始查询,这个库期望您将传递给raw_query方法的查询参数绑定命名为'LIMIT :limit'和'OFFSET :offset'。
贡献
我很高兴接受增加额外功能并修复错误的PR。在合并之前,我会尽力评估它们。这个许可协议是在一个BSD许可下发布的,类似于Idiorm。
链接
感谢两个项目的所有贡献者!