128 lines
3.7 KiB
PHP
128 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace kernel\modules\menu\service;
|
|
|
|
use Exception;
|
|
use kernel\FormModel;
|
|
use kernel\helpers\Debug;
|
|
use kernel\models\Menu;
|
|
use kernel\modules\menu\models\forms\CreateMenuForm;
|
|
use kernel\Request;
|
|
|
|
class MenuService
|
|
{
|
|
public function create(FormModel $form_model): false|Menu
|
|
{
|
|
$model = new Menu();
|
|
$model->parent_id = $form_model->getItem('parent_id') ?? 0;
|
|
$model->icon_file = $form_model->getItem('icon_file');
|
|
$model->icon_font = $form_model->getItem('icon_font');
|
|
$model->label = $form_model->getItem('label');
|
|
$model->url = $form_model->getItem('url');
|
|
$model->status = $form_model->getItem('status') ?? 1;
|
|
$model->slug = $form_model->getItem('slug');
|
|
$model->priority = $form_model->getItem('priority') ?? 5;
|
|
if ($model->save()){
|
|
return $model;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @throws Exception
|
|
*/
|
|
public function createItem(array $item): false|Menu
|
|
{
|
|
$model = new CreateMenuForm();
|
|
$model->load($item);
|
|
if (!$model->validate()){
|
|
throw new Exception('Ошибка создания пункта меню');
|
|
}
|
|
if ($model->getItem("parent_slug")){
|
|
$parent = $this->getBySlug($model->getItem("parent_slug"));
|
|
if ($parent){
|
|
$model->setItem("parent_id", $parent->id);
|
|
}
|
|
else {
|
|
$model->setItem("parent_id", 0);
|
|
}
|
|
}
|
|
|
|
return $this->create($model);
|
|
}
|
|
|
|
public function removeItemBySlug(string $slug)
|
|
{
|
|
return Menu::where("slug", $slug)->delete();
|
|
}
|
|
|
|
public function getBySlug(string $slug)
|
|
{
|
|
return Menu::where("slug", $slug)->first();
|
|
}
|
|
|
|
public function update(FormModel $form_model, Menu $menuItem): false|Menu
|
|
{
|
|
$menuItem->parent_id = $form_model->getItem('parent_id');
|
|
$menuItem->icon_file = $form_model->getItem('icon_file');
|
|
$menuItem->icon_font = $form_model->getItem('icon_font');
|
|
$menuItem->label = $form_model->getItem('label');
|
|
$menuItem->url = $form_model->getItem('url');
|
|
$menuItem->status = $form_model->getItem('status');
|
|
$menuItem->slug = $form_model->getItem('slug');
|
|
$menuItem->priority = $form_model->getItem('priority') ?? 5;
|
|
if ($menuItem->save()){
|
|
return $menuItem;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static function createLabelArr(): array
|
|
{
|
|
$labelArr[0] = "Корневой пункт меню";
|
|
foreach (Menu::where("parent_id", 0)->get()->toArray() as $menuItem) {
|
|
$labelArr[$menuItem['id']] = $menuItem['label'];
|
|
}
|
|
if (!empty($labelArr)) {
|
|
return $labelArr;
|
|
}
|
|
return [];
|
|
}
|
|
public static function getChild(int $id)
|
|
{
|
|
$collection = Menu::where("parent_id", $id)->get()->sortBy('priority');
|
|
if (!$collection->isEmpty()){
|
|
return $collection;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static function hasActiveChild(int $id): bool
|
|
{
|
|
$child = self::getChild($id);
|
|
if (!$child->isEmpty()){
|
|
foreach ($child as $item){
|
|
if (strripos(Request::getUrlPath(), $item->url) !== false) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static function isActive($url): bool
|
|
{
|
|
if ($url === Request::getUrlPath()){
|
|
return true;
|
|
} else {
|
|
if (strripos(\kernel\Request::getUrlPath(), ($url . "/page")) !== false) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
} |