/** * 创建元素集 * @author gentle */ public function actionCreate($id) { $model = new CardDs("Create"); $model->database_id = $id; $db_model = $this->loadModel($id, 'db'); if (isset($_POST['CardDs'])) { $CardDsArray = array(); $CardDsArray[0]['database_id'] = $model->database_id; $CardDsArray[0]['name'] = $_POST['CardDs']['name']; $CardDsArray[0]['en_name'] = $_POST['CardDs']['en_name']; if (isset($_POST['CardDs']['additionField'])) { foreach ($_POST['CardDs']['additionField'] as $key => $value) { if (empty($value['name']) || empty($value['en_name'])) { continue; } $CardDsArray[$key] = $value; $CardDsArray[$key]['database_id'] = $model->database_id; } } foreach ($CardDsArray as $val) { $model = new CardDs("Create"); $model->database_id = $id; $model->attributes = $val; if (!$model->save()) { $errorMsg = ''; $errorErr = $model->getErrors(); foreach ($errorErr as $value) { $errorMsg .= "\t" . $value[0]; } $errorMsg = trim($errorMsg, ','); Yii::app()->user->setFlash("error", $errorMsg); $this->redirect(array('CardDs/index/id/' . $id)); Yii::app()->end(); } else { $this->addLog('ds', $model->id, '在“' . $db_model->name . '”中新加了表“' . $model->name . '”'); } } Yii::app()->user->setFlash("success", "新建 <b>{$model->name}</b> 数据表成功!"); $this->redirect(array('CardDs/index/id/' . $id)); } //@TODO yongze del //$dbModel = $this->loadModel($id, 'db'); $this->renderPartial('_form_ds', array('model' => $model, 'dbModel' => $db_model)); }
/** * 左侧栏树形结构 * @author gentle */ public function dataTree() { $data = array(); $databases = CardDb::model()->findAll(); foreach ($databases as $key => $value) { $data[$key]['text'] = '<span>' . $value->name . '</span>'; $data[$key]['expanded'] = false; $data[$key]['children'] = array(); $datasets = CardDs::model()->findAllByAttributes(array('database_id' => (string) $value->id)); if (empty($datasets)) { continue; } foreach ($datasets as $k => $v) { $data[$key]['children'][$k] = array('text' => '<a href="' . $this->createUrl('/CardDs/Index/id/' . $value->id) . '">' . $v->name . '</a>'); } } return $data; }
/** * 左侧栏树形结构 * @author gentle */ public function dataTree($databaseId = 0, $action = 'cardItem/Index') { $data = array(); $databases = CardDb::model()->findAll(User::model()->getScopeDbCriteria()); foreach ($databases as $key => $value) { $data[$key]['text'] = '<span>' . $value->name . '</span>'; if ($databaseId == $value->id) { $data[$key]['expanded'] = true; } else { $data[$key]['expanded'] = false; } $data[$key]['children'] = array(); $dscriteria = User::model()->getScopeDsCriteria(); $dscriteria->addCond('database_id', '==', (int) $value->id); $datasets = CardDs::model()->findAll($dscriteria); if (empty($datasets)) { continue; } foreach ($datasets as $k => $v) { $data[$key]['children'][$k] = array('text' => '<a href="' . $this->createUrl('/' . $action . '/id/' . $v->id) . '">' . $v->name . '</a>'); } } return $data; }
/** * 获取数据库中的文档列表 * @param MongoDB $db DB * @return array<MongoCollection> */ public function _listCollections(MongoDB $db) { //获取所有文档列表 $names = array(); try { //$names = $db->execute('function (){ return db.getCollectionNames(); }'); //生产线不支持js格式mongo指令 $names = $db->getCollectionNames(); } catch (Exception $e) { echo $e->errorMessage(); exit; } //获取非系统文档 $ret = array(); $inlay_tabse = Yii::app()->params['inlay_tabse']; foreach ($names as $name) { //屏蔽掉系统文档和item if (preg_match("/^(system\\.|auto|file\\.)/", $name)) { continue; } $ret[$name] = isset($inlay_tabse[$name]) ? $inlay_tabse[$name] : $name; } //拆分item表 $dsmap = CardDs::model()->getDBDSMap(); //获取游戏表对应 foreach ($dsmap as $dv) { foreach ($dv['list'] as $tv) { $ret['item_' . $dv['en_name'] . '_' . $tv['en_name']] = '数据表_' . $dv['name'] . '_' . $tv['name']; } } $names = $ret; return $names; }
/** * 根据表名得到真实的表和对应的查询条件 * @param $tname string 待解析表名 * @return 真实表名和条件 */ public function parseRealTable($tname) { $rs = array('name' => $tname, 'criteria' => new EMongoCriteria()); if (preg_match('/^(item_)/i', $tname)) { $tinfo = explode('_', $tname); if (count($tinfo) == 3) { $dbinfo = CardDb::model()->findByAttributes(array('en_name' => $tinfo[1])); if ($dbinfo) { $dsinfo = CardDs::model()->findByAttributes(array('database_id' => $dbinfo->id, 'en_name' => $tinfo[2])); if ($dsinfo) { $rs['name'] = $tinfo[0]; $rs['criteria']->dataset_id = (int) $dsinfo['id']; } } } } return $rs; }
/** * Fields动态输出 * @author gentle */ public function actionAdditionField($fieldType, $additionType, $cardDsId = -1, $enName = '', $group = '') { //数值thirdField恢复 if ($cardDsId != -1 && $enName != '') { $dsModel = $this->loadModel((int) $cardDsId, 'ds'); if ($group) { $data = $dsModel->fields[$group]['fields'][$enName]; } else { $data = $dsModel->fields[$enName]; } } else { $data = array(); } //普通字段 if ($fieldType == 'normal') { $additionFieldHtml = $this->renderPartial('_form_field_' . $fieldType . '_' . $additionType, array('data' => $data), true); } //调用元素集字段 if ($fieldType == 'reference') { $dsModel = CardDs::model()->findByAttributes(array('en_name' => $additionType)); $fields = $dsModel->getFields(); $fieldArray = array(); foreach ($fields as $key => $value) { $fieldArray[$key] = $value['name']; } $additionFieldHtml = $this->renderPartial('_form_field_reference', array('fieldArray' => $fieldArray, 'data' => $data), true); } echo CJSON::encode(array('fieldHtml' => $additionFieldHtml)); }
/** * 获取库与实体对应关系表 * @return unknown_type */ public function getDBDSMap() { //添加统一前缀 $cache_key = strtolower('db.admin' . __FUNCTION__); //调用,有缓存则用缓存 if (($map = Yii::app()->cache->get($cache_key)) === false) { $dblist = CardDb::model()->findAll(User::model()->getScopeDbCriteria()); $dslist = CardDs::model()->findAll(User::model()->getScopeDsCriteria()); foreach ($dblist as $dv) { $map[$dv['id']] = array('en_name' => $dv['en_name'], 'name' => $dv['name'], 'list' => array()); } foreach ($dslist as $tv) { if (isset($map[$tv['database_id']])) { $map[$tv['database_id']]['list'][$tv['id']] = array('en_name' => $tv['en_name'], 'name' => $tv['name']); } } if (!Yii::app()->cache->set($cache_key, $map, Yii::app()->params['cache_expire'])) { Yii::log('设置缓存失败:key=' . $cache_key, CLogger::LEVEL_WARNING, 'system.cache'); } } return $map; }
/** * 获取选择字段的已使用选项(带缓存) * http://db.admin.mofang.com/api/card/getoptionuse?setid=1&field=fglx */ public function actionGetOptionUse() { //参数接收 //http://db.dev.mofang.com/api/card/getoptionuse/setid/9/field/select1 $datasetId = isset($_GET['setid']) ? intval($_GET['setid']) : 0; //表id $fieldKay = isset($_GET['field']) ? $_GET['field'] : ''; //字段名 $filter = isset($_GET['filter']) ? $this->paramStr2Arr($_GET['filter']) : ''; //过滤条件 filter = djfl|珍品:: (多个且关系) //初始化返回值 $info = array(); $return = array('code' => 0, 'data' => array()); //参数验证 if (empty($datasetId) || empty($fieldKay)) { $return['code'] = 1; //接口参数不足 //获取字段定义 } else { $this->checkCache($cache_data); //检查缓存 if (!empty($cache_data)) { echo $cache_data; return ''; } $options = CardDs::model()->getFieldOption($datasetId, $fieldKay); if (empty($options)) { $return['code'] = 2; } else { //过滤条件 $condition = array("dataset_id" => $datasetId, 'data.' . $fieldKay => array('$exists' => true)); //加入过滤条件 if ($filter) { foreach ($filter as $fkey => $fval) { $condition['data.' . $fkey] = $fval; } } //执行查询 $option_dist = CardItem::model()->getCollection()->distinct('data.' . $fieldKay, $condition); //若有分组数据,则填入返回值中 if ($option_dist) { //合并选项并去重 foreach ($option_dist as $oval) { if (is_array($oval)) { $return['data'] = array_merge($return['data'], $oval); //数组合并 } else { array_push($return['data'], $oval); //字符串压入 } } $return['data'] = array_unique($return['data']); //去重 $return['data'] = array_filter($return['data']); //去空 $return['data'] = array_merge($return['data'], array()); } $this->writeCache(CJSON::encode($return)); //设置缓存 } } echo CJSON::encode($return); }
/** * 生成字段的展示HTML代码 * @param $key string 字段英文名 * @param $value array 字段属性 * @param $group string 组字段英文名 * @param $index string 貌似无用 * @param $itemData * @return unknown_type */ private function fieldItemHtml($key, $value, $group = '', $index = 'key', $itemData = '') { $fieldData = array(); //初始化字段信息 $fieldData['enName'] = $key; $fieldData['data'] = $value; //组需要加入的额外属性 if ($group) { $fieldData['group'] = $group; $fieldData['key'] = $index; } if ($itemData) { $fieldData['itemData'] = $itemData; } //关联字段 if ($value['extra']['field_info']['field_type'] == 'reference') { $fieldType = $value['extra']['field_info']['field_type']; //字段类型,此处只可能为reference $additionType = $value['extra']['field_info']['addition_type']; //关联表名 $dataset = CardDs::model()->findByAttributes(array('en_name' => $additionType)); //获取指定的表模型 $dsId = $dataset['id']; //获取表id $fieldData['referenceItems'] = $this->loadModel($dsId, 'item', 'dataset_id', true); //获取 item表中dataset_id=$dsId的数据 $tplName = '_form_item_' . $fieldType; } else { $fieldType = $value['extra']['field_info']['field_type']; $additionType = $value['extra']['field_info']['addition_type']; $tplName = '_form_item_' . $fieldType . '_' . $additionType; } $html = $this->renderPartial($tplName, $fieldData, true); return $html; }
/** * 范围格式转换(数据库->页面) * @param $scope string/array 用户的范围 * @return array 一维数组 */ public function decodeScope($scope) { //空验证 if (empty($scope)) { return array(); } $stinfo = array(); if ($scope == 'all') { $grs = CardDs::model()->getDBDSMap(); $stinfo = array_keys($grs); //抽取数据 } else { foreach ($scope as $key => $val) { if (is_array($val)) { foreach ($val as $keys => $vals) { $stinfo[] = $key . '--' . $vals; } } else { $stinfo[] = $val; } } } return $stinfo; }