Completed
Push — master ( 85d161...32c7e2 )
by Davide
04:30
created

MenuItemController::store()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 2

Importance

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