Passed
Push — master ( 4b7d5a...61a317 )
by Davide
04:44
created

MenuItemController::menuItemsValidator()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 18
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 7
dl 0
loc 18
ccs 7
cts 7
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
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
use Illuminate\Validation\Rule;
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->type = $request->get('type');
206 2
        $menuItem->menu_id = $request->get('menu_id');
207 2
        $menuItem->access = $request->get('access');
208
209 2
        if ($request->get('order')) {
210 1
            if ($request->get('order') != $menuItem->id) {
211 1
                $this->updateOrder($menuItem->menu_id, $menuItem->parent_item_id, $menuItem->id, $request->get('order'));
212
            }
213
        }
214
215 2
        $menuItem->save();
216 2
    }
217
218
    /***************************************************************************/
219
220
    /**
221
     * Update the menu items order on DB.
222
     *
223
     * @param int $menuId - the menu id
224
     * @param int  $parentItemId - the parent item id (update the order just of the elements on this level)
225
     * @param int $itemId - the id of the element that has been saved
226
     * @param string $position - (first, last or the id of the menu item we want to place this one after)
227
     * @return void
228
     */
229 1
    public function updateOrder($menuId, $parentItemId, $itemId, $position)
230
    {
231 1
        $menuItemsSameMenuAndLevel = $this->getItemsSameMenuAndLevel($menuId, $parentItemId, 0);
232 1
        $menuItem = new MenuItem();
233
234 1
        switch ($position) {
235 1
            case 'first':
236
                $i = 2;
237
                foreach ($menuItemsSameMenuAndLevel as $key => $item) {
238
                    if ($item->id == $itemId) {
239
                        $item->order = 1;
240
                    } else {
241
                        $item->order = $i;
242
                        $i++;
243
                    }
244
                    $item->save();
245
                }
246
                break;
247
248 1
            case 'last':
249
                $i = 1;
250
                $lastIndex = count($menuItemsSameMenuAndLevel);
251
                foreach ($menuItemsSameMenuAndLevel as $key => $item) {
252
                    if ($item->id == $itemId) {
253
                        $item->order = $lastIndex;
254
                    } else {
255
                        $item->order = $i;
256
                        $i++;
257
                    }
258
                    $item->save();
259
                }
260
                break;
261
262
            default:
263 1
                $i = 1;
264 1
                $afterThisElementIndex = 0;
265 1
                foreach ($menuItemsSameMenuAndLevel as $key => $item) {
266
                    if ($item->id == $itemId) {
267
                        $menuItem = $item; // store this element for later
268
                    } elseif ($item->id == $position) {  // we wil place the elemenet after this one
269
                        $item->order = $i;
270
                        $afterThisElementIndex = $i;
271
                        $i = $i + 2;
272
                    } else { // all the other elements
273
                        $item->order = $i;
274
                        $i++;
275
                    }
276
                    $item->save();
277
                }
278
                // assign the order after the specified menu item and save
279 1
                    $menuItem->order = $afterThisElementIndex + 1;
280 1
                    $menuItem->save();
281
282 1
                break;
283
        }
284 1
    }
285
286
    /***************************************************************************/
287
288
    /**
289
     * Get the items of the same menu and level.
290
     *
291
     * @param int $menuId - the menu id
292
     * @param  int $parentItemId - the parent menu item id
293
     * @param  int $kind 1 (retun the pluck) - 0 (return the items)
294
     * @return array
295
     */
296 2
    public function getItemsSameMenuAndLevel($menuId, $parentItemId, $kind)
297
    {
298 2
        if ($kind == 1) {
299 1
            $ret = MenuItem::listsTranslations('name')
300 1
                                            ->where('parent_item_id', '=', $parentItemId)
301 1
                                            ->where('menu_id', '=', $menuId)
302 1
                                            ->orderBy('order')
303 1
                                            ->pluck('name', 'id');
304
        } else {
305 1
            $ret = MenuItem::where('parent_item_id', '=', $parentItemId)
306 1
                                            ->where('menu_id', '=', $menuId)
307 1
                                            ->orderBy('order')
308 1
                                            ->get();
309
        }
310
311 2
        return $ret;
312
    }
313
    
314
    
315
    /***************************************************************************/
316
317
    /**
318
     * Return the Menu item validator with all the defined constraint.
319
     * @param  \Illuminate\Http\Request  $request
320
     * @return \Illuminate\Http\Response
321
     */
322 4
    public function menuItemsValidator($request)
323
    {
324
        $rules = [
325 4
            'name' => 'required',
326 4
            'route' => Rule::requiredIf($request->type == 1),
327 4
            'url' => Rule::requiredIf($request->type == 2),
328
        ];
329
        
330
        
331
        
332
        
333
334
        $messages = [
335
            
336 4
        ];
337
338 4
        $validator = Validator::make($request->all(), $rules, $messages);
339 4
        return $validator;
340
    }
341
    
342
}
343