diff --git a/README.md b/README.md index 28c7ebb..8d17a8d 100644 --- a/README.md +++ b/README.md @@ -684,3 +684,16 @@ DB::table('brands')->insert(['UF_NAME' => 'Nike']); 2. Скопировать дефолтные вьюшки из [https://github.com/laravel/framework/tree/master/src/Illuminate/Pagination/resources/views](https://github.com/laravel/framework/tree/master/src/Illuminate/Pagination/resources/views) в `local/views/pagination` После этого вьюшки можно модифицировать или создавать новые. + +## Активность элементов в D7Model/EloquentModel + +В инфоблоках битрикса есть поле ACTIVE = 'Y'/'N', фильтрация по которому очень часто используется. +В хайлоадблоках и кастомных таблицах такого поля по-умолчанию нет, однако пакет предоставляет trait который помогает в создании подобной функциональности. +Как это работает: +1. Добавляем поле UF_DEACTIVATED_AT типа datetime в таблицу/хайлоадблок. +2. Добавляем в D7Model/EloquentModel трейт `use \Arrilot\BitrixModels\Models\Traits\DeactivationTrait;` +3. Теперь в модели доступны следуюющие методы: + 3.1 `$model->deactivate()` и `$model->activate()` - деактивирует или активирует элемент в БД. + 3.2 `$model->markForDeactivation()` и `$model->markForActivation()` - тоже самое, но только меняет php переменную, не выполняет ->save(). Полезно если вместе с активацией нужно сделать и другие изменения в таблице и не хочется делать дополнительный запрос в БД. + 3.3 Скоупы `->active()` и `->deactivated()`. Например `SomeD7Model::query()->active()->getList()`. + diff --git a/src/Models/Traits/DeactivationTrait.php b/src/Models/Traits/DeactivationTrait.php new file mode 100644 index 0000000..7138dfd --- /dev/null +++ b/src/Models/Traits/DeactivationTrait.php @@ -0,0 +1,67 @@ +markForActivation()->save(); + } + + /** + * Deactivate element. + */ + public function deactivate() + { + $this->markForDeactivation()->save(); + } + + /** + * @param $query + * @return mixed + */ + public function scopeActive($query) + { + return $this instanceof D7Model + ? $query->filter(['==UF_DEACTIVATED_AT' => null]) + : $query->whereNull('UF_DEACTIVATED_AT'); + } + + /** + * @param $query + * @return mixed + */ + public function scopeDeactivated($query) + { + return $this instanceof D7Model + ? $query->filter(['!==UF_DEACTIVATED_AT' => null]) + : $query->whereNotNull('UF_DEACTIVATED_AT'); + } + + /** + * @return $this + */ + public function markForActivation() + { + $this['UF_DEACTIVATED_AT'] = null; + + return $this; + } + + /** + * @return $this + */ + public function markForDeactivation() + { + $this['UF_DEACTIVATED_AT'] = $this instanceof D7Model ? new DateTime() : date('Y-m-d H:i:s'); + + return $this; + } +}