ContentmodelController.php 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. <?php
  2. namespace app\modules\admin\controllers;
  3. use app\common\controllers\BController;
  4. use app\models\ContentModel;
  5. use app\models\ContentModelField;
  6. use app\modules\cms\models\Category;
  7. use Yii;
  8. class ContentmodelController extends BController
  9. {
  10. public $layout = 'main';
  11. public function actionList()
  12. {
  13. $query = ContentModel::find();
  14. if (Yii::$app->request->isAjax) {
  15. $data = [];
  16. $params = Yii::$app->request->get('ContentModel');
  17. $query = mergeParams($query,$params);
  18. $countQuery = clone $query;
  19. //分页
  20. if(isset($_GET['limit'])){ $query->limit(intval($_GET['limit']));}
  21. if(isset($_GET['offset'])){ $query->offset(intval($_GET['offset']));}
  22. //排序
  23. if(isset($_GET['sort'])&&isset($_GET['sortOrder']))
  24. {
  25. $resultList = $query->orderBy([$_GET['sort']=>($_GET['sortOrder']=='asc'?SORT_ASC:SORT_DESC)])->all();
  26. }
  27. else
  28. {
  29. $resultList = $query->orderBy(['model_id'=>SORT_ASC])->all();
  30. }
  31. foreach($resultList as $result)
  32. {
  33. $data[] = array('model_id'=>$result->model_id,'name'=>$result->name,'table_name'=>$result->table_name,'description'=>$result->description,'type'=>$result->type,'typetxt'=>ContentModel::typeOptions($result->type),'for_cms'=>$result->boolOptions($result->for_cms),'disabled'=>$result->disabled,'is_systemtxt'=>$result->boolOptions($result->is_system),'is_system'=>$result->is_system,'create_time'=>get_date($result->create_time,'Y-m-d H:i'));
  34. }
  35. $result = ["total"=>$countQuery->count(),"totalNotFiltered"=>$countQuery->count(),"rows"=>$data];
  36. echo_json($result);
  37. }
  38. $this->tableTitle = array(
  39. array('field'=>'model_id','title'=>ContentModel::getAttributeName('model_id'),'align'=>'center','class'=>'col-md-1'),
  40. array('field'=>'name','title'=>ContentModel::getAttributeName('name'),'align'=>'center','class'=>'col-md-1'),
  41. array('field'=>'table_name','title'=>ContentModel::getAttributeName('table_name'),'align'=>'center','class'=>'col-md-2'),
  42. array('field'=>'typetxt','title'=>ContentModel::getAttributeName('type'),'align'=>'center','sortable'=>true,'class'=>'col-md-2'),
  43. array('field'=>'for_cms','title'=>ContentModel::getAttributeName('for_cms'),'align'=>'center','class'=>'col-md-2'),
  44. array('field'=>'is_systemtxt','title'=>ContentModel::getAttributeName('is_system'),'align'=>'center','sortable'=>true,'class'=>'col-md-2'),
  45. array('field'=>'operate','title'=>ContentModel::getAttributeName('operate'),'align'=>'center','events'=>'window.operateEvents','formatter'=>'operateFormatter','class'=>'col-md-2'),
  46. );
  47. $this->tableConfig = array('table'=>ContentModel::shortTableName(),'url'=>$this->createRealUrl(['admin/contentmodel/list']),'setFieldUrl'=>$this->createRealUrl(['admin/contentmodel/setfield']),'idField'=>ContentModel::modelPrimaryKey(),'checkbox'=>0,'dropmenu'=>1,'pagination'=>false,'refresh'=>true);
  48. return $this->render('list',array('model'=>new ContentModel()));
  49. }
  50. //添加
  51. function actionAdd()
  52. {
  53. $model = new ContentModel();
  54. if(Yii::$app->request->isAjax&&$model->load(Yii::$app->request->post())){
  55. $exist = ContentModel::find()->where("table_name='".$model->table_name."' or name='".$model->name."'")->exists();
  56. if($exist)
  57. {
  58. $msgdata = ['error' => 1,'msg' => '已存在该模型,添加失败'];
  59. echo_json($msgdata);
  60. }
  61. $model->create_time = TIMESTAMP;
  62. if(!$model->validate())
  63. {
  64. $msgdata = ['error' => 1,'msg' => $model->returnFirstError()];
  65. }
  66. else
  67. {
  68. if($model->save())
  69. {
  70. $model_id = getLastInsertId();
  71. if($model->type==1)
  72. {
  73. $table_name = $model->table_name;
  74. $model_sql = file_get_contents(BASE_PATH.'common'.DIRECTORY_SEPARATOR.'data'.DIRECTORY_SEPARATOR.'model.sql');
  75. $table_pre = Yii::$app->db->tablePrefix;
  76. $model_sql = str_replace('$basic_table', $table_pre.$table_name, $model_sql);
  77. $model_sql = str_replace('$table_data',$table_pre.$table_name.'_data', $model_sql);
  78. $model_sql = str_replace('$table_model_field',$table_pre.'content_model_field', $model_sql);
  79. $model_sql = str_replace('$model_id',$model_id,$model_sql);
  80. Yii::$app->db->createCommand($model_sql)->execute();
  81. //初始化一个根栏目
  82. /* $category = new Category();
  83. $category->content_model_id = $model_id;
  84. $category->cat_name = $model->name;
  85. $category->cat_type = 1;
  86. $category->save();*/
  87. $msgdata = ['error' => 0,'msg' => '操作成功'];
  88. }
  89. else if($model->type==2)
  90. {
  91. $tableName = Yii::$app->db->tablePrefix.'user_'.$model->table_name;
  92. //判断是否存在同样表名的模型
  93. $sql = "show tables like '".$tableName."';";
  94. $result = Yii::$app->db->createCommand($sql)->queryOne();
  95. if($result)
  96. {
  97. $msgdata = ['error' => 1,'msg' => '该表已经存在'];
  98. }
  99. else
  100. {
  101. $model->table_name = str_replace(Yii::$app->db->tablePrefix,'',$tableName);
  102. if($model->save())
  103. {
  104. //建立数据表
  105. $model_sql = "CREATE TABLE `$tableName` ( `user_id` int(10) unsigned NOT NULL, PRIMARY KEY (`user_id`));";
  106. Yii::$app->db->createCommand($model_sql)->execute();
  107. $msgdata = ['error' => 0,'msg' => '操作成功'];
  108. }
  109. else
  110. {
  111. $msgdata = ['error' => 1,'msg' => '操作失败'];
  112. }
  113. }
  114. }
  115. }
  116. else
  117. {
  118. $msgdata = ['error' => 1,'msg' => '操作失败'];
  119. }
  120. }
  121. echo_json($msgdata);
  122. }
  123. return $this->renderAjax('add',array('model'=>$model));
  124. }
  125. function actionEdit()
  126. {
  127. $id = $this->getKeyId('model_id');
  128. $model = ContentModel::findOne($id);
  129. check_record_exists($model);
  130. if(Yii::$app->request->isAjax&&$model->load(Yii::$app->request->post())){
  131. $post = Yii::$app->request->post();
  132. $model->for_cms = $post['ContentModel']['for_cms']?$post['ContentModel']['for_cms']:0;
  133. $model->enable_search = $post['ContentModel']['enable_search']?$post['ContentModel']['enable_search']:0;
  134. $model->is_system = $post['ContentModel']['is_system']?$post['ContentModel']['is_system']:0;
  135. if(!$model->validate())
  136. {
  137. $msgdata = ['error' => 1,'msg' => $model->returnFirstError()];
  138. }
  139. else
  140. {
  141. if($model->save())
  142. {
  143. $msgdata = ['error' => 0,'msg' => '操作成功'];
  144. }
  145. else
  146. {
  147. $msgdata = ['error' => 1,'msg' => '操作失败'];
  148. }
  149. }
  150. echo_json($msgdata);
  151. }
  152. return $this->renderAjax('edit',array('model'=>$model));
  153. }
  154. function actionSettings()
  155. {
  156. $id = $this->getKeyId('model_id');
  157. $model = ContentModel::findOne($id);
  158. check_record_exists($model);
  159. $settings = string2array($model->settings);
  160. if(Yii::$app->request->isAjax&&Yii::$app->request->post()){
  161. $settings = isset($_POST['settings'])?$_POST['settings']:NULL;
  162. $model->settings = array2string($settings);
  163. if(!$model->validate())
  164. {
  165. $msgdata = ['error' => 1,'msg' => $model->returnFirstError()];
  166. }
  167. else
  168. {
  169. if($model->save())
  170. {
  171. $msgdata = ['error' => 0,'msg' => '操作成功'];
  172. }
  173. else
  174. {
  175. $msgdata = ['error' => 1,'msg' => '操作失败'];
  176. }
  177. }
  178. echo_json($msgdata);
  179. }
  180. return $this->renderAjax('settings',array('model'=>$model,'settings'=>$settings));
  181. }
  182. //删除模型
  183. public function actionDel()
  184. {
  185. $model_id = $this->getKeyId('model_id');
  186. $contentModel = ContentModel::findOne($model_id);
  187. check_record_exists($contentModel);
  188. if($contentModel->items>0)
  189. {
  190. $msgdata = ['error' => 1,'msg' => '该模型已经关联内容,请手动操作数据库'];
  191. echo_json($msgdata);
  192. }
  193. if($contentModel->delete())
  194. {
  195. if($contentModel->type==1)
  196. {
  197. ContentModelField::deleteAll(['model_id' =>$model_id]);
  198. Category::deleteAll(['content_model_id' =>$model_id]);
  199. $table_name = $contentModel->table_name;
  200. $table_pre = Yii::$app->db->tablePrefix;
  201. $table1 = $table_pre.$table_name;
  202. $table2 = $table_pre.$table_name."_data";
  203. $sql="DROP TABLE IF EXISTS `".$table1."`;DROP TABLE IF EXISTS `".$table2."`;";
  204. Yii::$app->db->createCommand($sql)->execute();
  205. $msgdata = ['error' => 0,'msg' => '操作成功'];
  206. }
  207. else if($contentModel->type==2)
  208. {
  209. $table_name = $contentModel->table_name;
  210. $table = Yii::$app->db->tablePrefix.$table_name;
  211. $sql = "select count(*) from $table ";
  212. $count = Yii::$app->db->createCommand($sql)->queryScalar();
  213. if($count>0)
  214. {
  215. $msgdata = ['error' => 1,'msg' => '该模型已经关联内容,请手动操作数据库'];
  216. }
  217. else
  218. {
  219. ContentModelField::deleteAll(['model_id' =>$model_id]);
  220. $sql="DROP TABLE IF EXISTS `".$table."`;";
  221. Yii::$app->db->createCommand($sql)->execute();
  222. $msgdata = ['error' => 0,'msg' => '操作成功'];
  223. }
  224. }
  225. }
  226. else
  227. {
  228. $msgdata = ['error' => 1,'msg' => '操作失败'];
  229. }
  230. echo_json($msgdata);
  231. }
  232. //字段管理
  233. public function actionFieldlist()
  234. {
  235. $model_id = $this->getKeyId('model_id');
  236. $contentModel = ContentModel::findOne($model_id);
  237. check_record_exists($contentModel);
  238. $query = ContentModelField::find();
  239. if (Yii::$app->request->isAjax) {
  240. $data = [];
  241. $params = Yii::$app->request->get('ContentModelField');
  242. $query = mergeParams($query,$params,['model_id'=>$model_id]);
  243. $countQuery = clone $query;
  244. //分页
  245. if(isset($_GET['limit'])){ $query->limit(intval($_GET['limit']));}
  246. if(isset($_GET['offset'])){ $query->offset(intval($_GET['offset']));}
  247. //排序
  248. if(isset($_GET['sort'])&&isset($_GET['sortOrder']))
  249. {
  250. $resultList = $query->orderBy([$_GET['sort']=>($_GET['sortOrder']=='asc'?SORT_ASC:SORT_DESC)])->all();
  251. }
  252. else
  253. {
  254. $resultList = $query->orderBy(['field_id'=>SORT_ASC])->all();
  255. }
  256. foreach($resultList as $result)
  257. {
  258. $data[] = array('field_id'=>$result->field_id,'name'=>$result->name,'field'=>$result->field,'form_type'=>$result->form_type,'is_system'=>$result->is_system,'is_systemtxt'=>$result->boolOptions($result->is_system),'is_listshow'=>$result->is_listshow,'is_listshowtxt'=>$result->boolOptions($result->is_listshow),'is_base'=>$result->is_base,'is_search'=>$result->is_search,'is_searchtxt'=>$result->boolOptions($result->is_search),'is_add_admin'=>$result->is_add_admin,'list_order'=>$result->list_order);
  259. }
  260. $result = ["total"=>$countQuery->count(),"totalNotFiltered"=>$countQuery->count(),"rows"=>$data];
  261. echo_json($result);
  262. }
  263. $this->tableTitle = array(
  264. array('field'=>'name','title'=>ContentModelField::getAttributeName('name'),'align'=>'center','class'=>'col-md-1'),
  265. array('field'=>'field','title'=>ContentModelField::getAttributeName('field'),'align'=>'center','class'=>'col-md-1'),
  266. array('field'=>'form_type','title'=>ContentModelField::getAttributeName('form_type'),'align'=>'center','class'=>'col-md-2'),
  267. array('field'=>'is_systemtxt','title'=>ContentModelField::getAttributeName('is_system'),'align'=>'center','class'=>'col-md-1'),
  268. array('field'=>'is_add_admin','title'=>ContentModelField::getAttributeName('is_add_admin'),'align'=>'center','class'=>'col-md-1','formatter'=>'switchFormatter'),
  269. array('field'=>'is_listshow','title'=>ContentModelField::getAttributeName('is_listshow'),'align'=>'center','class'=>'col-md-1','formatter'=>'switchFormatter'),
  270. array('field'=>'is_base','title'=>ContentModelField::getAttributeName('is_base'),'align'=>'center','class'=>'col-md-1','formatter'=>'switchFormatter'),
  271. array('field'=>'is_search','title'=>ContentModelField::getAttributeName('is_search'),'align'=>'center','class'=>'col-md-1','formatter'=>'switchFormatter'),
  272. array('field'=>'list_order','title'=>ContentModelField::getAttributeName('list_order'),'align'=>'center','class'=>'col-md-2','sortable'=>true,'formatter'=>'editFormatter'),
  273. array('field'=>'operate','title'=>ContentModelField::getAttributeName('operate'),'align'=>'center','events'=>'window.operateEvents','formatter'=>'operateFormatter','class'=>'col-md-2'),
  274. );
  275. $this->tableConfig = array('table'=>ContentModelField::shortTableName(),'url'=>$this->createRealUrl(['admin/contentmodel/fieldlist','model_id'=>$model_id]),'setFieldUrl'=>$this->createRealUrl(['admin/contentmodel/setfield']),'idField'=>ContentModelField::modelPrimaryKey(),'checkbox'=>0,'dropmenu'=>1,'pagination'=>false,'refresh'=>true);
  276. return $this->render('fieldlist',array('model'=>new ContentModelField(),'contentModel'=>$contentModel));
  277. }
  278. //获取字段信息
  279. public function actionFieldsetting()
  280. {
  281. $form_type = $_GET['form_type'];
  282. if(!empty($form_type))
  283. {
  284. require BASE_PATH.'common'.DIRECTORY_SEPARATOR.'widget'.DIRECTORY_SEPARATOR.'fields'.DIRECTORY_SEPARATOR.$form_type.DIRECTORY_SEPARATOR.'config.inc.php';
  285. ob_start();
  286. include BASE_PATH.'common'.DIRECTORY_SEPARATOR.'widget'.DIRECTORY_SEPARATOR.'fields'.DIRECTORY_SEPARATOR.$form_type.DIRECTORY_SEPARATOR.'field_add_form.inc.php';
  287. $data_setting = ob_get_contents();
  288. if(strtolower(CHARSET)!='utf-8')
  289. {
  290. $data_setting = array_iconv($data_setting);
  291. }
  292. ob_end_clean();
  293. $settings = array('field_basic_table'=>$field_basic_table,'field_minlength'=>$field_minlength,'field_maxlength'=>$field_maxlength,'field_allow_search'=>$field_allow_search,'field_allow_fullsearch'=>$field_allow_fullsearch,'field_allow_isunique'=>$field_allow_isunique,'setting'=>$data_setting);
  294. $msgdata = [
  295. 'error' => 0,
  296. 'msg' => 'success',
  297. 'data'=>$settings,
  298. 'code'=>'200',
  299. ];
  300. echo_json($msgdata);
  301. }
  302. }
  303. //添加
  304. function actionAddfield()
  305. {
  306. $model_id = $this->getKeyId('model_id');
  307. $contentModel = ContentModel::findOne($model_id);
  308. check_record_exists($contentModel);
  309. $model = new ContentModelField();
  310. $postdata = Yii::$app->request->post('ContentModelField');
  311. if(Yii::$app->request->isAjax&&$model->load(Yii::$app->request->post())){
  312. $exist = ContentModelField::find()->where("field='".$model->field."' and model_id=".$model_id)->exists();
  313. if($exist)
  314. {
  315. $msgdata = ['error' => 1,'msg' => '已存在该字段,添加失败'];
  316. echo_json($msgdata);
  317. }
  318. $model->is_system= $contentModel->type==2?1:intval($postdata['is_system']);
  319. $model->is_unique = intval($postdata['is_unique']);
  320. $model->is_base = intval($postdata['is_base']);
  321. $model->is_search = intval($postdata['is_search']);
  322. $model->is_add = intval($postdata['is_add']);
  323. $model->is_fullsearch = intval($postdata['is_fullsearch']);
  324. $model->is_add_admin = intval($postdata['is_add_admin']);
  325. $model->is_omnipotent = intval($postdata['is_omnipotent']);
  326. $model->is_listshow = intval($postdata['is_listshow']);
  327. $model->is_position = intval($postdata['is_position']);
  328. require BASE_PATH.'common'.DIRECTORY_SEPARATOR.'widget'.DIRECTORY_SEPARATOR.'fields'.DIRECTORY_SEPARATOR.$model->form_type.DIRECTORY_SEPARATOR.'config.inc.php';
  329. if(empty($model->min_length)){$model->min_length = intval($field_minlength);}
  330. if(empty($model->max_length)){$model->max_length = intval($field_maxlength);}
  331. $model->setting = !empty($_POST['setting'])?array2string($_POST['setting']):'';
  332. if($_POST['setting']['field_type'])$field_type = $_POST['setting']['field_type'];
  333. $model->unset_group_ids = !empty($_POST['unset_group_ids'])?join(",",$_POST['unset_group_ids']):'';
  334. $model->unset_role_ids = !empty($_POST['unset_role_ids'])?join(",",$_POST['unset_role_ids']):'';
  335. $model->model_id = $model_id;
  336. if(!$model->validate())
  337. {
  338. $msgdata = ['error' => 1,'msg' => $model->returnFirstError()];
  339. }
  340. else
  341. {
  342. if($model->save())
  343. {
  344. if(in_array($model->form_type,array('image','downfile')))
  345. {
  346. $model->max_length = $field_maxlength;
  347. }
  348. if($this->_addField(['field_type'=>$field_type,'field'=>$model->field,'max_length'=>$model->max_length,'table_name'=>$contentModel->table_name,'is_system'=>$model->is_system,'contentmodel_type'=>$contentModel->type])==true)
  349. {
  350. $msgdata = ['error' => 0,'msg' => '操作成功'];
  351. }
  352. else
  353. {
  354. $msgdata = ['error' => 1,'msg' => '操作失败'];
  355. }
  356. }
  357. else
  358. {
  359. $msgdata = ['error' => 1,'msg' => '操作失败'];
  360. }
  361. }
  362. echo_json($msgdata);
  363. }
  364. return $this->renderAjax('addfield',array('model'=>$model,'contentModel'=>$contentModel));
  365. }
  366. //编辑字段
  367. function actionEditfield()
  368. {
  369. $field_id = $this->getKeyId('field_id');
  370. $model = ContentModelField::findOne($field_id);
  371. check_record_exists($model);
  372. $contentModel = ContentModel::findOne($model->model_id);
  373. check_record_exists($contentModel);
  374. $oldfield = $model->field;
  375. $is_system = $model->is_system;
  376. $postdata = Yii::$app->request->post('ContentModelField');
  377. if(Yii::$app->request->isAjax&&$model->load(Yii::$app->request->post())){
  378. $model->is_system= $contentModel->type==2?1:$is_system;
  379. $model->is_unique = intval($postdata['is_unique']);
  380. $model->is_base = intval($postdata['is_base']);
  381. $model->is_search = intval($postdata['is_search']);
  382. $model->is_add = intval($postdata['is_add']);
  383. $model->is_fullsearch = intval($postdata['is_fullsearch']);
  384. $model->is_add_admin = intval($postdata['is_add_admin']);
  385. $model->is_omnipotent = intval($postdata['is_omnipotent']);
  386. $model->is_listshow = intval($postdata['is_listshow']);
  387. $model->is_position = intval($postdata['is_position']);
  388. require BASE_PATH.'common'.DIRECTORY_SEPARATOR.'widget'.DIRECTORY_SEPARATOR.'fields'.DIRECTORY_SEPARATOR.$model->form_type.DIRECTORY_SEPARATOR.'config.inc.php';
  389. if(empty($model->min_length)){$model->min_length = intval($field_minlength);}
  390. if(empty($model->max_length)){$model->max_length = intval($field_maxlength);}
  391. $model->setting = !empty($_POST['setting'])?array2string($_POST['setting']):'';
  392. if($_POST['setting']['field_type'])$field_type = $_POST['setting']['field_type'];
  393. $model->unset_group_ids = !empty($_POST['unset_group_ids'])?join(",",$_POST['unset_group_ids']):'';
  394. $model->unset_role_ids = !empty($_POST['unset_role_ids'])?join(",",$_POST['unset_role_ids']):'';
  395. if(!$model->validate())
  396. {
  397. $msgdata = ['error' => 1,'msg' => $model->returnFirstError()];
  398. }
  399. else
  400. {
  401. if($model->save())
  402. {
  403. if(in_array($model->form_type,array('image','downfile')))
  404. {
  405. $model->max_length = $field_maxlength;
  406. }
  407. if($this->_editField(['field_type'=>$field_type,'field'=>$model->field,'max_length'=>$model->max_length,'table_name'=>$contentModel->table_name,'is_system'=>$model->is_system,'oldfield'=>$oldfield,'contentmodel_type'=>$contentModel->type])===true)
  408. {
  409. $msgdata = ['error' => 0,'msg' => '操作成功'];
  410. }
  411. else
  412. {
  413. $msgdata = ['error' => 1,'msg' => '操作失败'];
  414. }
  415. }
  416. else
  417. {
  418. $msgdata = ['error' => 1,'msg' => '操作失败'];
  419. }
  420. }
  421. echo_json($msgdata);
  422. }
  423. return $this->renderAjax('editfield',array('model'=>$model,'contentModel'=>$contentModel));
  424. }
  425. private function _addField($config)
  426. {
  427. extract($config);
  428. $default_value = isset($_POST['setting']['default_value']) ? new_add_slashes($_POST['setting']['default_value']) : '';
  429. //正整数 UNSIGNED && SIGNED
  430. $min_number = isset($_POST['setting']['min_number']) ? $_POST['setting']['min_number'] : 1;
  431. $decimal_digits = isset($_POST['setting']['decimal_digits']) ? $_POST['setting']['decimal_digits'] : '';
  432. if($decimal_digits<0)$decimal_digits=0;
  433. $save_format = isset($_POST['setting']['save_format']) ? $_POST['setting']['save_format'] : 'datetime';//日期保存格式
  434. if($contentmodel_type==2)//用户模型
  435. {
  436. $table_name = Yii::$app->db->tablePrefix.$table_name;
  437. }
  438. else
  439. {
  440. $table_name = $is_system?Yii::$app->db->tablePrefix.$table_name:Yii::$app->db->tablePrefix.$table_name.'_data';
  441. }
  442. switch($field_type) {
  443. case 'varchar':
  444. if(!isset($max_length)||empty($max_length)) $max_length = 255;
  445. $sql = "ALTER TABLE `$table_name` ADD `$field` VARCHAR( $max_length ) NOT NULL DEFAULT '$default_value'";
  446. Yii::$app->db->createCommand($sql)->execute();
  447. break;
  448. case 'tinyint':
  449. if(!isset($max_length)||empty($max_length)) $max_length = 3;
  450. $min_number = intval($min_number);
  451. $default_value = intval($default_value);
  452. $sql = "ALTER TABLE `$table_name` ADD `$field` TINYINT( $max_length ) ".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  453. Yii::$app->db->createCommand($sql)->execute();
  454. break;
  455. case 'number':
  456. if(!isset($max_length)||empty($max_length)) $max_length = 10;
  457. $min_number = intval($min_number);
  458. $default_value = $decimal_digits == 0 ? intval($default_value) : floatval($default_value);
  459. if($decimal_digits==0)
  460. {
  461. $sql = "ALTER TABLE `$table_name` ADD `$field` INT( $max_length )".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  462. }
  463. else
  464. {
  465. $sql = "ALTER TABLE `$table_name` ADD `$field` DECIMAL ( $max_length,$decimal_digits )".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  466. }
  467. Yii::$app->db->createCommand($sql)->execute();
  468. break;
  469. case 'smallint':
  470. if(!isset($max_length)||empty($max_length)) $max_length = 5;
  471. $min_number = intval($min_number);
  472. $sql = "ALTER TABLE `$table_name` ADD `$field` SMALLINT( $max_length )".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL";
  473. Yii::$app->db->createCommand($sql)->execute();
  474. break;
  475. case 'int':
  476. if(!isset($max_length)||empty($max_length)) $max_length = 10;
  477. $min_number = intval($min_number);
  478. $default_value = intval($default_value);
  479. $sql = "ALTER TABLE `$table_name` ADD `$field` INT( $max_length )".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  480. Yii::$app->db->createCommand($sql)->execute();
  481. break;
  482. case 'mediumint':
  483. if(!isset($max_length)||empty($max_length)) $max_length = 8;
  484. $min_number = intval($min_number);
  485. $default_value = intval($default_value);
  486. $sql = "ALTER TABLE `$table_name` ADD `$field` INT( $max_length )".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  487. Yii::$app->db->createCommand($sql)->execute();
  488. break;
  489. case 'mediumtext':
  490. $sql = "ALTER TABLE `$table_name` ADD `$field` MEDIUMTEXT NULL";
  491. Yii::$app->db->createCommand($sql)->execute();
  492. break;
  493. case 'text':
  494. $sql = "ALTER TABLE `$table_name` ADD `$field` TEXT NOT NULL";
  495. Yii::$app->db->createCommand($sql)->execute();
  496. break;
  497. case 'datetime':
  498. if($save_format=='int')$save_format='bigint(20)';
  499. $sql = "ALTER TABLE `$table_name` ADD `$field` $save_format NULL";
  500. Yii::$app->db->createCommand($sql)->execute();
  501. break;
  502. //特殊自定义字段
  503. case 'pages':
  504. $sql = "ALTER TABLE `$table_name` ADD `pagination_type` TINYINT( 1 ) NOT NULL DEFAULT '0'";
  505. Yii::$app->db->createCommand($sql)->execute();
  506. $sql = "ALTER TABLE `$table_name` ADD `maxchar_perpage` MEDIUMINT( 6 ) NOT NULL DEFAULT '0'";
  507. Yii::$app->db->createCommand($sql)->execute();
  508. break;
  509. case 'read_price':
  510. $default_value = intval($default_value);
  511. $sql = "ALTER TABLE `$table_name` ADD `read_price` decimal(12,2) unsigned NOT NULL default '$default_value'";
  512. Yii::$app->db->createCommand($sql)->execute();
  513. $sql = "ALTER TABLE `$table_name` ADD `pay_type` tinyint(1) unsigned NOT NULL default '0'";
  514. Yii::$app->db->createCommand($sql)->execute();
  515. break;
  516. }
  517. return true;
  518. }
  519. private function _editField($config)
  520. {
  521. extract($config);
  522. $default_value = isset($_POST['setting']['default_value']) ? new_add_slashes($_POST['setting']['default_value']) : '';
  523. //正整数 UNSIGNED && SIGNED
  524. $min_number = isset($_POST['setting']['min_number']) ? $_POST['setting']['min_number'] : 1;
  525. $decimal_digits = isset($_POST['setting']['decimal_digits']) ? $_POST['setting']['decimal_digits'] : '';
  526. if($decimal_digits<0)$decimal_digits=0;
  527. $save_format = isset($_POST['setting']['save_format']) ? $_POST['setting']['save_format'] : 'datetime';//日期保存格式
  528. if($contentmodel_type==2)//用户模型
  529. {
  530. $table_name = Yii::$app->db->tablePrefix.$table_name;
  531. }
  532. else
  533. {
  534. $table_name = $is_system?Yii::$app->db->tablePrefix.$table_name:Yii::$app->db->tablePrefix.$table_name.'_data';
  535. }
  536. switch($field_type) {
  537. case 'varchar':
  538. if(empty($max_length)) $max_length = 255;
  539. $form_type = 'VARCHAR';
  540. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` $form_type( $max_length ) NOT NULL DEFAULT '$default_value'";
  541. Yii::$app->db->createCommand($sql)->execute();
  542. break;
  543. case 'tinyint':
  544. if(empty($max_length)) $max_length = 3;
  545. $min_number = intval($min_number);
  546. $default_value = intval($default_value);
  547. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` TINYINT( $max_length ) ".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  548. Yii::$app->db->createCommand($sql)->execute();
  549. break;
  550. case 'number':
  551. if(empty($max_length)) $max_length = 10;
  552. $min_number = intval($min_number);
  553. $default_value = $decimal_digits == 0 ? intval($default_value) : floatval($default_value);
  554. if($decimal_digits==0)
  555. {
  556. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` INT($max_length)".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  557. }
  558. else
  559. {
  560. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` DECIMAL ( $max_length,$decimal_digits )".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  561. }
  562. Yii::$app->db->createCommand($sql)->execute();
  563. break;
  564. case 'smallint':
  565. if(empty($max_length)) $max_length = 5;
  566. $min_number = intval($min_number);
  567. $default_value = intval($default_value);
  568. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` SMALLINT($max_length)".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  569. Yii::$app->db->createCommand($sql)->execute();
  570. break;
  571. case 'mediumint':
  572. if(empty($max_length)) $max_length = 8;
  573. $min_number = intval($min_number);
  574. $default_value = intval($default_value);
  575. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` MEDIUMINT($max_length)".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  576. Yii::$app->db->createCommand($sql)->execute();
  577. break;
  578. case 'int':
  579. if(empty($max_length)) $max_length = 10;
  580. $min_number = intval($min_number);
  581. $default_value = intval($default_value);
  582. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` INT($max_length)".($min_number >= 0 ? 'UNSIGNED' : '')." NOT NULL DEFAULT '$default_value'";
  583. Yii::$app->db->createCommand($sql)->execute();
  584. break;
  585. case 'mediumtext':
  586. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` MEDIUMTEXT NULL";
  587. Yii::$app->db->createCommand($sql)->execute();
  588. break;
  589. case 'text':
  590. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` TEXT NOT NULL";
  591. Yii::$app->db->createCommand($sql)->execute();
  592. break;
  593. case 'datetime':
  594. if($save_format=='int')$save_format='bigint(20)';
  595. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` $save_format";
  596. Yii::$app->db->createCommand($sql)->execute();
  597. break;
  598. //特殊自定义字段
  599. case 'pages':
  600. break;
  601. case 'read_price':
  602. $default_value = intval($default_value);
  603. $sql = "ALTER TABLE `$table_name` CHANGE `$oldfield` `$field` decimal(12,2) unsigned NOT NULL default '$default_value'";
  604. Yii::$app->db->createCommand($sql)->execute();
  605. break;
  606. }
  607. return true;
  608. }
  609. //删除字段
  610. public function actionDelfield()
  611. {
  612. $field_id = $this->getKeyId('field_id');
  613. $model = ContentModelField::findOne($field_id);
  614. check_record_exists($model);
  615. $contentModel = ContentModel::findOne($model->model_id);
  616. if($model->delete())
  617. {
  618. if($contentModel->type==2)
  619. {
  620. $tablename = Yii::$app->db->tablePrefix.$contentModel->table_name;
  621. }
  622. else
  623. {
  624. $tablename = $model->is_system?Yii::$app->db->tablePrefix.$contentModel->table_name:Yii::$app->db->tablePrefix.$contentModel->table_name.'_data';
  625. }
  626. $field = $model->field;
  627. if($model->form_type=='pages')
  628. {
  629. $sql = "ALTER TABLE `$tablename` DROP `pagination_type`";
  630. Yii::$app->db->createCommand($sql)->execute();
  631. $sql = "ALTER TABLE `$tablename` DROP `maxchar_perpage`";
  632. Yii::$app->db->createCommand($sql)->execute();
  633. }
  634. else
  635. {
  636. $sql = "ALTER TABLE `$tablename` DROP `$field`";
  637. Yii::$app->db->createCommand($sql)->execute();
  638. }
  639. $msgdata = ['error' => 0,'msg' => '成功'];
  640. }
  641. else
  642. {
  643. $msgdata = ['error' => 1,'msg' => '失败'];
  644. }
  645. echo_json($msgdata);
  646. }
  647. //批量排序
  648. public function actionSortfield()
  649. {
  650. $model_id = $this->getKeyId('model_id');
  651. $contentModel = ContentModel::findOne($model_id);
  652. check_record_exists($contentModel);
  653. $canChangeFields = array();
  654. $canChangeDataFields = array();
  655. $tableName = '';
  656. $tableName1 = '';
  657. $orderRs = array();
  658. $orderRs1 = array();
  659. $resultList = ContentModelField::findAll(['model_id'=>$model_id]);
  660. if(is_array($resultList))foreach($resultList as $result)
  661. {
  662. if($result->is_system)
  663. {
  664. $tableName = Yii::$app->db->tablePrefix.$contentModel->table_name;
  665. $orderRs[$result->field] = $result->list_order;
  666. $canChangeFields[] = $result->field;
  667. }
  668. else
  669. {
  670. $tableName1 = Yii::$app->db->tablePrefix.$contentModel->table_name.'_data';
  671. $orderRs1[$result->field] = $result->list_order;
  672. $canChangeDataFields[] = $result->field;
  673. }
  674. }
  675. $fieldList = array();
  676. $realOrder = array();
  677. $sql = "show full columns from ".$tableName."";
  678. $resultList = Yii::$app->db->createCommand($sql)->queryAll();
  679. if(is_array($resultList))foreach($resultList as $result)
  680. {
  681. $realOrder[$result['Field']] = $orderRs[$result['Field']];
  682. $fieldList[$result['Field']] = array('type'=>$result['Type'],'null'=>$result['Null'],'collation'=>$result['Collation'],'default'=>$result['Default']);
  683. }
  684. $fieldList1 = array();
  685. $realOrder1 = array();
  686. if(!empty($tableName1))
  687. {
  688. $sql = "show full columns from ".$tableName1."";
  689. $resultList = Yii::$app->db->createCommand($sql)->queryAll();
  690. if(is_array($resultList))foreach($resultList as $result)
  691. {
  692. $realOrder1[$result['Field']] = $orderRs1[$result['Field']];
  693. $fieldList1[$result['Field']] = array('type'=>$result['Type'],'null'=>$result['Null'],'collation'=>$result['Collation'],'default'=>$result['Default']);
  694. }
  695. }
  696. $orderRs = $realOrder;
  697. $orderRs1 = $realOrder1;
  698. asort($orderRs);
  699. asort($orderRs1);
  700. for($i=0;$i<count($orderRs);$i++)
  701. {
  702. $tempRs = array_keys(array_slice($orderRs,$i,1));
  703. $tempRs1 = array_keys(array_slice($orderRs,$i+1,1));
  704. if(!empty($tempRs)&&!empty($tempRs1))
  705. {
  706. if(!in_array($tempRs1[0],$canChangeFields))continue;
  707. $fieldInfo = $fieldList[$tempRs1[0]];
  708. $sql="ALTER TABLE ".$tableName." change `".$tempRs1[0]."` `".$tempRs1[0]."` ".$fieldInfo['type']." ";
  709. if($fieldInfo['null']=='NO')
  710. {
  711. $sql.=" NOT NULL ";
  712. if(!is_null($fieldInfo['default']))
  713. {
  714. if(!is_int($fieldInfo['default']))
  715. {
  716. $sql.=" default '".$fieldInfo['default']."' ";
  717. }
  718. else
  719. {
  720. $sql.=" default ".$fieldInfo['default']." ";
  721. }
  722. }
  723. }
  724. $sql.="AFTER ".$tempRs[0].";";
  725. }
  726. Yii::$app->db->createCommand($sql)->execute();
  727. }
  728. for($i=0;$i<count($orderRs1);$i++)
  729. {
  730. $tempRs = array_keys(array_slice($orderRs1,$i,1));
  731. $tempRs1 = array_keys(array_slice($orderRs1,$i+1,1));
  732. if(!empty($tempRs)&&!empty($tempRs1))
  733. {
  734. if(!in_array($tempRs1[0],$canChangeDataFields))continue;
  735. $fieldInfo = $fieldList1[$tempRs1[0]];
  736. $sql="ALTER TABLE ".$tableName1." change `".$tempRs1[0]."` `".$tempRs1[0]."` ".$fieldInfo['type']." ";
  737. if($fieldInfo['null']=='NO')
  738. {
  739. $sql.=" NOT NULL ";
  740. if(!is_null($fieldInfo['default']))
  741. {
  742. if(!is_int($fieldInfo['default']))
  743. {
  744. $sql.=" default '".$fieldInfo['default']."' ";
  745. }
  746. else
  747. {
  748. $sql.=" default ".$fieldInfo['default']." ";
  749. }
  750. }
  751. }
  752. $sql.="AFTER ".$tempRs[0]."";
  753. }
  754. Yii::$app->db->createCommand($sql)->execute();
  755. }
  756. $msgdata = ['error' => 0,'msg' => '表结构修改成功'];
  757. echo_json($msgdata);
  758. }
  759. }