Completed
Push — master ( b3e1cd...a6572a )
by Alexandr
01:52
created

Component::combineFrontMiddlewares()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 14
rs 9.2
cc 4
eloc 9
nc 8
nop 1
1
<?php
2
3
namespace Larrock\Core;
4
5
use Illuminate\Support\Collection;
6
use Larrock\Core\Plugins\PluginAnonsTrait;
7
use Larrock\Core\Plugins\PluginSeoTrait;
8
use Larrock\Core\Helpers\FormBuilder\FormCheckbox;
9
use Larrock\Core\Helpers\FormBuilder\FormInput;
10
use Illuminate\Database\Eloquent\Model;
11
use JsValidator;
12
use View;
13
14
class Component
15
{
16
    use PluginSeoTrait, PluginAnonsTrait;
17
18
    /** @var string */
19
    public $name;
20
21
    /** @var string */
22
    public $title;
23
24
    /** @var string */
25
    public $description;
26
27
    /** @var string */
28
    public $table;
29
30
    /** @var array */
31
    public $rows;
32
33
    /** @var array */
34
    public $customMediaConversions;
35
36
    /** @var Model */
37
    public $model;
38
39
    /** @var bool */
40
    public $active = TRUE;
41
42
    /** @var array */
43
    public $plugins_backend;
44
45
    /** @var array */
46
    public $plugins_front;
47
48
    /** @var array */
49
    public $settings;
50
51
    /** @var null|bool */
52
    public $searchable;
53
54
    /** @var array|Collection */
55
    public $tabs;
56
57
    /** @var array|Collection */
58
    public $tabs_data;
59
60
    /** @var mixed */
61
    public $valid;
62
63
    /** @return Component */
64
    public function getConfig()
65
    {
66
        return $this;
67
    }
68
69
    /** @return string */
70
    public function getName()
71
    {
72
        return $this->name;
73
    }
74
75
    /** @return string */
76
    public function getTitle()
77
    {
78
        return $this->title;
79
    }
80
81
    /** @return Model */
82
    public function getModel()
83
    {
84
        return new $this->model;
85
    }
86
87
    /** @return string */
88
    public function getModelName()
89
    {
90
        return $this->model;
91
    }
92
93
    /** @return string */
94
    public function getTable()
95
    {
96
        return $this->table;
97
    }
98
99
    /** @return array */
100
    public function getRows()
101
    {
102
        return $this->rows;
103
    }
104
105
    public function getValid()
106
    {
107
        return self::_valid_construct($this);
108
    }
109
110
    /**
111
     * @param array $rows
112
     * @return array
113
     */
114
    public function addFillableUserRows(array $rows)
115
    {
116
        $fillable_rows = $rows;
117
        if($this->rows && \is_array($this->rows)){
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->rows of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
118
            foreach ($this->rows as $key => $row){
119
                if($row->fillable){
120
                    $fillable_rows[] = $key;
121
                }
122
            }
123
        }
124
        return $fillable_rows;
125
    }
126
127
    /**
128
     * Получение fillable-полей модели компонента из его конфига
129
     * @return array
130
     */
131
    public function getFillableRows()
132
    {
133
        $fillable_rows = [];
134
        foreach ($this->rows as $key => $row){
135
            if($row->fillable){
136
                $fillable_rows[] = $key;
137
            }
138
        }
139
        return $fillable_rows;
140
    }
141
142
    /**
143
     * Добавление поля указания веса
144
     * @return $this
145
     */
146
    public function addPosition()
147
    {
148
        $row = new FormInput('position', 'Вес');
149
        $this->rows['position'] = $row->setTab('main', 'Дата, вес, активность')->setValid('integer')
150
            ->setDefaultValue(0)->setInTableAdminEditable()->setFillable()->setCssClassGroup('uk-width-1-3');
151
        return $this;
152
    }
153
154
    /**
155
     * Добавления поля для указания опубликованности
156
     * @return $this
157
     */
158
    public function addActive()
159
    {
160
        $row = new FormCheckbox('active', 'Опубликован');
161
        $this->rows['active'] = $row->setTab('main', 'Дата, вес, активность')
162
            ->setValid('integer|max:1')->setDefaultValue(1)->setInTableAdminEditable()->setFillable()
163
            ->setCssClassGroup('uk-width-1-3');
164
        return $this;
165
    }
166
167
    /**
168
     * Алиас для добавления полей веса и активности
169
     * @return $this
170
     */
171
    public function addPositionAndActive()
172
    {
173
        $this->addPosition();
174
        $this->addActive();
175
        return $this;
176
    }
177
178
    /**
179
     * Получение конфигурации компонента
180
     * Вывод в шаблон переменной $app с конфигом компонента, переменной $validator для JSValidation
181
     * @return $this
182
     */
183
    public function shareConfig()
184
    {
185
        $this->tabs = collect();
186
        $this->tabs_data = collect();
187
        View::share('app', $this);
188
        $this->valid = self::_valid_construct($this);
189
        View::share('validator', JsValidator::make($this->valid));
190
        return $this;
191
    }
192
193
    /**
194
     * Метод объявления использования middleware для компонентов.
195
     * Вызывается из конструктора класса контроллера компонента через $this->middleware(Компонент::combineFrontMiddlewares());
196
     * @param null $user_middlewares
197
     * @return array
198
     */
199
    public function combineFrontMiddlewares($user_middlewares = NULL)
200
    {
201
        $middleware = ['web', 'GetSeo', 'AddMenuFront', 'AddBlocksTemplate'];
202
        if($config = config('larrock.middlewares.front')){
203
            $middleware = array_merge($middleware, $config);
204
        }
205
        if(file_exists(base_path(). '/vendor/fanamurov/larrock-discount')){
206
            $middleware[] = 'DiscountsShare';
207
        }
208
        if($user_middlewares){
209
            $middleware = array_merge($middleware, $user_middlewares);
210
        }
211
        return array_unique($middleware);
212
    }
213
214
    /**
215
     * Метод объявления использования middleware для компонентов.
216
     * Вызывается из конструктора класса контроллера компонента через $this->middleware(Компонент::combineAdminMiddlewares());
217
     * @param null $user_middlewares
218
     * @return array
219
     */
220
    public function combineAdminMiddlewares($user_middlewares = NULL)
221
    {
222
        $middleware = ['web', 'level:2', 'LarrockAdminMenu', 'SiteSearchAdmin'];
223
        if($config = config('larrock.middlewares.admin')){
224
            $middleware = array_merge($middleware, $config);
225
        }
226
        if($user_middlewares){
227
            $middleware = array_merge($middleware, $user_middlewares);
228
        }
229
        return array_unique($middleware);
230
    }
231
232
    /**
233
     * Подключение плагина загрузки фото
234
     * @return $this
235
     */
236
    public function addPluginImages()
237
    {
238
        $this->plugins_backend['images'] = 'images';
239
        return $this;
240
    }
241
242
    /**
243
     * Метод для добавления в модель новых пресетов картинок для Medialibrary
244
     * @param array $conversions
245
     */
246
    public function addCustomMediaConversions(array $conversions)
247
    {
248
        $this->customMediaConversions = $conversions;
249
    }
250
251
    /**
252
     * Подключение плагина загрузки файлов
253
     * @return $this
254
     */
255
    public function addPluginFiles()
256
    {
257
        $this->plugins_backend['files'] = 'files';
258
        return $this;
259
    }
260
261
    /**
262
     * Вспомогательный метод построения правил валидации из конфига полей компонента
263
     * @param array|object $config
264
     * @param string $action create|update
265
     * @param null|string|integer   $id
266
     * @return array
267
     */
268
    public static function _valid_construct($config, $action = 'create', $id = NULL)
269
    {
270
        $rules = array();
271
        if(isset($config->rows)){
272
            foreach($config->rows as $rows_value){
273
                if( !empty($rows_value->valid)){
274
                    $rules[$rows_value->name] = $rows_value->valid;
275
                    if($action === 'update'){
276
                        $rules[$rows_value->name] = str_replace(':id', $id, $rules[$rows_value->name]);
277
                    }else{
278
                        $rules[$rows_value->name] = str_replace(',:id', '', $rules[$rows_value->name]);
279
                    }
280
                }
281
            }
282
        }
283
        return $rules;
284
    }
285
286
    /**
287
     * Вывод данных полей компонента для табов
288
     * @param Model $data
289
     * @return $this
290
     */
291
    public function tabbable($data)
292
    {
293
        if(isset($this->plugins_backend['seo']) && $plugin_data = $data->getSeo){
294
            //Присоединяем данные от плагинов
295
            $this->rows['seo_title']->default = $plugin_data->seo_title;
296
            $this->rows['seo_description']->default = $plugin_data->seo_description;
297
            $this->rows['seo_keywords']->default = $plugin_data->seo_keywords;
298
        }
299
300
        $this->tabs = collect();
301
        $this->tabs_data = collect();
302
        foreach($this->rows as $row_value){
303
            $this->tabs->put(key($row_value->tab), current($row_value->tab));
304
305
            if( !isset($this->tabs_data[key($row_value->tab)])){
306
                $this->tabs_data->put(key($row_value->tab), $row_value->setData($data));
307
            }else{
308
                $this->tabs_data[key($row_value->tab)] .= $row_value->setData($data);
309
            }
310
        }
311
        return $this;
312
    }
313
314
    /**
315
     * Перезапись конфига компонента (например внутри контроллера)
316
     * @param $option
317
     * @param $config
318
     * @return $this
319
     */
320
    public function overrideComponent($option, $config)
321
    {
322
        $this->{$option} = $config;
323
        return $this;
324
    }
325
326
    /**
327
     * Разрешить поиск по материалам компонента
328
     * @return $this
329
     */
330
    public function isSearchable()
331
    {
332
        $this->searchable = TRUE;
333
        return $this;
334
    }
335
336
    /**
337
     * Формирование пунктов меню компонента в админке
338
     * @return string
339
     */
340
    public function renderAdminMenu()
341
    {
342
        return '';
343
    }
344
345
    /**
346
     * Метод встаивания данных компонента в карту сайта sitemap.xml
347
     * @return null
348
     */
349
    public function createSitemap()
350
    {
351
        return NULL;
352
    }
353
354
    /**
355
     * Метод встаивания данных компонента в rss-feed
356
     * @return null
357
     */
358
    public function createRSS()
359
    {
360
        return NULL;
361
    }
362
363
    /**
364
     * Данные для поиска по материалам компонента
365
     * @param null|bool $admin Если TRUE - для поиска будут доступны вообще все элементы (не только опубликованные)
366
     * @return null
367
     */
368
    public function search($admin = NULL)
0 ignored issues
show
Unused Code introduced by
The parameter $admin is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
369
    {
370
        return NULL;
371
    }
372
}