Completed
Push — master ( 9c2e72...c96a4c )
by Alexey
02:14
created

Slider   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 153
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 15
lcom 1
cbo 8
dl 0
loc 153
ccs 40
cts 40
cp 1
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A init() 0 6 2
A run() 0 7 2
A renderList() 0 10 2
A renderIndexedItems() 0 6 2
A renderAssociativeItems() 0 13 4
A registerAssets() 0 13 3
1
<?php
2
3
namespace dominus77\lightslider;
4
5
use yii\base\Widget;
6
use yii\helpers\Html;
7
use yii\helpers\Json;
8
use yii\helpers\ArrayHelper;
9
use yii\web\JsExpression;
10
use dominus77\lightslider\assets\SliderAsset;
11
use dominus77\lightslider\assets\GalleryAsset;
12
13
/**
14
 * Class Slider
15
 * Renders a JQuery LightSlider widget for Yii2.
16
 * @package dominus77\lightslider
17
 * @see http://sachinchoolur.github.io/lightslider/
18
 *
19
 * Render Slider
20
 * -------------------------------------------------
21
 * <?= \dominus77\lightslider\Slider::widget([
22
 *  'items' => ['Slide 1', 'Slide 2', 'Slide 3', 'Slide 4', 'Slide 5', 'Slide 6', 'Slide 7', '...'],
23
 *  'clientOptions' => [
24
 *      'item' => 3,
25
 *      'autoWidth' => false,
26
 *      'slideMove' => 1, // slidemove will be 1 if loop is true
27
 *      'slideMargin' => 10,
28
 *      //...
29
 *  ],
30
 *  'listOptions' => [], // Set <ul> options
31
 *  'itemsOptions' => [], // Set options <li> all
32
 * ]); ?>
33
 *
34
 * Integrate with lightGallery (http://sachinchoolur.github.io/lightGallery/)
35
 * -------------------------------------------------
36
 * <?= \dominus77\lightslider\Slider::widget([
37
 *  'id' => 'myGalleryID',
38
 *  'items' => [
39
 *      [
40
 *          'item' => \yii\helpers\Html::img(Yii::getAlias('@web/uploads/img/image1.jpg')),
41
 *          'options' => [
42
 *              'data-thumb' => \Yii::getAlias('@web/uploads/img/thumb/image1.jpg'),
43
 *              'data-src' => \Yii::getAlias('@web/uploads/img/largeImage1.jpg'),
44
 *              //...
45
 *          ]
46
 *      ],
47
 *      [
48
 *          'item' => \yii\helpers\Html::img(Yii::getAlias('@web/uploads/img/image2.jpg')),
49
 *          'options' => [
50
 *              'data' => [
51
 *                  'thumb' => \Yii::getAlias('@web/uploads/img/thumb/image2.jpg'),
52
 *                  'src' => \Yii::getAlias('@web/uploads/img/largeImage2.jpg'),
53
 *              ],
54
 *              //...
55
 *          ]
56
 *      ],
57
 *      //...
58
 *  ],
59
 *  'clientOptions' => [
60
 *      'gallery' => true,
61
 *      'item' => 1,
62
 *      'loop' => true,
63
 *      'thumbItem' => 9,
64
 *      'slideMargin' => 0,
65
 *      'enableDrag' => false,
66
 *      'currentPagerPosition' => 'left',
67
 *      'onSliderLoad' => new \yii\web\JsExpression("function(el) {
68
 *           el.lightGallery({
69
 *               selector: '#myGalleryID .lslide'
70
 *          });
71
 *      }"),
72
 *      //...
73
 *  ],
74
 *  //...
75
 * ]); ?>
76
 */
77
class Slider extends Widget
78
{
79
    /**
80
     * @var string
81
     * 'id' => 'myId',
82
     */
83
    public $id = '';
84
85
    /**
86
     * Set Items
87
     * @var array
88
     *
89
     * Example 1: Indexed items array
90
     * ---------------------------------
91
     * $items = [
92
     *  '<h1>Slide 1</h1><p>Text 1</p>',
93
     *  '<h1>Slide 2</h1><p>Text 2</p>',
94
     *  '...',
95
     * ]
96
     *
97
     * Example 2: Associative items array
98
     * ---------------------------------
99
     * $items = [
100
     *  [
101
     *      'item' => '<h1>Slide 1</h1><p>Text 1</p>',
102
     *      'options' => [
103
     *          'class' => 'text-success',
104
     *      ]
105
     *  ],
106
     *  [
107
     *      'item' => '<h1>Slide 2</h1><p>Text 2</p>',
108
     *      'options' => [
109
     *          'class' => 'text-danger',
110
     *      ]
111
     *  ],
112
     *  //...
113
     * ]
114
     */
115
    public $items = [];
116
117
    /**
118
     * @var array
119
     * @see http://sachinchoolur.github.io/lightslider/
120
     */
121
    public $clientOptions = [];
122
123
    /**
124
     * List Options
125
     * @var array
126
     *
127
     * Usage:
128
     * 'listOptions' => ['class' => 'myListCssClass']
129
     * Result:
130
     * <ul class="myListCssClass">...</ul>
131
     */
132
    public $listOptions = [];
133
134
    /**
135
     * Global Items options
136
     * @var array
137
     *
138
     * Usage:
139
     * 'itemsOptions' => ['class' => 'myItemsCssClass']
140
     * Result:
141
     * <li class="myItemsCssClass">...</li>
142
     */
143
    public $itemsOptions = [];
144
145
    /**
146
     * @var string
147
     */
148
    private $_selector = '';
149
150
    /**
151
     * Initializes the widget.
152
     */
153 2
    public function init()
154
    {
155 2
        parent::init();
156 2
        $this->_selector = $this->id ? $this->id : $this->getId();
157 2
        $this->listOptions['id'] = $this->_selector;
158 2
    }
159
160
    /**
161
     * Renders widget
162
     * @return string|void
163
     */
164 2
    public function run()
165
    {
166 2
        if (!empty($this->items)) {
167 2
            $this->registerAssets();
168 2
            $this->renderList();
169
        }
170 2
    }
171
172
    /**
173
     * Render List
174
     */
175 2
    public function renderList()
176
    {
177 2
        echo PHP_EOL . Html::beginTag('ul', $this->listOptions) . PHP_EOL;
178 2
        if (ArrayHelper::isAssociative($this->items[0])) {
179 1
            $this->renderAssociativeItems();
180
        } else {
181 1
            $this->renderIndexedItems();
182
        }
183 2
        echo Html::endTag('ul') . PHP_EOL;
184 2
    }
185
186
    /**
187
     * Render Indexed array items
188
     */
189 1
    public function renderIndexedItems()
190
    {
191 1
        foreach ($this->items as $key => $item) {
192 1
            echo Html::tag('li', $item, $this->itemsOptions) . PHP_EOL;
193
        }
194 1
    }
195
196
    /**
197
     * Render Associative array items
198
     */
199 1
    public function renderAssociativeItems()
200
    {
201 1
        foreach ($this->items as $item) {
202 1
            $itemData = [];
203 1
            if (isset($item['options'])) {
204 1
                foreach ($item['options'] as $key => $data) {
205 1
                    $itemData[$key] = $data;
206
                }
207
            }
208 1
            $itemOptions = ArrayHelper::merge($itemData, $this->itemsOptions);
209 1
            echo Html::tag('li', $item['item'], $itemOptions) . PHP_EOL;
210
        }
211 1
    }
212
213
    /**
214
     * Register resource
215
     */
216 2
    public function registerAssets()
217
    {
218 2
        $options = Json::encode($this->clientOptions);
219 2
        $view = $this->getView();
220 2
        SliderAsset::register($view);
221 2
        if (isset($this->clientOptions['gallery']) && $this->clientOptions['gallery'] === true) {
222 1
            GalleryAsset::register($view);
223
        }
224 2
        $script = new JsExpression("
225 2
            var slider = $('#{$this->_selector}').lightSlider({$options});
226
        ");
227 2
        $view->registerJs($script, $view::POS_READY);
228 2
    }
229
}
230