我已经安装https://github.com/Laravel-Backpack,并且喜欢它。
但是我发现文档很少,并且代码太庞大/太复杂,以至于我无法彻底理解如何做到这一点:
我希望能够为页面添加书签,例如example.com/admin/contact/search/mySearchTermHere,并且我希望显示联系人列表,其中将mySearchTermHere
通过管道插入到DataTables搜索字段中(并显示相应的结果)。
查看代码库时,我在CrudRouter.php
中发现:
Route::post($this->name.'/search', [
'as' => 'crud.'.$this->name.'.search',
'uses' => $this->controller.'@search',
]);
我不确定这是否与我要启用的功能有关(我发现它只允许发布而不是获取)。
我如何实现我的目标(理想情况下,无需编辑Backpack源代码,下次我升级到最新版本时,它将被覆盖)?
我有点希望此功能已经存在,也许已经存在,但我只是没有发现要使用哪个URL。
P.S。我正在使用以下版本:
"backpack/base": "^0.7.19",
"backpack/crud": "^3.2"
做您尝试做的事情的默认方法是使用Backpack's filters,它可以使您准确地执行此操作-但会预先填充过滤器,而不是DataTables搜索表单。看一下,我认为这将是最快的方法。
如果只能使用DataTables搜索,则可以根据需要更改列表视图。只需创建一个名为resources/views/backpack/vendor/crud/list.blade.php
的文件。背包会自动捡起它,而不是包装中的那个。从原始文件复制代码并添加所需的自定义逻辑:在加载DataTables之后,使用jQuery强制搜索。
希望有帮助。
为了回答您的第一个猜测,如果您使用的是search()
,则AjaxDataTables方法会反直觉地用于返回所有是否搜索过的结果:
// ------ AJAX TABLE VIEW
// Please note the drawbacks of this though:
// - 1-n and n-n relationship columns won't be searched anymore;
// - date and datetime columns won't be sortable anymore;
$this->crud->enableAjaxTable();
因此,它与您要执行的操作无关。如果您在那里进行修改,它们将分别应用于每个列行。
比我预期的要容易。
在resources/views/vendor/backpack/crud/list.blade.php
中,在var table = $("#crudTable").DataTable({...
的选项对象中,我添加了:
@if (Request::input('q'))
search: {
search: '{{Request::input('q')}}' //https://stackoverflow.com/a/28578355/470749
},
@endif
现在,当我浏览到example.com/admin/contact?q=someSearchTermHere
时,在DataTable中预填充了“ someSearchTermHere”,并出现了适当的结果。
感谢Doug和@tabacitu的鼓励。
更新:在Backpack的更高版本中(“背包/基本”:“ ^ 1.0.0”,“背包/粗体”:“ ^ 3.5.0”),此代码需要放入dataTableConfiguration: {...}
中的resources\views\vendor\backpack\crud\inc\datatables_logic.blade.php
内部代替。
更新:对于Laravel 6.x和背包4,datatables_logic.blade.php
还需要:
$searchQuery = Request::input('q');
并且在javascript中:
@if ($crud->getPersistentTable() && !$searchQuery)
stateSave: true,//https://datatables.net/reference/option/stateSave
@endif
和
@if ($searchQuery)
$('.dataTables_filter input').val('{{$searchQuery}}');
@endif