public function search($params) { $query = MenuModel::find(); $dataProvider = new ActiveDataProvider(['query' => $query]); $query->leftJoin(['parent' => '{{%menu}}'], '{{%menu}}.parent=parent.id'); $sort = $dataProvider->getSort(); $sort->attributes['menuParent.name'] = ['asc' => ['parent.name' => SORT_ASC], 'desc' => ['parent.name' => SORT_DESC], 'label' => 'parent']; $sort->attributes['order'] = ['asc' => ['parent.order' => SORT_ASC, '{{%menu}}.order' => SORT_ASC], 'desc' => ['parent.order' => SORT_DESC, '{{%menu}}.order' => SORT_DESC], 'label' => 'order']; $sort->defaultOrder = ['menuParent.name' => SORT_ASC]; if (!($this->load($params) && $this->validate())) { return $dataProvider; } $query->andFilterWhere(['id' => $this->id, 'parent' => $this->parent]); $query->andFilterWhere(['like', 'name', $this->name])->andFilterWhere(['like', 'route', $this->route])->andFilterWhere(['like', 'parent.name', $this->parent_name]); return $dataProvider; }
/** * Finds the Menu model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. * @param integer $id * @return Menu the loaded model * @throws NotFoundHttpException if the model cannot be found */ protected function findModel($id) { if (($model = Menu::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); } }
/** * @return \yii\db\ActiveQuery */ public function getMenus() { return $this->hasMany(Menu::className(), ['parent' => 'id']); }
/** * * @param mixed $userId * @param integer $root * @param \Closure $callback function($menu){} * @param boolean $refresh * @return array * */ public static function getAssignedMenu($userId, $root = null, $callback = null, $refresh = false) { $key = static::buildKey([__METHOD__, $userId, $root]); $refresh = $refresh || $callback !== null; if ($refresh || ($cache = Yii::$app->getCache()) === null || ($result = $cache->get($key)) === false) { $manager = \Yii::$app->getAuthManager(); $routes = $filter1 = $filter2 = []; foreach ($manager->getPermissionsByUser($userId) as $name => $value) { if ($name[0] === '/') { if (substr($name, -2) === '/*') { $name = substr($name, 0, -1); } $routes[] = $name; } } $prefix = '\\'; sort($routes); foreach ($routes as $route) { if (strpos($route, $prefix) !== 0) { if (substr($route, -1) === '/') { $prefix = $route; $filter1[] = $route . '%'; } else { $filter2[] = $route; } } } $assigned = []; $query = Menu::find()->select(['id'])->asArray(); if (count($filter2)) { $assigned = $query->where(['route' => $filter2])->column(); } if (count($filter1)) { $query->where('route like :filter'); foreach ($filter1 as $filter) { $assigned = array_merge($assigned, $query->params([':filter' => $filter])->column()); } } $menus = Menu::find()->asArray()->indexBy('id')->all(); $assigned = static::requiredParent($assigned, $menus); $result = static::normalizeMenu($assigned, $menus, $callback, $root); if (isset($cache)) { $cache->set($key, $result, 0, new TagDependency(['tags' => static::getGroup(self::AUTH_GROUP)])); } } return $result; }