| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- <?php
- namespace app\admin\model\cms;
- use addons\cms\library\FulltextSearch;
- use addons\cms\library\MeiliSearch;
- use addons\cms\library\Service;
- use think\facade\Config;
- use think\facade\Db;
- use think\facade\Event;
- use think\Model;
- class Cms extends Model
- {
- protected $autoWriteTimestamp = true;
- protected $ext_table = '_data';
- protected $name = 'cms_field';
- protected static $config = [];
- protected static function init()
- {
- self::$config = get_addon_config('cms');
- }
- protected function physicalTableName($tableName)
- {
- $prefix = Config::get('database.connections.mysql.prefix', '');
- return strpos($tableName, $prefix) === 0 ? $tableName : $prefix . $tableName;
- }
- protected function getTableColumns($tableName)
- {
- static $cache = [];
- $tableName = $this->physicalTableName($tableName);
- if (!isset($cache[$tableName])) {
- $columns = Db::getFields($tableName);
- $cache[$tableName] = array_map('strtolower', array_keys($columns));
- }
- return $cache[$tableName];
- }
- protected function hasColumn($tableName, $column)
- {
- return in_array(strtolower($column), $this->getTableColumns($tableName), true);
- }
- protected function filterDataByColumns(array $data, array $columns)
- {
- $result = [];
- foreach ($data as $key => $value) {
- if (in_array(strtolower($key), $columns, true)) {
- $result[$key] = $value;
- }
- }
- return $result;
- }
- protected function getLangWhere($extTableName, $id, $lang)
- {
- $where = ['did' => $id];
- if ($this->hasColumn($extTableName, 'lang')) {
- $where['lang'] = $lang;
- }
- return $where;
- }
- protected function isChineseLang($lang)
- {
- return in_array(strtolower((string) $lang), ['cn', 'zh', 'zh-cn'], true);
- }
- protected function getChineseTitleFromExtTable($extTableName, $id, $lang, array $dataExt, array $extColumns)
- {
- if ($this->isChineseLang($lang) && array_key_exists('title', $dataExt)) {
- return $dataExt['title'];
- }
- if (!in_array('lang', $extColumns, true)) {
- return null;
- }
- $row = Db::table($extTableName)->where('did', $id)->where('lang', 'in', ['cn', 'zh', 'zh-cn'])->orderRaw("field(lang,'cn','zh','zh-cn')")->find();
- return $row && array_key_exists('title', $row) ? $row['title'] : null;
- }
- protected function splitLangFields(array $data, array $dataExt = [], $lang = 'cn', array $mainColumns = [], array $extColumns = [])
- {
- $defaultLang = Db::name('lang')->where('is_default', 1)->value('mark') ?: 'cn';
- $langFields = ['title', 'keywords', 'description', 'tags'];
- foreach ($langFields as $field) {
- if (!array_key_exists($field, $data)) {
- continue;
- }
- $value = $data[$field];
- $mainHas = in_array(strtolower($field), $mainColumns, true);
- $extHas = in_array(strtolower($field), $extColumns, true);
- if ($extHas) {
- $dataExt[$field] = $value;
- }
- if (!$mainHas || $lang !== $defaultLang) {
- unset($data[$field]);
- }
- }
- return [$data, $dataExt];
- }
- public function addModelData($data, $dataExt = [], $lang = 'cn')
- {
- $catid = (int) $data['catid'];
- $category = Category::find($catid);
- $modelid = $category['modelid'];
- $eventResult = Event::trigger('cms_content_add', [$data, $dataExt]);
- if ($eventResult) {
- [$data, $dataExt] = array_map('array_merge', [$data, $dataExt], ...$eventResult);
- }
- $tablename = $this->physicalTableName(Models::where('id', $modelid)->value('tablename'));
- $extTableName = $tablename . $this->ext_table;
- $mainColumns = $this->getTableColumns($tablename);
- $extColumns = $this->getTableColumns($extTableName);
- Service::getAfterText($data, $dataExt);
- [$data, $dataExt] = $this->splitLangFields($data, $dataExt, $lang, $mainColumns, $extColumns);
- $data['admin_id'] = session('admin.id') ?: 0;
- [$data, $dataExt] = Service::dealModelPostData($modelid, $data, $dataExt);
- $data = $this->filterDataByColumns($data, $mainColumns);
- $dataExt = $this->filterDataByColumns($dataExt, $extColumns);
- if (!isset($data['publish_time'])) {
- $data['publish_time'] = request()->time();
- }
- $data['create_time'] = request()->time();
- $data['update_time'] = request()->time();
- try {
- $id = Db::table($tablename)->insertGetId($data);
- if (!empty($dataExt['tags'])) {
- $this->tagDispose($dataExt['tags'], $id, $catid, $modelid);
- }
- if (!empty($dataExt)) {
- $dataExt['did'] = $id;
- if (in_array('lang', $extColumns, true)) {
- $dataExt['lang'] = $lang;
- $whereExt = $this->getLangWhere($extTableName, $id, $lang);
- $exists = Db::table($extTableName)->where($whereExt)->find();
- if ($exists) {
- Db::table($extTableName)->where($whereExt)->update($dataExt);
- } else {
- Db::table($extTableName)->insert($dataExt);
- }
- } else {
- $exists = Db::table($extTableName)->where(['did' => $id])->find();
- if ($exists) {
- Db::table($extTableName)->where(['did' => $id])->update($dataExt);
- } else {
- Db::table($extTableName)->insert($dataExt);
- }
- }
- }
- } catch (\Exception $e) {
- throw new \Exception($e->getMessage());
- }
- $category->inc('items')->save();
- if (self::$config['site_weburlpush']) {
- hook('weburlpush', buildContentUrl($catid, $id, $data['url'] ?? '', true, true));
- }
- if (self::$config['site_searchtype'] === 'xunsearch') {
- FulltextSearch::update($modelid, $catid, $id, $data, $dataExt);
- }
- if (self::$config['site_searchtype'] === 'meilisearch') {
- MeiliSearch::update($modelid, $catid, $id, $data, $dataExt);
- }
- return $id;
- }
- public function editModelData($data, $dataExt = [], $lang = 'cn')
- {
- $catid = (int) $data['catid'];
- $id = (int) $data['id'];
- $category = Category::find($catid);
- $modelid = $category['modelid'];
- $eventResult = Event::trigger('cms_content_edit', [$data, $dataExt]);
- if ($eventResult) {
- [$data, $dataExt] = array_map('array_merge', [$data, $dataExt], ...$eventResult);
- }
- $tablename = $this->physicalTableName(Models::where('id', $modelid)->value('tablename'));
- $extTableName = $tablename . $this->ext_table;
- $mainColumns = $this->getTableColumns($tablename);
- $extColumns = $this->getTableColumns($extTableName);
- Service::getAfterText($data, $dataExt);
- [$data, $dataExt] = $this->splitLangFields($data, $dataExt, $lang, $mainColumns, $extColumns);
- $defaultLang = Db::name('lang')->where('is_default', 1)->value('mark') ?: 'cn';
- if (!empty($dataExt['tags'])) {
- $this->tagDispose($dataExt['tags'], $id, $catid, $modelid);
- } else {
- $this->tagDispose([], $id, $catid, $modelid);
- }
- [$data, $dataExt] = Service::dealModelPostData($modelid, $data, $dataExt);
- $data = $this->filterDataByColumns($data, $mainColumns);
- $dataExt = $this->filterDataByColumns($dataExt, $extColumns);
- if (in_array('title', $mainColumns, true) && in_array('title', $extColumns, true)) {
- $chineseTitle = $this->getChineseTitleFromExtTable($extTableName, $id, $lang, $dataExt, $extColumns);
- if ($chineseTitle !== null) {
- $data['title'] = $chineseTitle;
- }
- }
- if ($lang !== $defaultLang) {
- foreach (['keywords', 'description', 'tags'] as $field) {
- unset($data[$field]);
- }
- }
- if (!isset($data['update_time'])) {
- $data['update_time'] = request()->time();
- }
- $info = Db::table($tablename)->where('id', $id)->find();
- if (empty($info)) {
- throw new \Exception('该信息不存在!');
- }
- Db::table($tablename)->where('id', $id)->update($data);
- if (!empty($dataExt)) {
- $whereExt = $this->getLangWhere($extTableName, $id, $lang);
- $exists = Db::table($extTableName)->where($whereExt)->find();
- if ($exists) {
- Db::table($extTableName)->where($whereExt)->update($dataExt);
- } else {
- $dataExt['did'] = $id;
- if (in_array('lang', $extColumns, true)) {
- $dataExt['lang'] = $lang;
- }
- Db::table($extTableName)->insert($dataExt);
- }
- }
- if ($info['sysadd'] == 0) {
- CmsContent::where('catid', $catid)->where('content_id', $id)->update(['status' => $data['status']]);
- }
- if (self::$config['site_searchtype'] === 'xunsearch') {
- FulltextSearch::update($modelid, $catid, $id, $data, $dataExt);
- }
- if (self::$config['site_searchtype'] === 'meilisearch') {
- MeiliSearch::update($modelid, $catid, $id, $data, $dataExt);
- }
- }
- public function deleteModelData($catid, $id, $no_delete = false)
- {
- $category = Category::find($catid);
- if (empty($category)) {
- throw new \Exception('栏目不存在!');
- }
- $modelid = $category['modelid'];
- $model = Models::where('id', $modelid)->find();
- $tableName = $this->physicalTableName($model['tablename']);
- $data = Db::table($tableName)->where('id', $id)->find();
- if (empty($data)) {
- throw new \Exception('该信息不存在!');
- }
- if (!empty($data['tags'])) {
- $this->tagDispose([], $data['id'], $data['catid'], $modelid);
- }
- if ($no_delete) {
- Db::table($tableName)->where('id', $id)->update(['status' => -1]);
- } else {
- Db::table($tableName)->where('id', $id)->delete();
- if (2 == $model['type']) {
- Db::table($tableName . $this->ext_table)->where('did', $id)->delete();
- }
- if ($category['items']) {
- $category->dec('items')->save();
- }
- }
- if ($data['sysadd'] == 0) {
- CmsContent::where('catid', $data['catid'])->where('content_id', $data['id'])->delete();
- }
- if (self::$config['site_searchtype'] === 'xunsearch') {
- FulltextSearch::del($data['catid'], $id);
- }
- if (self::$config['site_searchtype'] === 'meilisearch') {
- MeiliSearch::del($data['catid'], $id);
- }
- }
- private function tagDispose($tags, $id, $catid, $modelid)
- {
- if (!empty($tags)) {
- $keyword = strpos($tags, ',') === false ? explode(' ', $tags) : explode(',', $tags);
- $keyword = array_unique($keyword);
- if ('add' == request()->action()) {
- (new Tags)->addTag($keyword, $id, $catid);
- } else {
- (new Tags)->updata($keyword, $id, $catid);
- }
- } else {
- (new Tags)->deleteAll($id, $catid);
- }
- }
- }
|