Completed
Push — master ( e38dbb...bbaabe )
by Davide
03:48
created

MenuItemController::updateOrder()   B

Complexity

Conditions 10
Paths 10

Size

Total Lines 54
Code Lines 41

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 42.0294

Importance

Changes 0
Metric Value
eloc 41
dl 0
loc 54
ccs 12
cts 38
cp 0.3158
rs 7.6666
c 0
b 0
f 0
cc 10
nc 10
nop 4
crap 42.0294

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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 3
    public function __construct()
18
    {
19 3
        $this->middleware('admin');
20 3
    }
21
22
    /***************************************************************************/
23
24
    /**
25
     * Display a listing of the resource.
26
     * @param int $id
27
     * @return \Illuminate\Http\Response
28
     */
29 2
    public function index($id)
30
    {
31 2
        $countriesAvailableForTranslations = LaravelLocalization::getSupportedLocales();
32
33 2
        $selectedMenu = Menu::find($id);
34 2
        $selectedMenuName = $selectedMenu->name;
35
36 2
        $menuItemsTree = MenuItem::getItemsTree($id);
37
38 2
        return view('laravel-quick-menus::menuItems.index', compact('menuItemsTree'))
39 2
                    ->with('selectedMenuId', $id)
40 2
                    ->with('selectedMenuName', $selectedMenuName)
41 2
                    ->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 1
    public function store(Request $request)
82
    {
83 1
        $validator = Validator::make($request->all(), [
84 1
                'name' => 'required',
85
            ]);
86 1
        if ($validator->fails()) {
87
            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', __('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
    public function edit(MenuItem $menuItem)
119
    {
120
        $menu = Menu::orderBy('name')->pluck('name', 'id');
121
        $menuItems = MenuItem::orderBy('name')->pluck('name', 'id');
122
        $menuItemsSameMenuAndLevel = $this->getItemsSameMenuAndLevel($menuItem->menu_id, $menuItem->parent_item_id, 1);
123
        $menuItemsTree = MenuItem::getItemsTree($menuItem->menu_id);
124
        $routeNames = array_map(function (\Illuminate\Routing\Route $route) {
125
            if (isset($route->action['as'])) {
126
                return $route->action['as'];
127
            }
128
        }, (array) Route::getRoutes()->getIterator());
129
130
        // Set the default language to edit the post for the admin to English (to avoid bug with null name)
131
        //App::setLocale('en');
132
133
        return view('laravel-quick-menus::menuItems.edit', compact('menuItem'))
134
                    ->with('menuItems', $menuItems)
135
                    ->with('menuItemsSameMenuAndLevel', $menuItemsSameMenuAndLevel)
136
                    ->with('menuItemsTree', $menuItemsTree)
137
                    ->with('menu', $menu)
138
                    ->with('routeNames', $routeNames);
139
    }
140
141
    /***************************************************************************/
142
143
    /**
144
     * Update the specified resource in storage.
145
     *
146
     * @param  \Illuminate\Http\Request  $request
147
     * @param  \DavideCasiraghi\LaravelQuickMenus\Models\MenuItem  $menuItem
148
     * @return \Illuminate\Http\Response
149
     */
150
    public function update(Request $request, MenuItem $menuItem)
151
    {
152
        request()->validate([
153
            'name' => 'required',
154
        ]);
155
156
        // Set the default language to edit the post for the admin to English (to avoid bug with null name)
157
        App::setLocale('en');
158
159
        $this->saveOnDb($request, $menuItem);
160
161
        return redirect()->route('menuItemsIndex', ['id' => $request->menu_id])
162
                        ->with('success', __('messages.menu_item_updated_successfully'));
163
    }
164
165
    /***************************************************************************/
166
167
    /**
168
     * Remove the specified resource from storage.
169
     *
170
     * @param  \DavideCasiraghi\LaravelQuickMenus\Models\MenuItem  $menuItem
171
     * @return \Illuminate\Http\Response
172
     */
173
    public function destroy(MenuItem $menuItem)
174
    {
175
        $menuItem->delete();
176
177
        return redirect()->route('menuItemsIndex', ['id' => $menuItem->menu_id])
178
                        ->with('success', __('messages.menu_item_deleted_successfully'));
179
    }
180
181
    /***************************************************************************/
182
183
    /**
184
     * Save/Update the record on DB.
185
     *
186
     * @param  \Illuminate\Http\Request  $request
187
     * @param  \DavideCasiraghi\LaravelQuickMenus\Models\MenuItem
188
     * @return string $ret - the ordinal indicator (st, nd, rd, th)
189
     */
190 1
    public function saveOnDb($request, $menuItem)
191
    {
192 1
        $menuItem->translateOrNew('en')->name = $request->get('name');
193 1
        $menuItem->translateOrNew('en')->slug = Str::slug($request->get('name'), '-');
194 1
        if (! $request->get('parent_item_id')) {
195 1
            $menuItem->parent_item_id = 0;
196
        } else {
197
            $menuItem->parent_item_id = $request->get('parent_item_id');
198
        }
199
200 1
        $menuItem->url = $request->get('url');
201 1
        $menuItem->font_awesome_class = $request->get('font_awesome_class');
202 1
        $menuItem->hide_name = filter_var($request->hide_name, FILTER_VALIDATE_BOOLEAN);
203 1
        $menuItem->route = $request->get('route');
204 1
        $menuItem->type = $request->get('type');
205 1
        $menuItem->menu_id = $request->get('menu_id');
206 1
        $menuItem->access = $request->get('access');
207
208 1
        if ($request->get('order')) {
209 1
            if ($request->get('order') != $menuItem->id) {
210 1
                $this->updateOrder($menuItem->menu_id, $menuItem->parent_item_id, $menuItem->id, $request->get('order'));
211
            }
212
        }
213
        
214 1
        $menuItem->save();
215 1
    }
216
217
    /***************************************************************************/
218
219
    /**
220
     * Update the menu items order on DB.
221
     *
222
     * @param int $menuId - the menu id
223
     * @param int  $parentItemId - the parent item id (update the order just of the elements on this level)
224
     * @param int $itemId - the id of the element that has been saved
225
     * @param string $position - (first, last or the id of the menu item we want to place this one after)
226
     * @return void
227
     */
228 1
    public function updateOrder($menuId, $parentItemId, $itemId, $position)
229
    {
230 1
        $menuItemsSameMenuAndLevel = $this->getItemsSameMenuAndLevel($menuId, $parentItemId, 0);
231 1
        $menuItem = new MenuItem();
232
233 1
        switch ($position) {
234 1
            case 'first':
235
                $i = 2;
236
                foreach ($menuItemsSameMenuAndLevel as $key => $item) {
237
                    if ($item->id == $itemId) {
238
                        $item->order = 1;
239
                    } else {
240
                        $item->order = $i;
241
                        $i++;
242
                    }
243
                    $item->save();
244
                }
245
                break;
246
247 1
            case 'last':
248
                $i = 1;
249
                $lastIndex = count($menuItemsSameMenuAndLevel);
250
                foreach ($menuItemsSameMenuAndLevel as $key => $item) {
251
                    if ($item->id == $itemId) {
252
                        $item->order = $lastIndex;
253
                    } else {
254
                        $item->order = $i;
255
                        $i++;
256
                    }
257
                    $item->save();
258
                }
259
                break;
260
261
            default:
262 1
                $i = 1;
263 1
                $afterThisElementIndex = 0;
264 1
                foreach ($menuItemsSameMenuAndLevel as $key => $item) {
265
                    if ($item->id == $itemId) {
266
                        $menuItem = $item; // store this element for later
267
                    } elseif ($item->id == $position) {  // we wil place the elemenet after this one
268
                        $item->order = $i;
269
                        $afterThisElementIndex = $i;
270
                        $i = $i + 2;
271
                    } else { // all the other elements
272
                        $item->order = $i;
273
                        $i++;
274
                    }
275
                    $item->save();
276
                }
277
                // assign the order after the specified menu item and save
278 1
                    $menuItem->order = $afterThisElementIndex + 1;
279 1
                    $menuItem->save();
280
281 1
                break;
282
        }
283 1
    }
284
285
    /***************************************************************************/
286
287
    /**
288
     * Get the items of the same menu and level.
289
     *
290
     * @param int $menuId - the menu id
291
     * @param  int $parentItemId - the parent menu item id
292
     * @param  int $kind 1 (retun the pluck) - 0 (return the items)
293
     * @return array
294
     */
295 1
    public function getItemsSameMenuAndLevel($menuId, $parentItemId, $kind)
296
    {
297 1
        if ($kind == 1) {
298
            $ret = MenuItem::where('parent_item_id', '=', $parentItemId)
299
                                            ->where('menu_id', '=', $menuId)
300
                                            ->orderBy('order')
301
                                            ->pluck('name', 'id');
302
        } else {
303 1
            $ret = MenuItem::where('parent_item_id', '=', $parentItemId)
304 1
                                            ->where('menu_id', '=', $menuId)
305 1
                                            ->orderBy('order')
306 1
                                            ->get();
307
        }
308
309 1
        return $ret;
310
    }
311
}
312