如何允许 'get' 请求搜索 Laravel 背包

How to allow 'get' request to search Laravel Backpack

我安装了 https://github.com/Laravel-Backpack 并且很喜欢它。

但是我发现文档太少了,而且代码太vast/complex让我无法彻底理解如何做到这一点:

我希望能够为 example.com/admin/contact/search/mySearchTermHere 等页面添加书签,并且我希望联系人列表显示在 mySearchTermHere 所在的位置通过管道传输到 DataTables 搜索字段(并显示相应的结果)。

查看代码库时,我在 CrudRouter.php 中找到:

Route::post($this->name.'/search', [
    'as' => 'crud.'.$this->name.'.search',
    'uses' => $this->controller.'@search',
]);

我不确定这是否与我要启用的内容相关(而且我发现它只允许 Post 而不是 Get)。

我怎样才能实现我的目标(理想情况下不编辑 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 的文件。 Backpack 会自动拾取那个,而不是包裹中的那个。从原始文件中复制代码并添加您需要的自定义逻辑:加载 DataTables 后,使用 jQuery.

强制搜索

希望对您有所帮助。


为了回答您的第一个猜测,如果您使用的是 AjaxDataTables:

search() 方法用于返回所有结果(无论是否搜索)与直觉相反
// ------ 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')}}' //
  },
@endif

现在,每当我浏览到 example.com/admin/contact?q=someSearchTermHere 时,"someSearchTermHere" 就会预填充到 DataTable 中,并显示相应的结果。

感谢和@tabacitu 的鼓励。

更新:在更高版本的 Backpack 中("backpack/base":“^1.0.0”,"backpack/crud":“^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