ModelField.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // |
  4. // +----------------------------------------------------------------------
  5. // |
  6. // +----------------------------------------------------------------------
  7. // |
  8. // +----------------------------------------------------------------------
  9. // |
  10. // +----------------------------------------------------------------------
  11. // +----------------------------------------------------------------------
  12. // | 字段模型
  13. // +----------------------------------------------------------------------
  14. namespace app\admin\model\cms;
  15. use think\Exception;
  16. use think\facade\Db;
  17. use think\Model;
  18. /**
  19. * 字段模型
  20. */
  21. class ModelField extends Model
  22. {
  23. protected $name = 'cms_field';
  24. protected $autoWriteTimestamp = true;
  25. public function getSettingAttr($value, $data)
  26. {
  27. return is_array($value) ? $value : (array) json_decode($data['setting'], true);
  28. }
  29. public function setSettingAttr($value)
  30. {
  31. return is_array($value) ? json_encode($value) : $value;
  32. }
  33. public static function onBeforeWrite($row)
  34. {
  35. if ($row['ifrequire'] && 0 == $row['isadd']) {
  36. throw new Exception("必填字段不可以设置为隐藏!");
  37. }
  38. if (!$row['isadd'] && $row['ifrequire']) {
  39. throw new Exception("隐藏字段不可以设置为必填!");
  40. }
  41. $changedData = $row->getChangedData();
  42. if (isset($changedData['setting']) || isset($changedData['name']) || isset($changedData['title']) || isset($changedData['ifsystem'])) {
  43. //判断字段名唯一性:同一模型、同一表侧(主表/附表)内唯一,允许主附表同名字段并存
  44. if (ModelField::where('name', $row['name'])
  45. ->where('modelid', $row['modelid'])
  46. ->where('ifsystem', $row['ifsystem'])
  47. ->where('id', '<>', $row['id'])
  48. ->find()) {
  49. throw new Exception("字段'" . $row['name'] . "'已经存在");
  50. }
  51. }
  52. cms_cache('ModelField', null);
  53. }
  54. //更新前
  55. public static function onBeforeUpdate($row)
  56. {
  57. $changedData = $row->getChangedData();
  58. if (isset($changedData['name']) || isset($changedData['setting'])) {
  59. if ($row['setting']['value'] === '') {
  60. $default = '';
  61. } elseif (strstr(strtolower($row['setting']['define']), 'text') || strstr(strtolower($row['setting']['define']), 'blob')) {
  62. $default = '';
  63. } else {
  64. $default = " DEFAULT '{$row['setting']['value']}'";
  65. }
  66. $tablename = self::getModelTableName($row['modelid'], $row['ifsystem']);
  67. $sql = <<<EOF
  68. ALTER TABLE `{$tablename}`
  69. CHANGE COLUMN `{$row->getOrigin('name')}` `{$row['name']}` {$row['setting']['define']} {$default} COMMENT '{$row['title']}';
  70. EOF;
  71. try {
  72. Db::execute($sql);
  73. } catch (Exception $e) {
  74. throw new Exception($e->getMessage());
  75. }
  76. }
  77. }
  78. //新增前
  79. public static function onBeforeInsert($row)
  80. {
  81. if ($row['setting']['value'] === '') {
  82. $default = '';
  83. } elseif (strstr(strtolower($row['setting']['define']), 'text') || strstr(strtolower($row['setting']['define']), 'blob')) {
  84. $default = '';
  85. } else {
  86. $default = " DEFAULT '{$row['setting']['value']}'";
  87. }
  88. $tablename = self::getModelTableName($row['modelid'], $row['ifsystem']);
  89. $sql = <<<EOF
  90. ALTER TABLE `{$tablename}`
  91. ADD COLUMN `{$row['name']}` {$row['setting']['define']} {$default} COMMENT '{$row['title']}';
  92. EOF;
  93. try {
  94. Db::execute($sql);
  95. } catch (Exception $e) {
  96. throw new Exception($e->getMessage());
  97. }
  98. }
  99. public static function onBeforeDelete($row)
  100. {
  101. $tablename = self::getModelTableName($row['modelid'], $row['ifsystem']);
  102. //判断是否允许删除
  103. $sql = <<<EOF
  104. ALTER TABLE `{$tablename}`
  105. DROP COLUMN `{$row['name']}`;
  106. EOF;
  107. Db::execute($sql);
  108. cms_cache('ModelField', null);
  109. }
  110. /**
  111. * 根据模型ID,返回表名
  112. * @param type $modelid
  113. * @param type $modelid
  114. * @return string
  115. */
  116. protected static function getModelTableName($modelid, $ifsystem = 1)
  117. {
  118. $model = Models::find($modelid);
  119. if (!$model) {
  120. throw new Exception("未找到指定模型表");
  121. }
  122. //完整表名获取 判断主表 还是副表
  123. $tablename = self::getConfig('prefix') . ($ifsystem ? $model['tablename'] : $model['tablename'] . "_data");
  124. return $tablename;
  125. }
  126. }