MenuItemController::edit()   A
last analyzed

Complexity

Conditions 2
Paths 1

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 2

Importance

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