davide-casiraghi/laravel-quick-menus

View on GitHub
src/Models/MenuItem.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace DavideCasiraghi\LaravelQuickMenus\Models;

use Astrotomic\Translatable\Translatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

class MenuItem extends Model
{
    /***************************************************************************/
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'menu_items';

    /***************************************************************************/

    use Translatable;

    public $translatedAttributes = ['name', 'slug'];

    // 'locale', 'menu_item_id' ->  added for the db seeder
    protected $fillable = [
        'parent_item_id',
        'url',
        'font_awesome_class',
        'route',
        'route_param_name_1',
        'route_param_name_2',
        'route_param_name_3',
        'route_param_value_1',
        'route_param_value_2',
        'route_param_value_3',
        'type',
        'menu_id',
        'order',
        'locale',
        'menu_item_id',
    ];

    /***************************************************************************/

    /**
     * Return the items of the menu in a tree format (multidimensional array)
     * If $menuId is 0 return all the items.
     * https://stackoverflow.com/questions/4196157/create-array-tree-from-array-list.
     *
     * @param  $menuId
     * @return array
     */
    public static function getItemsTree($menuId)
    {
        $menuItems = self::
                        when($menuId, function ($query, $menuId) {
                            return $query->where('menu_id', $menuId);
                        })
                        ->orderBy('order', 'ASC')
                        ->get();

        // Create an items multidimensional array by parent_item_id
        $new = [];
        foreach ($menuItems as $menuItem) {
            $new[$menuItem['parent_item_id']][] = $menuItem;
        }

        if (! empty($new)) {
            $ret = self::createTree($new, $new[0]);
        } else {
            $ret = [];
        }
        //dump($ret);

        return $ret;
    }

    /***************************************************************************/

    /**
     * Create array tree from array list - it support more than 1 parentid[0] element
     * https://stackoverflow.com/questions/4196157/create-array-tree-from-array-list.
     *
     * @param  array $list
     * @param  array $parent
     * @return array
     */
    public static function createTree(&$list, $parent)
    {
        $tree = [];
        foreach ($parent as $k=>$l) {
            if (isset($list[$l['id']])) {
                $l['children'] = self::createTree($list, $list[$l['id']]);
            }
            $tree[] = $l;
        }

        return $tree;
    }

    /***************************************************************************/

    /**
     * Return the access level name
     * https://stackoverflow.com/questions/4196157/create-array-tree-from-array-list.
     *
     * @param  int $accessId
     * @return string
     */
    public static function getAccessName($accessId)
    {
        $accessLevels = [
            '1' => 'Public',
            '2' => 'Guest',
            '3' => 'Manager',
            '4' => 'Administrator',
            '5' => 'Super Administrator',
        ];

        $ret = $accessLevels[$accessId];

        return $ret;
    }

    /***************************************************************************/

    /**
     * Check if the user group with the access level and return true if the user is authorized to see the menu item.
     *
     * @return bool
     */
    public function authorized()
    {
        $ret = false;
        $user = Auth::user();

        switch ($this->access) {
            case '1':   // Public
                $ret = true;
                break;
            case '2':   // Guest - not authenticated user
                if (! $user) {
                    $ret = true;
                }
                break;
            case '3':   // Manager
                if ($user) {
                    $ret = true;
                }
                break;
            case '4':   // Admin
                if ($user) {
                    if ($user->isSuperAdmin() || $user->isAdmin()) {
                        $ret = true;
                    }
                }
                break;
            case '5':   // Super Admin
                if ($user) {
                    if ($user->isSuperAdmin()) {
                        $ret = true;
                    }
                }
                break;
        }

        return $ret;
    }
}