Diyform.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <?php
  2. namespace app\admin\model\cms;
  3. use think\Config;
  4. use think\Db;
  5. use think\Exception;
  6. use think\Model;
  7. class Diyform extends Model
  8. {
  9. // 表名
  10. protected $name = 'cms_diyform';
  11. // 自动写入时间戳字段
  12. protected $autoWriteTimestamp = 'int';
  13. // 定义时间戳字段名
  14. protected $createTime = 'createtime';
  15. protected $updateTime = 'updatetime';
  16. // 追加属性
  17. protected $append = [
  18. 'url'
  19. ];
  20. protected static $config = [];
  21. public static function init()
  22. {
  23. self::$config = $config = get_addon_config('cms');
  24. self::beforeInsert(function ($row) {
  25. if (!isset($row['admin_id']) || !$row['admin_id']) {
  26. $admin_id = session('admin.id');
  27. $row['admin_id'] = $admin_id ? $admin_id : 0;
  28. }
  29. if (!preg_match("/^([a-z0-9_]+)$/", $row['table'])) {
  30. throw new Exception("表名只支持小写字母、数字、下划线");
  31. }
  32. $exist = Diyform::where('table', $row['table'])->find();
  33. if ($exist) {
  34. throw new Exception("已经存在相同表名的模型");
  35. }
  36. $info = null;
  37. try {
  38. $info = Db::name($row['table'])->getTableInfo();
  39. } catch (\Exception $e) {
  40. }
  41. if ($info) {
  42. throw new Exception("数据表已经存在");
  43. }
  44. });
  45. self::afterInsert(function ($row) {
  46. $prefix = Config::get('database.prefix');
  47. $sql = "CREATE TABLE `{$prefix}{$row['table']}` (
  48. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  49. `user_id` int(10) DEFAULT NULL COMMENT '会员ID',
  50. `title` varchar(255) DEFAULT '' COMMENT '标题',
  51. `images` varchar(1500) DEFAULT '' COMMENT '图片',
  52. `content` text DEFAULT NULL COMMENT '内容',
  53. `createtime` bigint(16) DEFAULT NULL COMMENT '添加时间',
  54. `updatetime` bigint(16) DEFAULT NULL COMMENT '更新时间',
  55. `memo` varchar(1500) DEFAULT '' COMMENT '备注',
  56. `status` enum('normal','hidden','rejected') DEFAULT 'hidden' COMMENT '状态',
  57. PRIMARY KEY (`id`),
  58. KEY `user_id` (`user_id`),
  59. KEY `createtime` (`createtime`)
  60. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='{$row['name']}'";
  61. try {
  62. Db::execute($sql);
  63. } catch (\Exception $e) {
  64. throw new Exception("发生错误:" . $e->getMessage());
  65. }
  66. $time = time();
  67. $fieldsArr = [
  68. [
  69. "source" => "diyform",
  70. "source_id" => $row['id'],
  71. "name" => "title",
  72. "type" => "string",
  73. "title" => "标题",
  74. "content" => "value1|title1\r\nvalue2|title2",
  75. "length" => 255,
  76. "iscontribute" => 1,
  77. "isfilter" => 0,
  78. "weigh" => 3,
  79. "defaultvalue" => '',
  80. "createtime" => $time,
  81. "updatetime" => $time,
  82. "status" => "normal"
  83. ],
  84. [
  85. "source" => "diyform",
  86. "source_id" => $row['id'],
  87. "name" => "images",
  88. "type" => "images",
  89. "title" => "图片",
  90. "content" => "value1|title1\r\nvalue2|title2",
  91. "length" => 1500,
  92. "iscontribute" => 1,
  93. "isfilter" => 0,
  94. "weigh" => 2,
  95. "defaultvalue" => '',
  96. "createtime" => $time,
  97. "updatetime" => $time,
  98. "status" => "normal"
  99. ],
  100. [
  101. "source" => "diyform",
  102. "source_id" => $row['id'],
  103. "name" => "content",
  104. "type" => "editor",
  105. "title" => "内容",
  106. "content" => "value1|title1\r\nvalue2|title2",
  107. "length" => 0,
  108. "iscontribute" => 1,
  109. "isfilter" => 0,
  110. "weigh" => 1,
  111. "defaultvalue" => '',
  112. "createtime" => $time,
  113. "updatetime" => $time,
  114. "status" => "normal"
  115. ],
  116. ];
  117. Db::name("cms_fields")->insertAll($fieldsArr);
  118. });
  119. }
  120. public function getUrlAttr($value, $data)
  121. {
  122. return $this->buildUrl($value, $data);
  123. }
  124. public function getFullurlAttr($value, $data)
  125. {
  126. return $this->buildUrl($value, $data, true);
  127. }
  128. private function buildUrl($value, $data, $domain = false)
  129. {
  130. $diyname = isset($data['diyname']) && $data['diyname'] ? $data['diyname'] : $data['id'];
  131. $time = $data['createtime'] ?? time();
  132. $vars = [
  133. ':id' => $data['id'],
  134. ':diyname' => $diyname,
  135. ':year' => date("Y", $time),
  136. ':month' => date("m", $time),
  137. ':day' => date("d", $time)
  138. ];
  139. return addon_url('cms/diyform/index', $vars, static::$config['urlsuffix'], $domain);
  140. }
  141. public function getPosturlAttr($value, $data)
  142. {
  143. $diyname = isset($data['diyname']) && $data['diyname'] ? $data['diyname'] : $data['id'];
  144. $time = $data['createtime'] ?? time();
  145. $vars = [
  146. ':id' => $data['id'],
  147. ':diyname' => $diyname,
  148. ':year' => date("Y", $time),
  149. ':month' => date("m", $time),
  150. ':day' => date("d", $time)
  151. ];
  152. return addon_url('cms/diyform/post', $vars, static::$config['urlsuffix']);
  153. }
  154. public function getFieldsAttr($value, $data)
  155. {
  156. return is_array($value) ? $value : ($value ? explode(',', $value) : []);
  157. }
  158. public function getSettingAttr($value, $data)
  159. {
  160. return is_array($value) ? $value : (array)json_decode($data['setting'], true);
  161. }
  162. public function setSettingAttr($value)
  163. {
  164. return is_array($value) ? json_encode($value) : $value;
  165. }
  166. public function getStatusList()
  167. {
  168. return ['normal' => __('Normal'), 'hidden' => __('Hidden')];
  169. }
  170. public function getStatusTextAttr($value, $data)
  171. {
  172. $value = $value ? $value : $data['status'];
  173. $list = $this->getStatusList();
  174. return isset($list[$value]) ? $list[$value] : '';
  175. }
  176. }