I use https://laravel-admin.org/docs/en/README on my site.
I have a general header in the admin panel, which displays all the sections that can be edited, here is the code:
<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (in_array($link['uri'], ['users', 'posts', 'comments'])) {?>
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>
So, I have 3 partitions. Each section will have its own admin, who will have a corresponding role. Now all admins with roles see all links in the header, but I need to hide them and make sure that the admin sees only the link to which he has a role with rights. How can I do such a check in the header? To display these links depending on the user's role.
I did it this way:
<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (Admin::user()->isRole('administrator')) {?>
<?php if (in_array($link['uri'], ['users', 'posts', 'comments'])) {?>
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>
<?php if (Admin::user()->isRole('post-admin')) {?>
<?php if (in_array($link['uri'], ['posts'])) {?>
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>
<?php if (Admin::user()->isRole('comment-admin')) {?>
<?php if (in_array($link['uri'], ['comments'])) {?>
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>
<?php } ?>
It works, but I ended up with too much repetitive code. Is it possible to do it somehow simpler, to control all the roles in the array?
Something like this:
<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (in_array($link['uri'],
if (Admin::user()->isRole('administrator')) {
['users', 'posts', 'comments']
}
else if (Admin::user()->isRole('post-admin')) {
['posts']
}
)) {?>
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
Or:
<?php if (in_array($link['uri'],
Admin::user()->isRole('administrator') ? ['users', 'posts', 'comments'] :
Admin::user()->isRole('post-admin') ? ['posts'] : '')) {?>
But both options don't work for me..
You have multiple possible solution. One would be to make a helper adminHasAccess($link['uri'])
and use it elegantly in your blade.
function adminHasAccess($uri)
{
switch($uri) {
case 'users':
return Admin::user()->isRole('administrator');
case 'posts':
return Admin::user()->isOne(['post-admin', 'administrator']);
case 'comments':
return Admin::user()->isOne(['comment-admin', 'administrator']);
default:
return false;
}
}
And in your blade:
<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (adminHasAccess($link['uri'])) {?>
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>
For the jammed solution, you can try
<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (
(Admin::user()->isRole('administrator') && in_array($link['uri'], ['users', 'posts', 'comments'])) ||
(Admin::user()->isRole('post-admin') && in_array($link['uri'], ['posts'])) ||
(Admin::user()->isRole('comment-admin') && in_array($link['uri'], ['comments']))
) {?>
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>
Or more compact but less maintainable
<?php foreach(Admin::menuLinks() as $link) { ?>
<?php if (in_array($link['uri'], Admin::user()->isRole('administrator') ? ['users', 'posts', 'comments'] : (Admin::user()->isRole('post-admin') ? ['posts'] : (Admin::user()->isRole('comment-admin') ? ['comments'] : [])))) {?>
<a class="sidebar-toggle sidebar-toggle-link" role="button" href="<?= admin_url($link['uri']) ?>"><i class="fa <?= $link['icon'] ?>"></i>
<?= admin_trans ($link['title']) ?>
</a>
<?php } ?>
<?php } ?>