laravel nova 在索引页隐藏编辑按钮

laravel nova hide edit button on index page

如何禁用 nova 索引页面上的 edit/delete 按钮并在详细页面中仍然允许,如果我创建一个策略,那将禁用所有地方的操作,我想允许在详细页面中编辑和删除,但只想从索引中删除那些按钮,

正在做类似

的事情
 public function update(User $user, Customer $customer)
    {
        if ( request()->route()->getName('route-name') ) {
            return false;
        }
    }

是正确的方法还是有更好的方法?

您可以定义自定义操作并根据您的要求设置操作可见性。

  1. 新建操作Class:
# To generate the action class
php artisan nova:action DeleteUserData --destructive
  1. 设置操作可见性:
/**
 * Indicates if this action is only available on the resource index view.
 *
 * @var bool
 */
public $onlyOnIndex = false;

/**
 * Indicates if this action is only available on the resource detail view.
 *
 * @var bool
 */
public $onlyOnDetail = true;

来源:https://nova.laravel.com/docs/1.0/actions/defining-actions.html#action-visibility

如果您想禁用索引页面上的任何行按钮,请为资源创建一个策略,并在我的情况下对相应的函数创建 return false update()

所有其他人 return 正确并在 AuthServiceProvider.php 添加策略

protected $policies = [
    Post::class => PostPolicy::class,
];

并在资源 class

public static function authorizable()
{
    return true;
}

这将禁用该按钮。

有一个替代方案,只需使用 css。

    div[dusk$="-index-component"] table td.td-fit {
     display: none !important;
    }

我有一个 Leads 资源,我需要隐藏其上的编辑按钮。我在 CSS 中执行了以下操作 - 请参阅此处了解如何 add your own CSS to Nova.

使用我的 Leads 资源的 slug,我可以通过 slug 和资源部分来引用 dusk 属性:

div[dusk="leads-index-component"] table td.td-fit span:last-of-type {
    display: none !important;
}

所以您要更改的部分是 leads-index-component 部分 {your-resource-slug}-index-component

此外,如果您想同时隐藏视图和编辑图标,只需删除 :last-of-type 部分:

作为参考,我正在使用 Button Field package 添加自定义按钮以重定向到我自己的自定义工具来管理此资源。

我不隶属于所提供的任何链接。

似乎只有CSS个解决方案,例如:

/* Details page */
div[dusk="users-detail-component"] button[dusk="open-delete-modal-button"],
/* Index page next to each row */
div[dusk="users-index-component"] button[dusk$="-delete-button"],
/* Index page after checking boxes */
div[dusk="users-index-component"] div[dusk="delete-menu"] {
  display: none !important;
}

输入您的组件名称,在本例中为 users-

涉及授权和策略的其他解决方案不仅会隐藏按钮,还会完全禁用该操作,因此如果需要,您将无法通过自定义操作运行它。

我知道这个线程有点旧,但您也可以从您的 nova 资源中覆盖 authorizedToUpdate 方法,如下所示:

public function authorizedToUpdate(Request $request): bool
{
    return "nova-api/{resource}" != $request->route()->uri();
}

这也适用于 authorizedToViewauthorizedToDelete

我想做类似的事情。我不希望编辑按钮出现在索引页上,但我希望操作 运行(并更新资源)。所以我使用了下面的代码:

use Laravel\Nova\Http\Requests\ActionRequest;

...

public function authorizedToUpdate(Request $request)
{
    return $request instanceof ActionRequest;
}