Как отключить кнопку редактирования/удаления на индексной странице nova и при этом разрешить подробную страницу, если я создам политику, которая отключит операцию везде, я хочу разрешить редактировать и удалять подробную страницу, но просто хочу удалить эту кнопку из индекса,
делает что-то вроде
public function update(User $user, Customer $customer)
{
if ( request()->route()->getName('route-name') ) {
return false;
}
}
это правильный путь или есть лучший способ?






Вы можете определить пользовательские действия и настроить видимость действия в соответствии с вашими требованиями.
# To generate the action class
php artisan nova:action DeleteUserData --destructive
/**
* 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
Для предметов action нет никаких условий, но вы можете сделать это для fields :)
хорошо, спасибо, что указали на это. В Nova 2.0 тоже нет такой опции или вы про 1.0 только?
Он есть и для версии 2.0 nova.laravel.com/docs/2.0/actions/…
Я думаю, вы неправильно поняли мой последний вопрос, я спрашивал в 2.0, мы тоже не можем отключить / включить видимость при редактировании / удалении?
Давайте продолжить обсуждение в чате.
Да... в nova 2.0 вы не можете установить видимость для предопределенных действий, таких как ваши требования.
хорошо, спасибо, они упоминали об этом где-нибудь или вы нашли это во время работы? в любом случае отличный момент для документации, если не упоминается.
Я проверяю обновление документации. github.com/laravel/nova-docs/blob/develop/2.0/actions
Вы можете сделать это, создав политику и вернув false для update() и добавив authorizable() для класса ресурсов.
Если вы хотите отключить любую кнопку строки на индексной странице, создайте политику для ресурса и верните false для соответствующей функции в моем случае update(),
все остальные возвращают true и добавляют политику в AuthServiceProvider.php add
protected $policies = [
Post::class => PostPolicy::class,
];
и в классе ресурсов
public static function authorizable()
{
return true;
}
это отключит эту кнопку.
Он скроет кнопку, но также отключит любые пользовательские операции, в данном случае в соответствии с политикой авторизации edit. Это не то, что спросил пользователь. Пользователь попросил сохранить политику, но скрыть только кнопку.
@Max, пожалуйста, проверьте вопрос, упоминается об отключении на индексной странице и разрешении на странице сведений. Скрытие — это не то же самое, что отключение.
Я проверил вопрос. Вы должны проверить вопрос. Он хочет удалить кнопки из индекса, не отключая операции. Ваш ответ не будет работать, потому что он отключит «редактирование» везде, даже в подробном представлении, и разрешит все другие операции.
@Max Я человек, который задал вопрос, поэтому я очень четко понимаю требование. Я надеюсь, что ваш ответ слишком полезен для других и вас самих. Мой ответ был именно тем, что я хотел, прежде чем опубликовать этот вопрос.
@Max Во-первых, позвольте мне прояснить вас, потому что этот CSS никогда не является решением, в классе политики возвращается false в методе index и true в методе show, отключает кнопки на странице индекса и разрешает его на странице сведений. Кстати у меня больше 6000 репутации, значит что-то есть, наверное.
Нет ни метода index, ни метода show. Даже в вашем ответе не говорится о методе index или show.
@max Я не думаю, что людям, работающим в Laravel, понадобится здесь класс Policy, вместо этого они будут просматривать документацию, чтобы узнать подробности политик, и если они знают, этого ответа должно быть достаточно, чтобы понять, как это работает с ресурсом Nova.
Есть альтернатива, просто использующая css.
div[dusk$ = "-index-component"] table td.td-fit {
display: none !important;
}
Я хочу скрыть только кнопку просмотра, как мне это сделать?
У меня был ресурс Лидов и мне нужно было скрыть на нем кнопку редактирования. Я сделал следующее в своем CSS — см. здесь, как добавьте свой собственный CSS в Nova.
Используя слаг моего ресурса Leads, я могу ссылаться на атрибут «сумерки» по слагу и разделу ресурса:
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, если вы хотите скрыть и представление, и значок редактирования:
Для справки: я использую Пакет «Кнопочное поле», чтобы добавить пользовательскую кнопку для перенаправления на мой собственный инструмент для управления этим ресурсом.
Я не связан ни с одной из приведенных ссылок.
Кажется, существует только решение 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-.
Другие решения, связанные с авторизацией и политиками, не только скроют кнопку, но и полностью отключат действие, поэтому при необходимости вы не сможете запустить его с помощью настраиваемого действия.
Это то, что я искал, но я попытался изменить -удалить- на -просмотреть- и это не работает? Как я могу удалить только кнопку просмотра вместо кнопки удаления? Спасибо
@ChristopherKikoti Это зависит от того, какую модель вы используете, вам нужно заменить users-index-component, попробуйте проверить элемент, чтобы узнать, как он называется.
Я знаю, что эта ветка немного устарела, но вы также можете переопределить метод authorizedToUpdate из своего ресурса nova следующим образом:
public function authorizedToUpdate(Request $request): bool
{
return "nova-api/{resource}" != $request->route()->uri();
}
Это также работает для authorizedToView и authorizedToDelete.
Я хотел сделать что-то подобное. Я не хотел, чтобы кнопка редактирования отображалась на главной странице, но я хотел, чтобы действия выполнялись (и обновляли ресурсы). Поэтому я использовал код ниже:
use Laravel\Nova\Http\Requests\ActionRequest;
...
public function authorizedToUpdate(Request $request)
{
return $request instanceof ActionRequest;
}
Спасибо за ваш ответ, но я ожидал, что мы сможем установить какое-то свойство и сделать это.