You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
2.9 KiB
127 lines
2.9 KiB
<?php |
|
/** |
|
* Created by Error202 |
|
* Date: 09.07.2018 |
|
*/ |
|
|
|
namespace core\entities\menu; |
|
|
|
use yii\db\ActiveRecord; |
|
use yii\helpers\Json; |
|
use yii\helpers\Url; |
|
|
|
/** |
|
* Class MenuItem |
|
* @package core\entities\menu |
|
* |
|
* @property integer $id |
|
* @property integer $menu_id |
|
* @property integer $parent_id |
|
* @property string $name |
|
* @property string $title_attr |
|
* @property string $target |
|
* @property string $css |
|
* @property string $style |
|
* @property string $module |
|
* @property string $url |
|
* @property string $url_params |
|
* @property integer $sort |
|
* |
|
* @property MenuItem $parent |
|
* @property MenuItem[] $children |
|
*/ |
|
|
|
class MenuItem extends ActiveRecord |
|
{ |
|
public static function create($menu_id, $parent_id, $name, $title_attr, $target, $css, $style, $module, $url, $url_params): self |
|
{ |
|
$menu = new static(); |
|
$menu->menu_id = $menu_id; |
|
$menu->parent_id = $parent_id; |
|
$menu->name = $name; |
|
$menu->title_attr = $title_attr; |
|
$menu->target = $target; |
|
$menu->css = $css; |
|
$menu->style = $style; |
|
$menu->module = $module; |
|
$menu->url = $url; |
|
$menu->url_params = $url_params; |
|
return $menu; |
|
} |
|
|
|
public function edit($menu_id, $parent_id, $name, $title_attr, $target, $css, $style, $module, $url, $url_params): void |
|
{ |
|
$this->menu_id = $menu_id; |
|
$this->parent_id = $parent_id; |
|
$this->name = $name; |
|
$this->title_attr = $title_attr; |
|
$this->target = $target; |
|
$this->css = $css; |
|
$this->style = $style; |
|
$this->module = $module; |
|
$this->url = $url; |
|
$this->url_params = $url_params; |
|
} |
|
|
|
public static function tableName(): string |
|
{ |
|
return '{{%menu_items}}'; |
|
} |
|
|
|
/*public function behaviors() |
|
{ |
|
return [ |
|
[ |
|
'class' => SortableBehavior::class, |
|
'query' => ['menu_id'], |
|
], |
|
]; |
|
}*/ |
|
|
|
public function beforeSave( $insert ) { |
|
if (parent::beforeSave($insert)) { |
|
if (!isset($this->sort)) { |
|
$count = MenuItem::find() |
|
->andWhere( [ 'menu_id' => $this->menu_id ] ) |
|
->andWhere( [ 'parent_id' => $this->parent_id ] ) |
|
->count(); |
|
$this->sort = $count; |
|
} |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
public function beforeDelete(){ |
|
foreach($this->children as $child) { |
|
$child->delete(); |
|
} |
|
return parent::beforeDelete(); |
|
} |
|
|
|
public function getUrl(): string |
|
{ |
|
$params = $this->url_params ? Json::decode($this->url_params, true) : []; |
|
return Url::to(array_merge([$this->url], $params)); |
|
} |
|
|
|
public function isActive(): bool |
|
{ |
|
return \Yii::$app->request->getUrl() == $this->getUrl(); |
|
} |
|
|
|
public function getChildren() |
|
{ |
|
return $this->hasMany(MenuItem::class, ['parent_id' => 'id'])->orderBy(['sort' => SORT_ASC]); |
|
} |
|
|
|
public function hasChildren(): bool |
|
{ |
|
return $this->hasMany(MenuItem::class, ['parent_id' => 'id'])->orderBy(['sort' => SORT_ASC])->count() > 0 ? true : false; |
|
} |
|
|
|
public function getParent() |
|
{ |
|
return $this->hasOne(MenuItem::class, ['id' => 'parent_id']); |
|
} |
|
} |