Laravel 的背包:如何有条件地添加 'delete' per-line 按钮?
Backpack for Laravel: how to add 'delete' per-line button conditionally?
我有一个 parent 模型可以有 n 个孩子
所以我只想在没有 children 的情况下显示删除按钮(hasMany 关系必须 return 0 条记录)。
如何在 table 的每一行中显示 'delete' link(在列表操作中),但前提是条件有效?
使用
withCount('children')
文档:withCount
此外,您可以使用 blade 指令包装删除按钮
@can('destroy', $model) disabled @endcan
文档:@can
<?php
namespace App\Policies;
use App\Models\Model;
use App\Models\User;
class ModelPolicy
{
public function update(User $user, Model $model)
{
return $model->children_count === 0;
}
}
文档:policy
如果没有关联记录,hasMany
关系将 return 为空 Collection
。然后您可以继续对集合调用 isEmpty()
以验证没有子记录 (children)。
PHP中的示例:
$parents = Parent::with('children')->get();
然后在您的模板中您可以执行以下操作:
@foreach($parents as $parent)
@if($parent->children->isEmpty())
<button>Delete</button>
@endif
@endforeach
我看到的最简单的选择是为 Delete
按钮使用自定义视图,而不是包中的那个。根据您希望进行此更改的范围:
一个。如果你想在所有 CRUDs 中做到这一点 - 这很简单,只需 运行ning 的 publish the view:
php artisan backpack:publish crud/buttons/delete
这会将文件放入您的 resources/views/vendor/backpack/crud/buttons
,供您随意更改。在 the delete button view 中,您有可用的当前条目 $entry
,因此您可以根据需要执行类似 $entry->children()->count()
的操作。请注意,这将是 运行 每行一次,因此如果您在 table 中显示 50 行,则您需要找到一种优化方法。
乙。如果你只想对一个 CRUD 这样做(例如,对类别而不是产品),那么你可以做同样的事情(发布按钮视图),但将按钮重命名为不同的东西,比如delete_if_no_children.blade.php
这样它就不会自动用于所有 CRUD。然后仅在您想要的控制器内使用它,在 setupListOperation()
内,通过删除“stock”删除按钮并添加您的:
// using the Backpack array syntax
$this->crud->removeButton('delete');
$this->crud->addButton('line', 'delete', 'view', 'crud::buttons.delete_if_no_children', 'end');
// using the Backpack fluent syntax
CRUD::button('delete')->view('crud::buttons.delete_if_no_children');
我有一个 parent 模型可以有 n 个孩子
所以我只想在没有 children 的情况下显示删除按钮(hasMany 关系必须 return 0 条记录)。
如何在 table 的每一行中显示 'delete' link(在列表操作中),但前提是条件有效?
使用
withCount('children')
文档:withCount
此外,您可以使用 blade 指令包装删除按钮
@can('destroy', $model) disabled @endcan
文档:@can
<?php
namespace App\Policies;
use App\Models\Model;
use App\Models\User;
class ModelPolicy
{
public function update(User $user, Model $model)
{
return $model->children_count === 0;
}
}
文档:policy
如果没有关联记录,hasMany
关系将 return 为空 Collection
。然后您可以继续对集合调用 isEmpty()
以验证没有子记录 (children)。
PHP中的示例:
$parents = Parent::with('children')->get();
然后在您的模板中您可以执行以下操作:
@foreach($parents as $parent)
@if($parent->children->isEmpty())
<button>Delete</button>
@endif
@endforeach
我看到的最简单的选择是为 Delete
按钮使用自定义视图,而不是包中的那个。根据您希望进行此更改的范围:
一个。如果你想在所有 CRUDs 中做到这一点 - 这很简单,只需 运行ning 的 publish the view:
php artisan backpack:publish crud/buttons/delete
这会将文件放入您的 resources/views/vendor/backpack/crud/buttons
,供您随意更改。在 the delete button view 中,您有可用的当前条目 $entry
,因此您可以根据需要执行类似 $entry->children()->count()
的操作。请注意,这将是 运行 每行一次,因此如果您在 table 中显示 50 行,则您需要找到一种优化方法。
乙。如果你只想对一个 CRUD 这样做(例如,对类别而不是产品),那么你可以做同样的事情(发布按钮视图),但将按钮重命名为不同的东西,比如delete_if_no_children.blade.php
这样它就不会自动用于所有 CRUD。然后仅在您想要的控制器内使用它,在 setupListOperation()
内,通过删除“stock”删除按钮并添加您的:
// using the Backpack array syntax
$this->crud->removeButton('delete');
$this->crud->addButton('line', 'delete', 'view', 'crud::buttons.delete_if_no_children', 'end');
// using the Backpack fluent syntax
CRUD::button('delete')->view('crud::buttons.delete_if_no_children');