Menu.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. namespace common\modules\rbac\models;
  3. use common\behaviors\CacheInvalidateBehavior;
  4. use common\behaviors\PositionBehavior;
  5. use common\modules\rbac\components\Configs;
  6. use common\modules\rbac\components\MenuHelper;
  7. use Yii;
  8. use yii\helpers\Html;
  9. /**
  10. * This is the model class for table "menu".
  11. *
  12. * @property int $id Menu id(autoincrement)
  13. * @property string $name Menu name
  14. * @property int $parent Menu parent
  15. * @property string $route Route for this menu
  16. * @property int $order Menu order
  17. * @property string $data Extra information for this menu
  18. * @property Menu $menuParent Menu parent
  19. * @property Menu[] $menus Menu children
  20. *
  21. * @author Misbahul D Munir <misbahuldmunir@gmail.com>
  22. *
  23. * @since 1.0
  24. */
  25. class Menu extends \yii\db\ActiveRecord
  26. {
  27. public $parent_name;
  28. /**
  29. * {@inheritdoc}
  30. */
  31. public static function tableName()
  32. {
  33. return Configs::instance()->menuTable;
  34. }
  35. /**
  36. * {@inheritdoc}
  37. */
  38. public static function getDb()
  39. {
  40. if (Configs::instance()->db !== null) {
  41. return Configs::instance()->db;
  42. } else {
  43. return parent::getDb();
  44. }
  45. }
  46. public function behaviors()
  47. {
  48. return [
  49. [
  50. 'class' => PositionBehavior::className(),
  51. 'positionAttribute' => 'order',
  52. 'groupAttributes' => [
  53. 'parent' // multiple lists varying by 'parent'
  54. ],
  55. ],
  56. [
  57. 'class' => CacheInvalidateBehavior::className(),
  58. 'tags' => [
  59. MenuHelper::CACHE_TAG
  60. ]
  61. ]
  62. ];
  63. }
  64. /**
  65. * {@inheritdoc}
  66. */
  67. public function rules()
  68. {
  69. return [
  70. [['name'], 'required'],
  71. ['name', 'unique', 'targetAttribute' => ['name', 'parent']],
  72. [['parent'], 'in', 'range' => static::find()->select(['id'])->column(), 'message' => 'Menu "{value}" not found.', ],
  73. [['data', 'parent'], 'default'],
  74. ['route', function($attribute){
  75. if (!empty($this->$attribute)) {
  76. $this->addError('route', '一级菜单不能有地址');
  77. return false;
  78. }
  79. return true;
  80. }, 'when' => function($model){
  81. return is_null($model->parent);
  82. }],
  83. ['icon', 'string'],
  84. [['order'], 'integer'],
  85. [['route'], 'in',
  86. 'range' => static::getSavedRoutes(),
  87. 'message' => 'Route "{value}" not found.', ],
  88. ];
  89. }
  90. /**
  91. * {@inheritdoc}
  92. */
  93. public function attributeLabels()
  94. {
  95. return [
  96. 'id' => Yii::t('rbac', 'ID'),
  97. 'name' => Yii::t('rbac', 'Name'),
  98. 'parent' => Yii::t('rbac', 'Parent'),
  99. 'route' => Yii::t('rbac', 'Route'),
  100. 'icon' => Yii::t('rbac', 'Icon'),
  101. 'order' => Yii::t('rbac', 'Order'),
  102. 'data' => Yii::t('rbac', 'Data'),
  103. ];
  104. }
  105. /**
  106. * Get menu parent.
  107. *
  108. * @return \yii\db\ActiveQuery
  109. */
  110. public function getMenuParent()
  111. {
  112. return $this->hasOne(self::className(), ['id' => 'parent']);
  113. }
  114. /**
  115. * Get menu children.
  116. *
  117. * @return \yii\db\ActiveQuery
  118. */
  119. public function getMenus()
  120. {
  121. return $this->hasMany(self::className(), ['parent' => 'id']);
  122. }
  123. /**
  124. * Get saved routes.
  125. *
  126. * @return array
  127. */
  128. public static function getSavedRoutes()
  129. {
  130. $result = [];
  131. foreach (Yii::$app->getAuthManager()->getPermissions() as $name => $value) {
  132. if ($name[0] === '/' && substr($name, -1) != '*') {
  133. $result[] = $name;
  134. }
  135. }
  136. return $result;
  137. }
  138. public static function getDropDownList($tree = [], &$result = [], $deep = 0, $separator = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;')
  139. {
  140. $deep++;
  141. foreach($tree as $list) {
  142. $result[$list['id']] = str_repeat($separator, $deep-1) . $list['name'];
  143. if (isset($list['children'])) {
  144. self::getDropDownList($list['children'], $result, $deep);
  145. }
  146. }
  147. return $result;
  148. }
  149. }