<?php namespace backend\controllers; use common\core\Controller; use Yii; use yii\data\ActiveDataProvider; use yii\data\Pagination; use yii\helpers\Url; use common\modelsgii\Admin; /** * --------------------------------------- * 后台父类控制器 * 后台所有控制器都继承自该类 * --------------------------------------- * @author longfei phphome@qq.com */ class BaseController extends Controller { /** * --------------------------------------- * 后台构造函数 * --------------------------------------- */ public function init() { /* 判断是否登录 */ /*if (\Yii::$app->user->getIsGuest()) { $this->redirect(Url::toRoute(['/login/login'])); Yii::$app->end(); }*/ /*if (!Yii::$app->request->isGet) { AdminLog::saveLog($this); }*/ } /** * --------------------------------------- * 标记当前位置到cookie供后续跳转调用 * --------------------------------------- */ public function setForward() { \Yii::$app->getSession()->setFlash('__forward__', $_SERVER['REQUEST_URI']); } /** * --------------------------------------- * 获取之前标记的cookie位置 * --------------------------------------- * @param string $default * @return mixed */ public function getForward($default = '') { $default = $default ? $default : Url::toRoute([Yii::$app->controller->id . '/index']); if (Yii::$app->getSession()->hasFlash('__forward__')) { return Yii::$app->getSession()->getFlash('__forward__'); } else { return $default; } } /** * --------------------------------------- * 传统分页列表数据集获取方法 * --------------------------------------- * @param \yii\db\ActiveRecord $model 模型名或模型实例 * @param array $where where查询条件 * @param array|string $order 排序条件 * @return array|false */ public function lists($model, $where = [], $order = '') { $query = $model::find()->where($where); $countQuery = clone $query; $pages = new Pagination([ 'totalCount' => $countQuery->count(), 'defaultPageSize' => 10, ]); $data = $query->orderBy($order)->offset($pages->offset) ->limit($pages->limit) ->all(); return [$data, $pages]; } /** * --------------------------------------- * dataProvider列表数据集获取方法 * --------------------------------------- * @param \yii\db\ActiveRecord $model 模型名或模型实例 * @param array $where where查询条件 * @param array|string $order 排序条件 * @return \yii\data\ActiveDataProvider */ public function lists1($model, $where = [], $order = '') { $query = $model::find()->where($where)->orderBy($order)->asArray(); $dataProvider = new ActiveDataProvider([ 'query' => $query, 'pagination' => [ 'pageSize' => 10, ], ]); return $dataProvider; } /** * --------------------------------------- * 修改数据表一条记录的一条值 * --------------------------------------- * @param \yii\db\ActiveRecord $model 模型名称 * @param array $data 数据 * @return \yii\db\ActiveRecord|boolean */ public function saveRow($model, $data) { if (empty($data)) { return false; } if ($model->load($data, '') && $model->validate()) { /* 添加到数据库中,save()会自动验证rule */ if ($model->save()) { return $model; } else { return false; } } else { return false; } } /** * --------------------------------------- * 由表主键删除数据表中的多条记录 * --------------------------------------- * @param \yii\db\ActiveRecord $model 模型名称,供M函数使用的参数 * @param string $pk 修改的数据 * @return boolean */ public function delRow($model, $pk = 'id') { $ids = Yii::$app->request->param($pk, 0); $ids = implode(',', array_unique((array) $ids)); if (empty($ids)) { return false; } $_where = $pk . ' in(' . $ids . ')'; if ($model::deleteAll($_where)) { return true; } else { return false; } } /** * ---------------------------------------------- * 操作错误跳转的快捷方法 * @access protected * ----------------------------------------------- * @param string $message 错误信息 * @param string $jumpUrl 页面跳转地址 * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间 * @return void */ protected function error($message = '', $jumpUrl = '', $ajax = false) { $this->dispatchJump($message, 0, $jumpUrl, $ajax); } /** * ---------------------------------------------- * 操作成功跳转的快捷方法 * @access protected * ---------------------------------------------- * @param string $message 提示信息 * @param string $jumpUrl 页面跳转地址 * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间 * @return void */ protected function success($message = '', $jumpUrl = '', $ajax = false) { $this->dispatchJump($message, 1, $jumpUrl, $ajax); } /** * ---------------------------------------------- * 默认跳转操作 支持错误导向和正确跳转 * 调用模板显示 默认为public目录下面的success页面 * 提示页面为可配置 支持模板标签 * @access private * ---------------------------------------------- * @param string $message 提示信息 * @param int $status 状态 * @param string $jumpUrl 页面跳转地址 * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间 * @return void */ private function dispatchJump($message, $status = 1, $jumpUrl = '', $ajax = false) { $jumpUrl = !empty($jumpUrl) ? (is_array($jumpUrl) ? Url::toRoute($jumpUrl) : $jumpUrl) : ''; if (true === $ajax || Yii::$app->request->isAjax) { // AJAX提交 $data = is_array($ajax) ? $ajax : array(); $data['info'] = $message; $data['status'] = $status; $data['url'] = $jumpUrl; $this->ajaxReturn($data); } // 成功操作后默认停留1秒 $waitSecond = 2; if ($status) { //发送成功信息 $message = $message ? $message : '提交成功'; // 提示信息 // 默认操作成功自动返回操作前页面 echo $this->renderFile(Yii::$app->params['action_success'], [ 'message' => $message, 'waitSecond' => $waitSecond, 'jumpUrl' => $jumpUrl, ]); } else { $message = $message ? $message : '发生错误了'; // 提示信息 // 默认发生错误的话自动返回上页 $jumpUrl = "javascript:history.back(-1);"; echo $this->renderFile(Yii::$app->params['action_error'], [ 'code' => 0, 'message' => $message, 'waitSecond' => $waitSecond, 'jumpUrl' => $jumpUrl, ]); } //Yii::$app->end(); exit; } /** * ------------------------------------------------ * Ajax方式返回数据到客户端 * @access protected * ------------------------------------------------ * @param mixed $data 要返回的数据 * @return void */ protected function ajaxReturn($data) { // 返回JSON数据格式到客户端 包含状态信息 header('Content-Type:application/json; charset=utf-8'); echo json_encode($data); //Yii::$app->end(); exit; } /** * 获取所有可以访问action的用户 * * @return array */ public function getAccessAdmins($permission_name = '') { //获取所有管理员 if (empty($permission_name)) { $permission_name = Yii::$app->controller->module->requestedRoute; } $auth = Yii::$app->authManager; $admins = Admin::find()->select(['uid', 'username'])->asArray()->all(); foreach ($admins as $key => $value) { if (!$auth->checkAccess($value['uid'], $permission_name)) { unset($admins[$key]); } } $admins = array_column($admins, 'username', 'uid'); return $admins; } protected function initParams($p = [],$fields = [], $isFilter = false) { $params = []; if (!empty($fields)) { foreach ($fields as $key => $value) { if (isset($p[$value]) && (!empty($p[$value]) || $p[$value] == 0)) { $params[$value] = $p[$value]; } else { if (!$isFilter) $params[$value] = null; } } } return $params; } }