Laravel-adminlte: [Reopen Issue] View/Display menu in sidebar depending on their roles

Created on 15 May 2017  路  11Comments  路  Source: jeroennoten/Laravel-AdminLTE

I reopen issue #72

I was unable to figure out how to use the custom filter.

Thinking wanted to do like this

[
'text' => 'Users',
'url' => 'users',
'icon' => 'file',
'label_color' => 'success',
'can' => 'manage-blog',
'role' => 'User',
],

but any solution is fine

Most helpful comment

Here's how I implemented it when using spatie/permission:

class RoleMenuFilter implements FilterInterface
{
    public function transform($item, Builder $builder)
    {
        if (! $this->isVisible($item)) {
            return false;
        }

        if (isset($item['header'])) {
            $item = $item['header'];
        }

        return $item;
    }

    protected function isVisible($item)
    {
        // check if user is a member of specified role(s) 
        if (isset($item['roles'])) {
            if (! (Auth::user())->hasAnyRole($item['roles'])) {
                // not a member of any valid roles; check if user has been granted explicit permission
                if (isset($item['can']) && (Auth::user())->can($item['can'])) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return true;
            }
        } else {
            // valid roles not defined; check if user has been granted explicit permission
            if (isset($item['can'])) {
                // permissions are defined
                if ((Auth::user())->can($item['can'])) {
                    return true;
                } else {
                    return false;
                }
            } else {
                // no valid roles or permissions defined; allow for all users
                return true;
            }
        }
    }
}

And the menu config:

[
    'text' => 'Users',
    'icon' => 'users',
    'url'  => 'admin/users',
    'can' => 'list-user',
    'roles' => [
        'admin',
    ],
],

All 11 comments

anyone?

I'm also unable to figure that out...

'menu' => [
'MAIN NAVIGATION',
[
'text' => 'Blog',
'url' => 'admin/blog',
'can' => 'manage-blog',
],
[
'text' => 'Pages',
'url' => 'admin/pages',
'icon' => 'file',
'label' => 4,
'label_color' => 'success',
],
... etc...

When I change the 'text' => 'Pages' tot 'text' => 'Pages TEST', the changes ar not pushed to the view, I also tried with 'php artisan view:clear' but still no changes...

I'm newbie in Laravel, how to find the $adminlte->menu() method in the page.blade.php?

Here's how I implemented it when using spatie/permission:

class RoleMenuFilter implements FilterInterface
{
    public function transform($item, Builder $builder)
    {
        if (! $this->isVisible($item)) {
            return false;
        }

        if (isset($item['header'])) {
            $item = $item['header'];
        }

        return $item;
    }

    protected function isVisible($item)
    {
        // check if user is a member of specified role(s) 
        if (isset($item['roles'])) {
            if (! (Auth::user())->hasAnyRole($item['roles'])) {
                // not a member of any valid roles; check if user has been granted explicit permission
                if (isset($item['can']) && (Auth::user())->can($item['can'])) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return true;
            }
        } else {
            // valid roles not defined; check if user has been granted explicit permission
            if (isset($item['can'])) {
                // permissions are defined
                if ((Auth::user())->can($item['can'])) {
                    return true;
                } else {
                    return false;
                }
            } else {
                // no valid roles or permissions defined; allow for all users
                return true;
            }
        }
    }
}

And the menu config:

[
    'text' => 'Users',
    'icon' => 'users',
    'url'  => 'admin/users',
    'can' => 'list-user',
    'roles' => [
        'admin',
    ],
],

I use Laratrust with this code.
`

namespace AppFilter;

use IlluminateSupportFacadesAuth;
use JeroenNotenLaravelAdminLteMenuBuilder;
use JeroenNotenLaravelAdminLteMenuFiltersFilterInterface;

class MenuFilter implements FilterInterface
{
public function transform($item, Builder $builder)
{
if (isset($item['role']) && ! Auth::user()->hasRole($item['role'])) {
return false;
}

return $item;
}
}`

and here is a menu config

[ 'text' => 'Users', 'url' => 'users', 'icon' => 'users', 'role' => 'su', ],

Where I need to save the new filter class?

Wherever you want in the app directory, as long as you reference it correctly in the configuration.

I am using jeremykenedy laravel-roles. how can i do this? Please Help

please anyone help how to show sidebar menu separately for user and admin

if i add can it hide for both admin and user plz help me

I am using jeremykenedy laravel-roles. how can i do this? Please Help

Any solution?

Here is my solution, starting with this proposal:

I use Laratrust with this code.
`

namespace AppFilter;

use IlluminateSupportFacadesAuth;
use JeroenNotenLaravelAdminLteMenuBuilder;
use JeroenNotenLaravelAdminLteMenuFiltersFilterInterface;

class MenuFilter implements FilterInterface
{
public function transform($item, Builder $builder)
{
if (isset($item['role']) && ! Auth::user()->hasRole($item['role'])) {
return false;
}

return $item;
}
}`

and here is a menu config

[ 'text' => 'Users', 'url' => 'users', 'icon' => 'users', 'role' => 'su', ],

app/Providers/AppServiceProvider.php

    public function boot()
    {
        $this->register();

        \Gate::define('1', function ($user) {
            if ($user->roleId == '1') {
                return true;
            }
            return false;
        });

        \Gate::define('2', function ($user) {
            if ($user->roleId == '2') {
                return true;
            }
            return false;
        });

        \Gate::define('3', function ($user) {
            if ($user->roleId == '3') {
                return true;
            }
            return false;
        });
    }

then, in config/adminlte.php

        [
            'text' => 'site_settings',
            'url'  => 'settings',
            'icon' => 'fas fa-fw fa-cogs',
            'can' => [ '1', '2' ], // array of "roles" or any other filter
        ],

Was this page helpful?
0 / 5 - 0 ratings