Laravel Nova-如何从HasMany字段中隐藏“创建”按钮?

时间:2019-04-07 05:02:59

标签: laravel-5 eloquent laravel-nova eloquent--relationship

我有一个与Post模型有HasMany关系的User模型。当在Nova的用户资源中包含HasMany的字段时,我看到有Create post button。如何删除/隐藏该按钮?

5 个答案:

答案 0 :(得分:1)

您可以使用Policies来实现。

根据文档:

  

如果存在策略,但缺少用于特定操作的方法,则将不允许用户执行该操作。因此,如果您已定义策略,请不要忘记定义其所有相关授权方法。

因此,在您的情况下,如果您想完全隐藏按钮,则只需为您的资源(PostPolicy)创建策略,而不要实现create方法。

答案 1 :(得分:1)

此问题在laravel nova official documentation

中得到了回答

就我而言,我有 user 模型和 order 模型,我添加了 user Hasmany order

public function addOrder()
{
    return false;
}
现在

根据用户政策创建角色按钮在用户详细信息页面上消失了 this is a screenshot of user detail page

答案 2 :(得分:0)

您需要在这里做两件事。

  1. 在您的帖子资源中

    公共静态函数authorizable()     {         返回true;     }

  2. 现在为Post和return true的所有方法创建策略,除了create,用于创建return falseAuthServiceProvider.php

放入

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

您完成了。

答案 3 :(得分:0)

如果有人仍在寻找解决方案,您可以授权在策略中附加/分离资源:

https://nova.laravel.com/docs/2.0/resources/authorization.html#authorizing-attaching-detaching

因此,在这种情况下,您要向其中添加功能的const arrayIndexRef = useRef(0) const arrayIndex = arrayIndexRef.current useEffect(() => { if(!startGame) return const timer = setInterval(() => { arrayIndexRef.current += 1 if (arrayIndexRef.current >= 9) { clearInterval(timer) } }, 5000) return () => clearInterval(timer) }, [startGame])

UserPolicy

attachPost(User $user, User $model, Post $post) { return false; } 变量是已登录的用户,$user变量是已查看的用户页面。

答案 4 :(得分:0)

如果你像我一样,你最不想做的事情就是通过设置策略来设置阻止创建 HasMany 规则引用的子资源的策略。原因是在 addX() 的“Has”一侧将此 false 策略设置为 HasMany 不仅会阻止从资源详细信息视图创建子资源,还会产生从页面视图创建子资源时出现权限错误,特别是策略禁止创建引用“父”或“有”的资源。当您考虑 addClassName() 的许可声明的范围之广时,实际上并不奇怪。

因此,我的解决方案最终不得不使用丑陋的 CSS。只是为什么这是对创建按钮进行页面相关隐藏的唯一方法。这应该是 HasMany::make("")->canCreate(false) 视图文件中的 Nova/*.php 声明。

无论如何,这里是 CSS,希望对某人有所帮助。

div[dusk="parent-class-detail-component"] div[dusk="has-many-child-class-index-component"] a[dusk='create-button'] {
  display: none;
}