Linkable::dropDown()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 3
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace JumpGate\Menu\Traits;
4
5
use JumpGate\Menu\Link;
6
use JumpGate\Menu\DropDown;
7
8
/**
9
 * Class Linkable
10
 *
11
 * @package JumpGate\Menu\Traits
12
 */
13
trait Linkable
14
{
15
    /**
16
     * Parent menu object
17
     *
18
     * @var Menu
19
     */
20
    public $menu;
21
22
    /**
23
     * The menu links
24
     *
25
     * @var \Illuminate\Support\Collection
26
     */
27
    public $links = 'links NEEDS TO BE SET TO A COLLECTION';
28
29
    /**
30
     * @param $slug
31
     * @param $name
32
     * @param $callback
33
     */
34
    public function dropDown($slug, $name, $callback)
35
    {
36
        $dropDown       = new DropDown();
37
        $dropDown->name = $name;
38
39
        $this->insertMenuObject($slug, $callback, $dropDown);
40
    }
41
42
    /**
43
     * @param $slug
44
     * @param $callback
45
     *
46
     * @throws \Exception
47
     */
48
    public function getDropDown($slug, $callback)
49
    {
50
        $dropDown = $this->links->where('slug', $this->snakeName($slug))->first();
51
52
        if ($dropDown) {
53
            call_user_func($callback, $dropDown);
54
        } else {
55
            throw new \Exception("Drop down {$slug} not found.");
56
        }
57
    }
58
59
    /**
60
     * @param $slug
61
     * @param $callback
62
     */
63
    public function link($slug, $callback)
64
    {
65
        $this->insertMenuObject($slug, $callback, (new Link));
66
    }
67
68
    /**
69
     * Get the menu this linkable belongs to
70
     *
71
     * @return Menu
72
     */
73
    private function getMenu()
74
    {
75
        if (isset($this->menu)) {
76
            return $this->menu;
77
        }
78
79
        return $this;
80
    }
81
82
    /**
83
     * Sanitize the menus names for safe use in array keys.
84
     *
85
     * @param $name
86
     *
87
     * @return string
88
     */
89
    public function snakeName($name)
90
    {
91
        return e(snake_case($name));
92
    }
93
94
    /**
95
     * Insert an object into the menu
96
     *
97
     * @param $slug
98
     * @param $callback
99
     * @param $object
100
     */
101
    private function insertMenuObject($slug, $callback, $object)
102
    {
103
        $object->slug = $this->snakeName($slug);
104
        $object->menu = $this->getMenu();
105
106
        call_user_func($callback, $object);
107
108
        if (! $object->insert) {
109
            $this->links[] = $object;
110
        }
111
    }
112
} 
113