Completed
Push — master ( d6577e...9678d0 )
by Davide
04:54
created

MenuItemController   A

Complexity

Total Complexity 28

Size/Duplication

Total Lines 300
Duplicated Lines 0 %

Test Coverage

Coverage 19.23%

Importance

Changes 0
Metric Value
wmc 28
eloc 125
dl 0
loc 300
ccs 25
cts 130
cp 0.1923
rs 10
c 0
b 0
f 0

11 Methods

Rating   Name   Duplication   Size   Complexity  
A index() 0 13 1
A __construct() 0 3 1
A show() 0 3 1
A saveOnDb() 0 25 5
A destroy() 0 6 1
B updateOrder() 0 54 10
A getItemsSameMenuAndLevel() 0 15 2
A edit() 0 21 2
A store() 0 18 2
A update() 0 13 1
A create() 0 20 2
1
<?php
2
3
namespace DavideCasiraghi\LaravelQuickMenus\Http\Controllers;
4
5
use Route;
6
use Validator;
7
use Illuminate\Support\Str;
8
use Illuminate\Http\Request;
9
use Illuminate\Support\Facades\App;
10
use DavideCasiraghi\LaravelQuickMenus\Models\Menu;
11
use DavideCasiraghi\LaravelQuickMenus\Models\MenuItem;
12
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
13
14
class MenuItemController extends Controller
15
{
16
    /* Restrict the access to this resource just to logged in users, except some */
17 2
    public function __construct()
18
    {
19 2
        $this->middleware('admin');
20 2
    }
21
22
    /***************************************************************************/
23
24
    /**
25
     * Display a listing of the resource.
26
     * @param int $id
27
     * @return \Illuminate\Http\Response
28
     */
29 1
    public function index($id)
30
    {
31 1
        $countriesAvailableForTranslations = LaravelLocalization::getSupportedLocales();
32
33 1
        $selectedMenu = Menu::find($id);
34 1
        $selectedMenuName = $selectedMenu->name;
35
36 1
        $menuItemsTree = MenuItem::getItemsTree($id);
37
38 1
        return view('laravel-quick-menus::menuItems.index', compact('menuItemsTree'))
39 1
                    ->with('selectedMenuId', $id)
40 1
                    ->with('selectedMenuName', $selectedMenuName)
41 1
                    ->with('countriesAvailableForTranslations', $countriesAvailableForTranslations);
42
    }
43
44
    /***************************************************************************/
45
46
    /**
47
     * Show the form for creating a new resource.
48
     * @param  \Illuminate\Http\Request  $request
49
     * @return \Illuminate\Http\Response
50
     */
51 1
    public function create(Request $request)
52
    {
53 1
        $menu = Menu::orderBy('name')->pluck('name', 'id');
54 1
        $menuItems = MenuItem::orderBy('name')->pluck('name', 'id');
55 1
        $menuItemsTree = MenuItem::getItemsTree(0);
56
        $routeNames = array_map(function (\Illuminate\Routing\Route $route) {
57 1
            if (isset($route->action['as'])) {
58 1
                return $route->action['as'];
59
            }
60 1
        }, (array) Route::getRoutes()->getIterator());
61
        
62
        // Set the default language to edit the post for the admin to English (to avoid bug with null name)
63
        //App::setLocale('en');
64
65 1
        return view('laravel-quick-menus::menuItems.create')
66 1
            ->with('menuItems', $menuItems)
67 1
            ->with('menu', $menu)
68 1
            ->with('menuItemsTree', $menuItemsTree)
69 1
            ->with('routeNames', $routeNames)
70 1
            ->with('selectedMenuId', $request['menuId']);
71
    }
72
73
    /***************************************************************************/
74
75
    /**
76
     * Store a newly created resource in storage.
77
     *
78
     * @param  \Illuminate\Http\Request  $request
79
     * @return \Illuminate\Http\Response
80
     */
81
    public function store(Request $request)
82
    {
83
        $validator = Validator::make($request->all(), [
84
                'name' => 'required',
85
            ]);
86
        if ($validator->fails()) {
87
            return back()->withErrors($validator)->withInput();
88
        }
89
90
        // Set the default language to edit the post for the admin to English (to avoid bug with null name)
91
        App::setLocale('en');
92
93
        $menuItem = new MenuItem();
94
        $this->saveOnDb($request, $menuItem);
95
        //dd($request->menu_id);
96
97
        return redirect()->route('menuItemsIndex', ['id' => $request->menu_id])
98
                        ->with('success', __('messages.menu_item_added_successfully'));
99
    }
100
101
    /***************************************************************************/
102
103
    /**
104
     * Display the specified resource.
105
     *
106
     * @param  \DavideCasiraghi\LaravelQuickMenus\Models\MenuItem  $menuItem
107
     * @return \Illuminate\Http\Response
108
     */
109
    public function show(MenuItem $menuItem)
110
    {
111
        return view('laravel-quick-menus::menuItems.show', compact('menuItem'));
112
    }
113
114
    /***************************************************************************/
115
116
    /**
117
     * Show the form for editing the specified resource.
118
     *
119
     * @param  \DavideCasiraghi\LaravelQuickMenus\Models\MenuItem  $menuItem
120
     * @return \Illuminate\Http\Response
121
     */
122
    public function edit(MenuItem $menuItem)
123
    {
124
        $menu = Menu::orderBy('name')->pluck('name', 'id');
125
        $menuItems = MenuItem::orderBy('name')->pluck('name', 'id');
126
        $menuItemsSameMenuAndLevel = $this->getItemsSameMenuAndLevel($menuItem->menu_id, $menuItem->parent_item_id, 1);
127
        $menuItemsTree = MenuItem::getItemsTree($menuItem->menu_id);
128
        $routeNames = array_map(function (\Illuminate\Routing\Route $route) {
129
            if (isset($route->action['as'])) {
130
                return $route->action['as'];
131
            }
132
        }, (array) Route::getRoutes()->getIterator());
133
134
        // Set the default language to edit the post for the admin to English (to avoid bug with null name)
135
        //App::setLocale('en');
136
137
        return view('laravel-quick-menus::menuItems.edit', compact('menuItem'))
138
                    ->with('menuItems', $menuItems)
139
                    ->with('menuItemsSameMenuAndLevel', $menuItemsSameMenuAndLevel)
140
                    ->with('menuItemsTree', $menuItemsTree)
141
                    ->with('menu', $menu)
142
                    ->with('routeNames', $routeNames);
143
    }
144
145
    /***************************************************************************/
146
147
    /**
148
     * Update the specified resource in storage.
149
     *
150
     * @param  \Illuminate\Http\Request  $request
151
     * @param  \DavideCasiraghi\LaravelQuickMenus\Models\MenuItem  $menuItem
152
     * @return \Illuminate\Http\Response
153
     */
154
    public function update(Request $request, MenuItem $menuItem)
155
    {
156
        request()->validate([
157
            'name' => 'required',
158
        ]);
159
160
        // Set the default language to edit the post for the admin to English (to avoid bug with null name)
161
        App::setLocale('en');
162
163
        $this->saveOnDb($request, $menuItem);
164
165
        return redirect()->route('menuItemsIndex', ['id' => $request->menu_id])
166
                        ->with('success', __('messages.menu_item_updated_successfully'));
167
    }
168
169
    /***************************************************************************/
170
171
    /**
172
     * Remove the specified resource from storage.
173
     *
174
     * @param  \DavideCasiraghi\LaravelQuickMenus\Models\MenuItem  $menuItem
175
     * @return \Illuminate\Http\Response
176
     */
177
    public function destroy(MenuItem $menuItem)
178
    {
179
        $menuItem->delete();
180
181
        return redirect()->route('menuItemsIndex', ['id' => $menuItem->menu_id])
182
                        ->with('success', __('messages.menu_item_deleted_successfully'));
183
    }
184
185
    /***************************************************************************/
186
187
    /**
188
     * Save/Update the record on DB.
189
     *
190
     * @param  \Illuminate\Http\Request  $request
191
     * @param  \DavideCasiraghi\LaravelQuickMenus\Models\MenuItem
192
     * @return string $ret - the ordinal indicator (st, nd, rd, th)
193
     */
194
    public function saveOnDb($request, $menuItem)
195
    {
196
        $menuItem->translateOrNew('en')->name = $request->get('name');
197
        $menuItem->translateOrNew('en')->compact_name = Str::slug($request->get('name'), '-');
198
        if (! $request->get('parent_item_id')) {
199
            $menuItem->parent_item_id = 0;
200
        } else {
201
            $menuItem->parent_item_id = $request->get('parent_item_id');
202
        }
203
204
        $menuItem->url = $request->get('url');
205
        $menuItem->font_awesome_class = $request->get('font_awesome_class');
206
        $menuItem->hide_name = ($request->hide_name == 'on') ? 1 : 0;
207
        $menuItem->route = $request->get('route');
208
        $menuItem->type = $request->get('type');
209
        $menuItem->menu_id = $request->get('menu_id');
210
        $menuItem->access = $request->get('access');
211
212
        if ($request->get('order')) {
213
            if ($request->get('order') != $menuItem->id) {
214
                $this->updateOrder($menuItem->menu_id, $menuItem->parent_item_id, $menuItem->id, $request->get('order'));
215
            }
216
        }
217
218
        $menuItem->save();
219
    }
220
221
    /***************************************************************************/
222
223
    /**
224
     * Update the menu items order on DB.
225
     *
226
     * @param int $menuId - the menu id
227
     * @param int  $parentItemId - the parent item id (update the order just of the elements on this level)
228
     * @param int $itemId - the id of the element that has been saved
229
     * @param string $position - (first, last or the id of the menu item we want to place this one after)
230
     * @return void
231
     */
232
    public function updateOrder($menuId, $parentItemId, $itemId, $position)
233
    {
234
        $menuItemsSameMenuAndLevel = $this->getItemsSameMenuAndLevel($menuId, $parentItemId, 0);
235
        $menuItem = new MenuItem();
236
237
        switch ($position) {
238
            case 'first':
239
                $i = 2;
240
                foreach ($menuItemsSameMenuAndLevel as $key => $item) {
241
                    if ($item->id == $itemId) {
242
                        $item->order = 1;
243
                    } else {
244
                        $item->order = $i;
245
                        $i++;
246
                    }
247
                    $item->save();
248
                }
249
                break;
250
251
            case 'last':
252
                $i = 1;
253
                $lastIndex = count($menuItemsSameMenuAndLevel);
254
                foreach ($menuItemsSameMenuAndLevel as $key => $item) {
255
                    if ($item->id == $itemId) {
256
                        $item->order = $lastIndex;
257
                    } else {
258
                        $item->order = $i;
259
                        $i++;
260
                    }
261
                    $item->save();
262
                }
263
                break;
264
265
            default:
266
                $i = 1;
267
                $afterThisElementIndex = 0;
268
                foreach ($menuItemsSameMenuAndLevel as $key => $item) {
269
                    if ($item->id == $itemId) {
270
                        $menuItem = $item; // store this element for later
271
                    } elseif ($item->id == $position) {  // we wil place the elemenet after this one
272
                        $item->order = $i;
273
                        $afterThisElementIndex = $i;
274
                        $i = $i + 2;
275
                    } else { // all the other elements
276
                        $item->order = $i;
277
                        $i++;
278
                    }
279
                    $item->save();
280
                }
281
                // assign the order after the specified menu item and save
282
                    $menuItem->order = $afterThisElementIndex + 1;
283
                    $menuItem->save();
284
285
                break;
286
        }
287
    }
288
289
    /***************************************************************************/
290
291
    /**
292
     * Get the items of the same menu and level.
293
     *
294
     * @param int $menuId - the menu id
295
     * @param  int $parentItemId - the parent menu item id
296
     * @param  int $kind 1 (retun the pluck) - 0 (return the items)
297
     * @return array
298
     */
299
    public function getItemsSameMenuAndLevel($menuId, $parentItemId, $kind)
300
    {
301
        if ($kind == 1) {
302
            $ret = MenuItem::where('parent_item_id', '=', $parentItemId)
303
                                            ->where('menu_id', '=', $menuId)
304
                                            ->orderBy('order')
305
                                            ->pluck('name', 'id');
306
        } else {
307
            $ret = MenuItem::where('parent_item_id', '=', $parentItemId)
308
                                            ->where('menu_id', '=', $menuId)
309
                                            ->orderBy('order')
310
                                            ->get();
311
        }
312
313
        return $ret;
314
    }
315
}
316