tegansnyder/idiorm-datatable-json-bridge

PHP Idiorm ORM 与流行的 DataTables JavaScript 库之间的桥梁。

1.0.10 2016-01-21 13:55 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:00:07 UTC


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

链接

DataTables

Idorim

感谢两个项目的所有贡献者!