如何允许“获取”请求来搜索Laravel背包

问题描述 投票:0回答:2

我已经安装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-for-laravel
2个回答
1
投票

做您尝试做的事情的默认方法是使用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();

因此,它与您要执行的操作无关。如果您在那里进行修改,它们将分别应用于每个列行。


0
投票

比我预期的要容易。

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
© www.soinside.com 2019 - 2024. All rights reserved.