caffeinated / menus

:pushpin: Menu generator package for the Laravel framework
https://caffeinatedpackages.com
132 stars 59 forks source link

Dynamic Generation from database #41

Closed ghost closed 9 years ago

ghost commented 9 years ago

Hello,

I want to generate the menu items from a database table.

Currently I have the following implementation:

Database

Illuminate\Database\Eloquent\Collection Object
(
     [items:protected] => Array
    (
        [0] => App\Modules\Cms\Entities\NavigationAdmin Object
            (
                [table:protected] => navigation_admin
                [fillable:protected] => Array
                    (
                        [0] => title
                        [1] => options
                        [2] => parent_id
                    )

                [connection:protected] => 
                [primaryKey:protected] => id
                [perPage:protected] => 15
                [incrementing] => 1
                [timestamps] => 1
                [attributes:protected] => Array
                    (
                        [id] => 1
                        [title] => Dashboard
                        [options] => {"icon":"home","order":"10","role":"admin"}
                        [parent_id] => 
                        [created_at] => 2015-06-04 11:29:34
                        [updated_at] => 2015-06-04 11:29:34
                    )

                [original:protected] => Array
                    (
                        [id] => 1
                        [title] => Dashboard
                        [options] => {"icon":"home","order":"10","role":"admin"}
                        [parent_id] => 
                        [created_at] => 2015-06-04 11:29:34
                        [updated_at] => 2015-06-04 11:29:34
                    )

                [relations:protected] => Array
                    (
                    )

                [hidden:protected] => Array
                    (
                    )

                [visible:protected] => Array
                    (
                    )

                [appends:protected] => Array
                    (
                    )

                [guarded:protected] => Array
                    (
                        [0] => *
                    )

                [dates:protected] => Array
                    (
                    )

                [casts:protected] => Array
                    (
                    )

                [touches:protected] => Array
                    (
                    )

                [observables:protected] => Array
                    (
                    )

                [with:protected] => Array
                    (
                    )

                [morphClass:protected] => 
                [exists] => 1
            )

    )
 )

Menu File

     use App\Modules\Cms\Entities\NavigationAdmin;
     Menu::make('backend', function($menu) {
              $items = NavigationAdmin::all();
              foreach($items as $item) {
                  $menu->add($item->title, '#');

                  if ( isset($item->options) ) {
                           $options = json_decode($item->options);
                           $title = camel_case($item->title);
                           $menu->$title->data([
                                'order' => $options->order,
                                'role' => $options->role
                          ]);
                  }
              }
     });

After I doing this I will check menu via dd method and all seems okay.

But when I try to get the menu items it load and load and never stops.

Can u help me whats wrong ?

kaidesu commented 9 years ago

I would take a step back and simplify the code, slowly making additions to it to find out what the issue is.

First step is to simply load your items from the database and add them to a menu - don't worry about the options for now. Once you've got that working, then move on to implementing the menu options.

There's a few ways you can go about things. Maybe try and simply create your menu instance (with no items), and then add your items to it:

$menu = Menu::make('backend', function($menu) {
    $menu->add('Dashboard', 'admin');
});

$items = NavigationAdmin::all();

foreach ($items as $item) {
    $menu->add($item->title, '#');
}

Or this should even work:

$items = NavigationAdmin::all();

Menu::make('backend', function($menu) use ($items) {
    foreach ($items as $item) {
        $menu->add($item->title, '#');
    }
});
twitnic commented 9 years ago

Hey,

that works, but when I gerate Submenus it say: Call to a member function add() on a non-object

My File: <?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\DB;
use Menu;

    class MenuMiddleware
    {
    /**
     * Run the request filter.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure                  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $stops = DB::table('pictures')
            ->leftJoin('gallery', 'pictures.gallery_id', '=', 'gallery.id')
            ->select(DB::raw('pictures.gallery_id, gallery.name, COUNT(DISTINCT pictures.slide) as AnzahlSlides'))
            ->groupBy('pictures.gallery_id')
        ->get();

    Menu::make('backend', function($menu) use ($stops) {

        foreach ($stops as $stop) {

            $menu
                ->add($stop->name, ['route' => ['getGalleryVenue', $stop->gallery_id]])
                ->active('admin/backend/gallery/' . $stop->gallery_id)
                ->icon('fa-picture-o');

            $lowerName = strtolower($stop->name);

            for($i = 1; $i <= $stop->AnzahlSlides; $i++) {
                $menu->$lowerName->add($i, ['route' => ['getGallerySlide', $stop->gallery_id, $i]]);
                }
            }
        });

        return $next($request);
    }
}

Could anyone maybe help? Thanks