Completed
Push — master ( 0d4856...a5727b )
by Alexandr
02:34
created

Component::setRow()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
1
<?php
2
3
namespace Larrock\Core;
4
5
use Illuminate\Support\Collection;
6
use Larrock\Core\Helpers\FormBuilder\FBElement;
7
use Larrock\Core\Plugins\PluginAnonsTrait;
8
use Larrock\Core\Plugins\PluginSeoTrait;
9
use Larrock\Core\Helpers\FormBuilder\FormCheckbox;
10
use Larrock\Core\Helpers\FormBuilder\FormInput;
11
use Illuminate\Database\Eloquent\Model;
12
use JsValidator;
13
use View;
14
15
class Component
16
{
17
    use PluginSeoTrait, PluginAnonsTrait;
18
19
    /** @var string */
20
    public $name;
21
22
    /** @var string */
23
    public $title;
24
25
    /** @var string */
26
    public $description;
27
28
    /** @var string */
29
    public $table;
30
31
    /** @var array */
32
    public $rows;
33
34
    /** @var array */
35
    public $customMediaConversions;
36
37
    /** @var Model */
38
    public $model;
39
40
    /** @var bool */
41
    public $active = TRUE;
42
43
    /** @var array */
44
    public $plugins_backend;
45
46
    /** @var array */
47
    public $plugins_front;
48
49
    /** @var array */
50
    public $settings;
51
52
    /** @var null|bool */
53
    public $searchable;
54
55
    /** @var array|Collection */
56
    public $tabs;
57
58
    /** @var array|Collection */
59
    public $tabs_data;
60
61
    /** @var mixed */
62
    public $valid;
63
64
    /** @return Component */
65
    public function getConfig()
66
    {
67
        return $this;
68
    }
69
70
    /** @return string */
71
    public function getName() :string
72
    {
73
        return $this->name;
74
    }
75
76
    /** @return string */
77
    public function getTitle() :string
78
    {
79
        return $this->title;
80
    }
81
82
    /** @return Model */
83
    public function getModel()
84
    {
85
        return new $this->model;
86
    }
87
88
    /** @return string */
89
    public function getModelName()
90
    {
91
        return $this->model;
92
    }
93
94
    /** @return string */
95
    public function getTable() :string
96
    {
97
        return $this->table;
98
    }
99
100
    /**
101
     * @param FBElement $FBElement
102
     * @return Component
103
     */
104
    public function setRow($FBElement)
105
    {
106
        $this->rows[$FBElement->name] = $FBElement;
107
        return $this;
108
    }
109
110
    /** @return array */
111
    public function getRows()
112
    {
113
        return $this->rows;
114
    }
115
116
    public function getValid()
117
    {
118
        return self::_valid_construct($this);
119
    }
120
121
    /**
122
     * @param array $rows
123
     * @return array
124
     */
125
    public function addFillableUserRows(array $rows)
126
    {
127
        $fillable_rows = $rows;
128
        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...
129
            foreach ($this->rows as $key => $row){
130
                if($row->fillable){
131
                    $fillable_rows[] = $key;
132
                }
133
            }
134
        }
135
        return $fillable_rows;
136
    }
137
138
    /**
139
     * Получение fillable-полей модели компонента из его конфига
140
     * @return array
141
     */
142
    public function getFillableRows()
143
    {
144
        $fillable_rows = [];
145
        foreach ($this->rows as $key => $row){
146
            if($row->fillable){
147
                $fillable_rows[] = $key;
148
            }
149
        }
150
        return $fillable_rows;
151
    }
152
153
    /**
154
     * Добавление поля указания веса
155
     * @return $this
156
     */
157
    public function addPosition()
158
    {
159
        $row = new FormInput('position', 'Вес');
160
        $this->rows['position'] = $row->setTab('main', 'Дата, вес, активность')->setValid('integer')
161
            ->setDefaultValue(0)->setInTableAdminEditable()->setFillable()->setCssClassGroup('uk-width-1-3');
162
        return $this;
163
    }
164
165
    /**
166
     * Добавления поля для указания опубликованности
167
     * @return $this
168
     */
169
    public function addActive()
170
    {
171
        $row = new FormCheckbox('active', 'Опубликован');
172
        $this->rows['active'] = $row->setTab('main', 'Дата, вес, активность')
173
            ->setValid('integer|max:1')->setDefaultValue(1)->setInTableAdminEditable()->setFillable()
174
            ->setCssClassGroup('uk-width-1-3');
175
        return $this;
176
    }
177
178
    /**
179
     * Алиас для добавления полей веса и активности
180
     * @return $this
181
     */
182
    public function addPositionAndActive()
183
    {
184
        $this->addPosition();
185
        $this->addActive();
186
        return $this;
187
    }
188
189
    /**
190
     * Получение конфигурации компонента
191
     * Вывод в шаблон переменной $app с конфигом компонента, переменной $validator для JSValidation
192
     * @return $this
193
     */
194
    public function shareConfig()
195
    {
196
        $this->tabs = collect();
197
        $this->tabs_data = collect();
198
        View::share('app', $this);
199
        $this->valid = self::_valid_construct($this);
200
        View::share('validator', JsValidator::make($this->valid));
201
        return $this;
202
    }
203
204
    /**
205
     * Метод объявления использования middleware для компонентов.
206
     * Вызывается из конструктора класса контроллера компонента через $this->middleware(Компонент::combineFrontMiddlewares());
207
     * @param null $user_middlewares
208
     * @return array
209
     */
210
    public function combineFrontMiddlewares($user_middlewares = NULL)
211
    {
212
        $middleware = ['web', 'GetSeo', 'AddMenuFront', 'AddBlocksTemplate'];
213
        if($config = config('larrock.middlewares.front')){
214
            $middleware = array_merge($middleware, $config);
215
        }
216
        if(file_exists(base_path(). '/vendor/fanamurov/larrock-discount')){
217
            $middleware[] = 'DiscountsShare';
218
        }
219
        if($user_middlewares){
220
            $middleware = array_merge($middleware, $user_middlewares);
221
        }
222
        return array_unique($middleware);
223
    }
224
225
    /**
226
     * Метод объявления использования middleware для компонентов.
227
     * Вызывается из конструктора класса контроллера компонента через $this->middleware(Компонент::combineAdminMiddlewares());
228
     * @param null $user_middlewares
229
     * @return array
230
     */
231
    public function combineAdminMiddlewares($user_middlewares = NULL)
232
    {
233
        $middleware = ['web', 'level:2', 'LarrockAdminMenu', 'SiteSearchAdmin'];
234
        if($config = config('larrock.middlewares.admin')){
235
            $middleware = array_merge($middleware, $config);
236
        }
237
        if($user_middlewares){
238
            $middleware = array_merge($middleware, $user_middlewares);
239
        }
240
        return array_unique($middleware);
241
    }
242
243
    /**
244
     * Подключение плагина загрузки фото
245
     * @return $this
246
     */
247
    public function addPluginImages()
248
    {
249
        $this->plugins_backend['images'] = 'images';
250
        return $this;
251
    }
252
253
    /**
254
     * Метод для добавления в модель новых пресетов картинок для Medialibrary
255
     * @param array $conversions
256
     */
257
    public function addCustomMediaConversions(array $conversions)
258
    {
259
        $this->customMediaConversions = $conversions;
260
    }
261
262
    /**
263
     * Подключение плагина загрузки файлов
264
     * @return $this
265
     */
266
    public function addPluginFiles()
267
    {
268
        $this->plugins_backend['files'] = 'files';
269
        return $this;
270
    }
271
272
    /**
273
     * Вспомогательный метод построения правил валидации из конфига полей компонента
274
     * @param array|object $config
275
     * @param string $action create|update
276
     * @param null|string|integer   $id
277
     * @return array
278
     */
279
    public static function _valid_construct($config, $action = 'create', $id = NULL)
280
    {
281
        $rules = array();
282
        if(isset($config->rows)){
283
            foreach($config->rows as $rows_value){
284
                if( !empty($rows_value->valid)){
285
                    $rules[$rows_value->name] = $rows_value->valid;
286
                    if($action === 'update'){
287
                        $rules[$rows_value->name] = str_replace(':id', $id, $rules[$rows_value->name]);
288
                    }else{
289
                        $rules[$rows_value->name] = str_replace(',:id', '', $rules[$rows_value->name]);
290
                    }
291
                }
292
            }
293
        }
294
        return $rules;
295
    }
296
297
    /**
298
     * Вывод данных полей компонента для табов
299
     * @param Model $data
300
     * @return $this
301
     */
302
    public function tabbable($data)
303
    {
304
        if(isset($this->plugins_backend['seo']) && $plugin_data = $data->getSeo){
305
            //Присоединяем данные от плагинов
306
            $this->rows['seo_title']->default = $plugin_data->seo_title;
307
            $this->rows['seo_description']->default = $plugin_data->seo_description;
308
            $this->rows['seo_keywords']->default = $plugin_data->seo_keywords;
309
        }
310
311
        $this->tabs = collect();
312
        $this->tabs_data = collect();
313
        foreach($this->rows as $row_value){
314
            $this->tabs->put(key($row_value->tab), current($row_value->tab));
315
316
            if( !isset($this->tabs_data[key($row_value->tab)])){
317
                $this->tabs_data->put(key($row_value->tab), $row_value->setData($data));
318
            }else{
319
                $this->tabs_data[key($row_value->tab)] .= $row_value->setData($data);
320
            }
321
        }
322
        return $this;
323
    }
324
325
    /**
326
     * Перезапись конфига компонента (например внутри контроллера)
327
     * @param $option
328
     * @param $config
329
     * @return $this
330
     */
331
    public function overrideComponent($option, $config)
332
    {
333
        $this->{$option} = $config;
334
        return $this;
335
    }
336
337
    /**
338
     * Разрешить поиск по материалам компонента
339
     * @return $this
340
     */
341
    public function isSearchable()
342
    {
343
        $this->searchable = TRUE;
344
        return $this;
345
    }
346
347
    /**
348
     * Формирование пунктов меню компонента в админке
349
     * @return string
350
     */
351
    public function renderAdminMenu()
352
    {
353
        return '';
354
    }
355
356
    /**
357
     * Метод встаивания данных компонента в карту сайта sitemap.xml
358
     * @return null
359
     */
360
    public function createSitemap()
361
    {
362
        return NULL;
363
    }
364
365
    /**
366
     * Метод встаивания данных компонента в rss-feed
367
     * @return null
368
     */
369
    public function createRSS()
370
    {
371
        return NULL;
372
    }
373
374
    /**
375
     * Данные для поиска по материалам компонента
376
     * @param null|bool $admin Если TRUE - для поиска будут доступны вообще все элементы (не только опубликованные)
377
     * @return null
378
     */
379
    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...
380
    {
381
        return NULL;
382
    }
383
}