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.
		
		
		
		
		
			
		
			
				
					
					
						
							155 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
	
	
							155 lines
						
					
					
						
							3.5 KiB
						
					
					
				<?php | 
						|
/** | 
						|
 * Created by Error202 | 
						|
 * Date: 09.07.2018 | 
						|
 */ | 
						|
 | 
						|
namespace core\entities\menu; | 
						|
 | 
						|
use core\behaviors\LanguageBehavior; | 
						|
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 | 
						|
 * | 
						|
 * @method ActiveRecord findTranslation(string $language) | 
						|
 * @method void saveTranslations($translations) | 
						|
 * | 
						|
 * @property ActiveRecord[] translations | 
						|
 * @property ActiveRecord[] translation | 
						|
 * | 
						|
 * @property MenuItem $parent | 
						|
 * @property MenuItem[] $children | 
						|
 * @property Menu $menu | 
						|
 */ | 
						|
 | 
						|
class MenuItem extends ActiveRecord | 
						|
{ | 
						|
	public $_form; | 
						|
 | 
						|
	public static function create($form, $menu_id, $parent_id, $target, $css, $style, $module, $url, $url_params): self | 
						|
	{ | 
						|
		$menu = new static(); | 
						|
		$menu->menu_id = $menu_id; | 
						|
		$menu->parent_id = $parent_id; | 
						|
		$menu->target = $target; | 
						|
		$menu->css = $css; | 
						|
		$menu->style = $style; | 
						|
		$menu->module = $module; | 
						|
		$menu->url = $url; | 
						|
		$menu->url_params = $url_params; | 
						|
		$menu->_form = $form; | 
						|
		return $menu; | 
						|
	} | 
						|
 | 
						|
	public function edit($form, $menu_id, $parent_id, $target, $css, $style, $module, $url, $url_params): void | 
						|
	{ | 
						|
		$this->menu_id = $menu_id; | 
						|
		$this->parent_id = $parent_id; | 
						|
		$this->target = $target; | 
						|
		$this->css = $css; | 
						|
		$this->style = $style; | 
						|
		$this->module = $module; | 
						|
		$this->url = $url; | 
						|
		$this->_form = $form; | 
						|
		$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']); | 
						|
	} | 
						|
 | 
						|
	public function getMenu() | 
						|
	{ | 
						|
		return $this->hasOne(Menu::class, ['id' => 'menu_id']); | 
						|
	} | 
						|
 | 
						|
	public function behaviors() | 
						|
	{ | 
						|
		return [ | 
						|
			[ | 
						|
				'class' => LanguageBehavior::class, | 
						|
				'virtualClassName' => 'MenuItemVirtualTranslate', | 
						|
				'translatedLanguages' => \Yii::$app->params['translatedLanguages'], | 
						|
				'relativeField' => 'menu_item_id', | 
						|
				'tableName' => "{{%menu_items_lng}}", | 
						|
				'attributes' => ['name', 'title_attr'], | 
						|
				'defaultLanguage' => \Yii::$app->params['defaultLanguage'], | 
						|
			], | 
						|
		]; | 
						|
	} | 
						|
} |