%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
<?php
namespace mdm\admin\models;
use Yii;
use mdm\admin\components\Configs;
use yii\db\Query;
/**
* This is the model class for table "menu".
*
* @property integer $id Menu id(autoincrement)
* @property string $name Menu name
* @property integer $parent Menu parent
* @property string $route Route for this menu
* @property integer $order Menu order
* @property string $data Extra information for this menu
*
* @property Menu $menuParent Menu parent
* @property Menu[] $menus Menu children
*
* @author Misbahul D Munir <misbahuldmunir@gmail.com>
* @since 1.0
*/
class Menu extends \yii\db\ActiveRecord
{
public $parent_name;
/**
* @inheritdoc
*/
public static function tableName()
{
return Configs::instance()->menuTable;
}
/**
* @inheritdoc
*/
public static function getDb()
{
if (Configs::instance()->db !== null) {
return Configs::instance()->db;
} else {
return parent::getDb();
}
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['name'], 'required'],
[['parent_name'], 'in',
'range' => static::find()->select(['name'])->column(),
'message' => 'Menu "{value}" not found.'],
[['parent', 'route', 'data', 'order'], 'default'],
[['parent'], 'filterParent', 'when' => function() {
return !$this->isNewRecord;
}],
[['order'], 'integer'],
[['route'], 'in',
'range' => static::getSavedRoutes(),
'message' => 'Route "{value}" not found.']
];
}
/**
* Use to loop detected.
*/
public function filterParent()
{
$parent = $this->parent;
$db = static::getDb();
$query = (new Query)->select(['parent'])
->from(static::tableName())
->where('[[id]]=:id');
while ($parent) {
if ($this->id == $parent) {
$this->addError('parent_name', 'Loop detected.');
return;
}
$parent = $query->params([':id' => $parent])->scalar($db);
}
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('rbac-admin', 'ID'),
'name' => Yii::t('rbac-admin', 'Name'),
'parent' => Yii::t('rbac-admin', 'Parent'),
'parent_name' => Yii::t('rbac-admin', 'Parent Name'),
'route' => Yii::t('rbac-admin', 'Route'),
'order' => Yii::t('rbac-admin', 'Order'),
'data' => Yii::t('rbac-admin', 'Data'),
];
}
/**
* Get menu parent
* @return \yii\db\ActiveQuery
*/
public function getMenuParent()
{
return $this->hasOne(Menu::className(), ['id' => 'parent']);
}
/**
* Get menu children
* @return \yii\db\ActiveQuery
*/
public function getMenus()
{
return $this->hasMany(Menu::className(), ['parent' => 'id']);
}
private static $_routes;
/**
* Get saved routes.
* @return array
*/
public static function getSavedRoutes()
{
if (self::$_routes === null) {
self::$_routes = [];
foreach (Configs::authManager()->getPermissions() as $name => $value) {
if ($name[0] === '/' && substr($name, -1) != '*') {
self::$_routes[] = $name;
}
}
}
return self::$_routes;
}
public static function getMenuSource()
{
$tableName = static::tableName();
return (new \yii\db\Query())
->select(['m.id', 'm.name', 'm.route', 'parent_name' => 'p.name'])
->from(['m' => $tableName])
->leftJoin(['p' => $tableName], '[[m.parent]]=[[p.id]]')
->all(static::getDb());
}
}