/** * 用户组绑定权限 */ public function actionIndex($id) { $id = (int) $id; $model = Group::model()->findByPk($id); if ($model->access) { foreach ($model->access as $g) { $access[] = $g->access_id; } } $cache = cache('auth_controller_file'); if (!$cache) { $d = $this->_get_modules(\Yii::getPathOfAlias('application.modules')); if ($d) { Access::generate($d); } DirHelper::$kep_list_file = false; cache('auth_controller_file', true); } $rows = DB::all('access', array('select' => "id,name,pid")); foreach ($rows as $v) { $out[$v['id']] = $v; } $rows = ArrHelper::_tree_id($rows); if ($_POST) { $auth = $_POST['auth']; GroupAccess::saveAccess($id, $auth); cache('acl', false); flash('success', __('set access success')); $this->redirect(url('admin/auth/index', array('id' => $id))); } return $this->render('index', array('rows' => $rows, 'out' => $out, 'model' => $model, 'id' => $id, 'access' => $access)); }
static function category() { $db = Yii::app()->db->createCommand(); $db->setFetchMode(PDO::FETCH_OBJ); $rows = $db->from('category')->queryAll(); if ($rows) { foreach ($rows as $v) { $tree[$v->id] = $v; } $category = ArrHelper::tree($tree); } return array($category, $tree); }
/** * 返回access 里面name */ function access($access_id = null) { $model = Access::model()->findAll(); if (!$access_id) { $access_id = $this->access_id; } $t = \ArrHelper::parentTree($model, $access_id); unset($s); foreach ($t as $v) { $s .= $v . "."; } return substr($s, 0, -1); }
/** * 用户绑定到组 */ public function actionBind($id) { $id = (int) $id; $model = User::model()->findByPk($id); foreach ($model->groups as $g) { $groups[] = $g->group_id; } $rows = Group::model()->findAll(); if ($rows) { $rows = \ArrHelper::model_tree($rows); } if ($_POST) { $group = $_POST['group']; //绑定用户到组 UserGroup::UserGroupSave($id, $group); flash('success', __('bin user group success') . " # " . $id); $this->redirect(url('admin/user/index', array('id' => $id))); } return $this->render('bind', array('rows' => $rows, 'groups' => $groups, 'model' => $model, 'id' => $id, 'self' => $model->yourself)); }
echo CHtml::submitButton($model->isNewRecord ? __('create') : __('save'), array('class' => 'btn btn-primary')); ?> </div> <?php $this->endWidget(); ?> <?php /** * 字段类型 使用AJAX * 数据库表名及字段名 */ $rows = CDB('SHOW TABLES')->queryAll(); foreach ($rows as $v) { $mysql_table = ArrHelper::first($v); if (in_array($mysql_table, array('node_field', 'node_content'))) { continue; } $row = CDB("SHOW COLUMNS FROM {$mysql_table}")->queryAll(); foreach ($row as $k) { $f = $k['Field']; if (!in_array($f, array('uid', 'created', 'id', 'updated', 'language_id', 'vid', 'sort', 'display')) && strpos($f, 'id') === false) { $ajax_str .= "'" . $mysql_table . '.' . $f . "',"; } } } $ajax_str = substr($ajax_str, 0, -1); /** * ajax 自动完成的验证规则 */
/** * 向上生成tree */ static function parentTree($data = array(), $parent = null, $root = 0, $value = 'name', $id = 'id', $pid = 'pid') { self::$_j = 0; if (self::$_j == 0) { self::$_ptree = array(); } foreach ($data as $v) { $out[$v->{$id}] = $v->{$value}; } foreach ($data as $v) { if ($v->{$id} == $parent && $v->{$pid} != $root) { self::$_j++; self::parentTree($data, $v->{$pid}, $root, $value, $id, $pid); } } self::$_ptree[$parent] = $out[$parent]; return self::$_ptree; }
/** * Извлекает и валидирует входные данные - get параметры */ private function parseRequest() { $form = ArrHelper::extract($_GET, ['page', 'category', 'order_by']); $this->page = is_null($form->page) ? $this->page : (int) $form->page; $this->category = is_null($form->category) ? $this->category : (int) $form->category; switch ($form->order_by) { case 'name_desc': $this->order_by = ' A.name DESC'; break; case 'name_asc': $this->order_by = ' A.name ASC'; break; case 'date_desc': $this->order_by = ' A.created_at DESC'; break; case 'date_asc': $this->order_by = ' A.created_at ASC'; break; default: $this->order_by = ' A.created_at DESC'; break; } }
/** * $criteria = new CDbCriteria(); $criteria->condition = "id = 1 or id =1"; $node = Node::find('post',$criteria); Node::find('post',1); */ static function find($table, $criteria, $pager = false, $pageSize = 10) { if (!is_object($criteria)) { $id = $criteria; } //所以字段key以及对应的model $cache = cache('node__field_table'); $now = $cache[$table]; $realTable = "field_" . $table; //设置NodeModel的表名 NodeModel::$_table = $realTable; $t = new NodeModel(); $t->refreshMetaData(); if (is_object($criteria)) { if (true === $pager) { $count = NodeModel::model()->count($criteria); $pages = new CPagination($count); $pages->pageSize = $pageSize; $pages->applyLimit($criteria); } $posts = NodeModel::model()->findAll($criteria); if (!$posts) { return null; } foreach ($posts as $r) { $allRows[] = static::find($table, $r->id); } if (true === $pager) { $out = array('posts' => $allRows, 'pages' => $pages); return $out; } if ($criteria->limit == 1) { return ArrHelper::first($allRows); } return $allRows; } $fields = cache('node__content_field'); if (!fields) { return null; } $rows = NodeModel::model()->findByPk($id); foreach ($fields[$table] as $k => $v) { $row[$k] = $rows->{$k}; } //没有缓存是有问题的 if (!$cache) { return $row; } foreach ($now as $k => $v) { $name = trim($v->name); $_relation_table = $realTable . "_" . $name; //真实的第三方表的内容 $deep = $v->_relation_table; //是多个值的,并且是关联其他表的情况 if ($v->relation && $v->mvalue == 1) { $allR = CDB()->from($_relation_table)->where('nid=:nid', array(':nid' => $id))->queryAll(); if ($allR) { foreach ($allR as $key => $al) { $value = $al['value']; $values = CDB()->from($deep)->where('id=:id', array(':id' => $value))->queryRow(); $all[$name][$value] = $values; } foreach ($all as $key => $value) { $row[$key] = $value; } } } else { if ($v->relation) { $value = CDB()->from($deep)->where('id=:id', array(':id' => $row[$name]))->queryRow(); $row[$name] = $value; } } } return $row; }
/** * 显示 向上的树结构 */ function getGroup_tree() { if (0 == $this->pid) { return __('root'); } $data = Group::model()->findAll(); $out = ArrHelper::parentTree($data, $this->pid); return implode("<br>", $out); }
<?php /** * language 表配置 */ $db = Yii::app()->db->createCommand(); $db->setFetchMode(PDO::FETCH_OBJ); $rows = $db->from('category')->queryAll(); if ($rows) { foreach ($rows as $v) { $tree[$v->id] = $v; } $arr = ArrHelper::tree($tree); } $arr[0] = __('please select'); /** * 分类 默认第一个显示PID为0的, * 一层层向下,直到没有下层,将不显示超链接,直接显示字段name的值 */ function admin_config_category($v) { $row = Yii::app()->db->createCommand()->from('category')->where("pid=:pid", array(':pid' => $v['id']))->queryRow(); if ($row) { return "<a href='" . url('admin/category/index', array('pid' => $v['id'])) . "'>" . $v['name'] . "</a>"; } return $v['name']; } return array('name' => array('type' => 'input', 'index' => true, '_value' => "php:admin_config_category"), 'pid' => array('type' => 'select', 'datas' => $arr), '_rules' => array(array('name', 'required')), '_error' => 1);
function run() { $this->db = Yii::app()->db->createCommand(); //取得文件完整路径 $file = Yii::getPathOfAlias($this->config) . '.php'; //取得文件配置信息 $row = self::loadFile($file); $this->model = new AutoModel(); //验证规则 $this->model->rules = $row['_rules']; $_AutoModel = $row['_AutoModel']; //关联表的表名 $this->relation_table = $row['_relation_table']; $_config = cache('config'); if (!$_config['mlanguage']) { unset($row['_multiLanguage'], $row['language_id']); } //判断是不是启用了多语言 $this->_multiLanguage = $_multiLanguage = $row['_multiLanguage']; $data['error'] = $row['_error']; unset($row['_rules'], $row['_error'], $row['_AutoModel'], $row['_multiLanguage'], $row['_relation_table']); $this->row = $row; if (!$this->table) { //取得数据库的名称 $this->table = substr($this->config, strrpos($this->config, '.') + 1); } //判断是否是更新 if (true === $this->save) { $id = (int) $this->id; if ($id) { $dbRow = $this->db->from($this->table)->where('id=:id', array(':id' => $id))->queryRow(); if ($dbRow) { $this->update = true; $node_id = $dbRow['id']; //取数据库中原来的UUID $uuid = $dbRow['uuid']; foreach ($row as $key => $value) { $row[$key]['value'] = $dbRow[$key]; $this->model->{$key} = $dbRow[$key]; } /** * 取得关联表的值 */ if ($this->relation_table) { // key是字段名 ,value是表名 foreach ($this->relation_table as $key => $value) { $allR = CDB()->from($value)->where('nid=:nid', array(':nid' => $node_id))->queryAll(); if ($allR) { foreach ($allR as $al) { $all[$key][] = $al['value']; } foreach ($all as $k => $v) { $_POST['Field'][$k] = $v; } } } } } } //设置模型对应的属性,供自动翻译多语言 $this->model->set_attrs($row); $fixVid = null; //启用多语言判断,多语言一定是有VID的 if (true === $_multiLanguage) { if ($dbRow['vid'] && $dbRow['language_id'] != trim($_POST['AutoModel']['language_id'])) { $fixVid = $dbRow['vid']; } $vid = $dbRow['vid']; /** * 已经存在的多语言记录 */ $all = Yii::app()->db->createCommand()->from($this->table)->where("vid=:vid", array(':vid' => $dbRow['vid']))->queryAll(); foreach ($all as $al) { $muitLang[$al['language_id']] = $al['id']; } } if (isset($_POST['AutoModel'])) { //关联到其他表的值 $NodeField = $_POST['NodeField']; if ($NodeField) { foreach ($NodeField as $key => $value) { //关联表名 $rale = $this->relation_table[$key]; //用来保存到数据库的 $relation_datas[$rale] = $value; } } //对AutoModel属性赋值 foreach ($row as $key => $value) { $postV = $_POST['AutoModel'][$key]; //判断是否是多值 if ($NodeField[$key]['mvalue'] != 1 && is_array($postV)) { $postV = ArrHelper::first($postV); } elseif (is_array($postV)) { $postV = serialize($postV); } //当字段配置中 insert 值为false时不写入主表 if ($value['insert'] === false) { continue; } $this->model->{$key} = trim($postV); $saveDatas[$key] = trim($postV); } //验证规则 if ($this->model->validate()) { $column = cache('DBColumns_' . $this->table); if (!$column) { $columns = Yii::app()->db->createCommand("SHOW COLUMNS FROM `" . $this->table . "`")->queryAll(); foreach ($columns as $c) { $column[$c['Field']] = $c['Field']; } } /** * 自动加载 application.components.AutoModel 下的文件 */ $insertDatas = array(); $updateDatas = array(); if ($_AutoModel) { foreach ($_AutoModel as $AutoModel) { $AutoModel = $AutoModel . 'AutoModel'; Yii::import("application.components.AutoModel.{$AutoModel}"); $objModel = new $AutoModel(); if (method_exists($AutoModel, 'insert')) { $insertDatas += $objModel->insert($saveDatas); } if (method_exists($AutoModel, 'update')) { $updateDatas += $objModel->update($saveDatas); } if (method_exists($AutoModel, 'after')) { $after[] = $objModel; } /** * 判断字段是否存在 */ if (is_array($objModel->fields)) { foreach ($objModel->fields as $v) { if (!$column[$v]) { unset($insertDatas[$v], $updateDatas[$v]); } } } else { $v = $objModel->fields; if (!$column[$v]) { unset($insertDatas[$v], $updateDatas[$v]); } } } } //如果不是更新,将取AUTOMODEL里面的UUID值 if (!$uuid) { $uuid = $insertDatas['uuid']; } if (true === $this->update) { /** * 判断更新需要操作的字段 */ if ($fixVid) { $updateDatas['vid'] = $fixVid; } if ($updateDatas) { foreach ($updateDatas as $_k => $_v) { $saveDatas[$_k] = $_v; } } if ($fixVid) { if (!$this->db->from($this->table)->where('vid=' . $fixVid . ' and language_id=' . $saveDatas['language_id'])->queryRow()) { $this->db->insert($this->table, $saveDatas); } else { unset($saveDatas['vid']); $this->db->update($this->table, $saveDatas, 'id=:id', array(':id' => $id)); } } else { unset($saveDatas['vid']); $this->db->update($this->table, $saveDatas, 'id=:id', array(':id' => $id)); } } else { /** * 判断写入需要操作的字段 */ if ($insertDatas) { foreach ($insertDatas as $_k => $_v) { $saveDatas[$_k] = $_v; } } $this->db->insert($this->table, $saveDatas); } //写入主表完成,写入关联表 if ($relation_datas) { /** * 当没有node_id 时,也就是新建操作时,将查寻一次数据库取得node_id的值 */ if (!$node_id) { $row = $this->db->from($this->table)->where('uuid=:uuid', array(':uuid' => $uuid))->queryRow(); $node_id = $dbRow['id']; } foreach ($relation_datas as $RT => $volist) { CDB()->delete($RT, 'nid=:nid', array(':nid' => $node_id)); foreach ($volist as $vo) { CDB()->insert($RT, array('nid' => $node_id, 'value' => $vo)); } } } //所以操作后 if ($after) { foreach ($after as $af) { $af->after($this->db, $this->table, $data, $id); } } if (true === $_multiLanguage) { cache('language_' . $this->table . $vid, false); } flash('success', __('success')); $this->controller->refresh(); } } if (!$this->editUrl) { $this->editUrl = $this->controller->module->id . '/' . $this->controller->id . '/update'; } if (!$this->createUrl) { $this->createUrl = $this->controller->module->id . '/' . $this->controller->id . '/create'; } $data['model'] = $this->model; $data['row'] = $row; $data['multiLanguage'] = $this->_multiLanguage; $data['muitLang'] = $muitLang; $data['createUrl'] = $this->createUrl; $data['editUrl'] = $this->editUrl; $this->render('BuilderView', $data); } }