Category.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. namespace app\admin\model\cms;
  3. use app\admin\model\general\Lang as LangModel;
  4. use think\Exception;
  5. use think\facade\Cache;
  6. use think\facade\Db;
  7. use think\Model;
  8. class Category extends Model
  9. {
  10. protected $name = 'cms_category';
  11. protected static $arrparent;
  12. protected static $arrchild;
  13. public function getSettingAttr($value, $data)
  14. {
  15. return is_array($value) ? $value : (array) json_decode($data['setting'], true);
  16. }
  17. public function setSettingAttr($value)
  18. {
  19. return is_array($value) ? json_encode($value, JSON_UNESCAPED_UNICODE) : $value;
  20. }
  21. public static function onAfterWrite($row)
  22. {
  23. $cmsConfig = get_addon_config('cms');
  24. if (isset($cmsConfig['site_weburlpush']) && $cmsConfig['site_weburlpush']) {
  25. hook('weburlpush', buildCatUrl($row->id, '', true, true));
  26. }
  27. if (isset($row['priv_groupid'])) {
  28. CategoryPriv::update_priv($row->id, $row->priv_groupid, 0);
  29. }
  30. Cache::set('Category', null);
  31. }
  32. public static function onAfterInsert($row)
  33. {
  34. $defaultLang = LangModel::getDefaultMark();
  35. self::saveTranslation($row->id, [
  36. 'catname' => $row->catname,
  37. 'description' => $row->description,
  38. 'meta_title' => $row->setting['meta_title'] ?? '',
  39. 'meta_keywords' => $row->setting['meta_keywords'] ?? '',
  40. 'meta_description' => $row->setting['meta_description'] ?? '',
  41. ], $defaultLang);
  42. if ($row['type'] == 1) {
  43. (new Page)->savePage([
  44. 'catid' => $row->id,
  45. 'title' => $row->catname,
  46. ], $defaultLang);
  47. }
  48. }
  49. public static function onBeforeUpdate($row)
  50. {
  51. if (isset($row['template_child']) && $row['template_child']) {
  52. $setting['category_template'] = $row['setting']['category_template'] ?? '';
  53. $setting['list_template'] = $row['setting']['list_template'] ?? '';
  54. $setting['show_template'] = $row['setting']['show_template'] ?? '';
  55. $setting['page_template'] = $row['setting']['page_template'] ?? '';
  56. $idstr = self::get_arrchildid($row->id);
  57. $children = Category::where('id', 'in', $idstr)->select();
  58. foreach ($children as $child) {
  59. $child->setting = array_merge($child->setting, $setting);
  60. $child->save();
  61. }
  62. }
  63. }
  64. public static function onAfterUpdate($row)
  65. {
  66. $changedData = $row->getChangedData();
  67. if ($row['type'] == 1 && isset($changedData['type'])) {
  68. (new Page)->savePage([
  69. 'catid' => $row->id,
  70. 'title' => $row->catname,
  71. ], LangModel::getDefaultMark());
  72. }
  73. getCategory($row->id, '', true);
  74. }
  75. public static function onBeforeDelete($row)
  76. {
  77. if (self::where('parentid', $row->id)->find()) {
  78. throw new Exception('栏目含有子栏目,不得删除!');
  79. }
  80. $catInfo = self::find($row->id);
  81. if ($catInfo['modelid'] && $catInfo['type'] == 2) {
  82. $tbname = getModel($catInfo['modelid'], 'tablename');
  83. if ($tbname && Db::name($tbname)->where(['catid' => $row->id])->find()) {
  84. throw new Exception('栏目含有信息,不得删除!');
  85. }
  86. } else {
  87. Page::where(['catid' => $row->id])->delete();
  88. }
  89. Db::name('cms_category_data')->where('catid', $row->id)->delete();
  90. Cache::set('Category', null);
  91. }
  92. public static function saveTranslation($catid, array $data, $lang)
  93. {
  94. $payload = [
  95. 'catname' => $data['catname'] ?? '',
  96. 'description' => $data['description'] ?? '',
  97. 'meta_title' => $data['meta_title'] ?? '',
  98. 'meta_keywords' => $data['meta_keywords'] ?? '',
  99. 'meta_description' => $data['meta_description'] ?? '',
  100. ];
  101. $row = CategoryData::where(['catid' => $catid, 'lang' => $lang])->find();
  102. if ($row) {
  103. $row->save($payload);
  104. } else {
  105. $payload['catid'] = $catid;
  106. $payload['lang'] = $lang;
  107. CategoryData::create($payload);
  108. }
  109. }
  110. public static function getTranslate($catid, $lang = null)
  111. {
  112. $lang = $lang ?: LangModel::getDefaultMark();
  113. $defaultLang = LangModel::getDefaultMark();
  114. $translate = CategoryData::where(['catid' => $catid, 'lang' => $lang])->find();
  115. if (!$translate && $lang !== $defaultLang) {
  116. $translate = CategoryData::where(['catid' => $catid, 'lang' => $defaultLang])->find();
  117. }
  118. return $translate;
  119. }
  120. public static function get_arrparentid($catid, $withself = false)
  121. {
  122. static $tree;
  123. if (!$tree) {
  124. $tree = \util\Tree::instance();
  125. $tree->init(Category::order('id asc')->field('id,parentid,catname')->select()->toArray(), 'parentid');
  126. }
  127. $parentIds = $tree->getParentsIds($catid, $withself);
  128. return implode(',', $parentIds);
  129. }
  130. public static function get_arrchildid($catid, $withself = false)
  131. {
  132. static $tree;
  133. if (!$tree) {
  134. $tree = \util\Tree::instance();
  135. $tree->init(Category::order('id asc')->field('id,parentid,catname')->select()->toArray(), 'parentid');
  136. }
  137. $childIds = $tree->getChildrenIds($catid, $withself);
  138. return implode(',', $childIds);
  139. }
  140. }