| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702 |
- <?php
- use think\facade\Cache;
- use think\facade\Cookie;
- use think\facade\Db;
- use think\facade\Request;
- function cms_cache($name, $value = '', $options = null)
- {
- static $cache = '';
- if (empty($cache)) {
- $cache = \addons\cms\library\Cache_factory::instance();
- }
- if ('' === $value) {
- if (false !== strpos($name, '.')) {
- $vars = explode('.', $name);
- $data = $cache->get($vars[0]);
- return is_array($data) ? $data[$vars[1]] : $data;
- }
- return $cache->get($name);
- } elseif (is_null($value)) {
- return $cache->remove($name);
- } else {
- if (is_array($options)) {
- $expire = $options['expire'] ?? null;
- } else {
- $expire = is_numeric($options) ? $options : null;
- }
- return $cache->set($name, $value, $expire);
- }
- }
- function getModel($modelid, $name = '')
- {
- if (empty($modelid) || !is_numeric($modelid)) {
- return false;
- }
- $key = 'getModel_' . $modelid;
- $cache = Cache::get($key);
- if ($cache === 'false') {
- return false;
- }
- if (empty($cache)) {
- $cache = Db::name('cms_model')->find($modelid);
- if (empty($cache)) {
- Cache::set($key, 'false', 60);
- return false;
- }
- Cache::set($key, $cache, 3600);
- }
- return is_null($name) ? $cache : $cache[$name];
- }
- function cms_enabled_regions()
- {
- static $regions = null;
- if ($regions === null) {
- $regions = Db::name('region')
- ->where('is_enabled', 1)
- ->order('is_default desc,sort asc,id asc')
- ->select()
- ->toArray();
- foreach ($regions as &$region) {
- $region['code'] = strtoupper((string)($region['code'] ?? ''));
- $region['lang'] = strtolower((string)($region['lang'] ?? ''));
- }
- unset($region);
- }
- return $regions;
- }
- function cms_default_region()
- {
- static $default = null;
- if ($default !== null) {
- return $default;
- }
- $default = Db::name('region')
- ->where('is_enabled', 1)
- ->where('is_default', 1)
- ->find();
- if (!$default) {
- $default = Db::name('region')
- ->where('is_enabled', 1)
- ->order('sort asc,id asc')
- ->find();
- }
- if ($default) {
- $default['code'] = strtoupper((string)($default['code'] ?? ''));
- $default['lang'] = strtolower((string)($default['lang'] ?? ''));
- }
- return $default ?: null;
- }
- function cms_find_region($code = '', $lang = '')
- {
- $code = strtoupper(trim((string)$code));
- $lang = strtolower(trim((string)$lang));
- foreach (cms_enabled_regions() as $region) {
- if ($code !== '' && strtoupper((string)$region['code']) === $code) {
- return $region;
- }
- }
- if ($lang !== '') {
- $defaultRegion = cms_default_region();
- if ($defaultRegion && strtolower((string)($defaultRegion['lang'] ?? '')) === $lang) {
- return $defaultRegion;
- }
- foreach (cms_enabled_regions() as $region) {
- if (strtolower((string)$region['lang']) === $lang) {
- return $region;
- }
- }
- }
- return null;
- }
- function cms_path_region_code()
- {
- static $code = null;
- if ($code !== null) {
- return $code;
- }
- $pathinfo = trim(request()->pathinfo(), '/');
- if ($pathinfo === '') {
- $code = '';
- return $code;
- }
- $segments = explode('/', $pathinfo);
- $first = strtoupper(trim((string)($segments[0] ?? '')));
- if ($first !== '' && cms_find_region($first)) {
- $code = $first;
- return $code;
- }
- $code = '';
- return $code;
- }
- function cms_current_region()
- {
- static $region = false;
- if ($region !== false) {
- return $region;
- }
- $request = request();
- $requestRegionCode = strtoupper((string)$request->param('region/s', ''));
- $cookieRegionCode = strtoupper((string)Cookie::get('site_region', ''));
- $pathRegionCode = cms_path_region_code();
- $region = null;
- if ($requestRegionCode !== '') {
- $region = cms_find_region($requestRegionCode);
- }
- if (!$region && $cookieRegionCode !== '') {
- $region = cms_find_region($cookieRegionCode);
- }
- if (!$region && $pathRegionCode !== '') {
- $region = cms_find_region($pathRegionCode);
- }
- if (!$region) {
- $region = cms_default_region();
- }
- if (!$region) {
- $defaultLang = cms_default_lang();
- $region = ['id' => 0, 'name' => strtoupper($defaultLang), 'code' => strtoupper($defaultLang), 'lang' => $defaultLang];
- }
- if (!empty($region['code'])) {
- Cookie::set('site_region', strtoupper((string)$region['code']));
- }
- $region['code'] = strtoupper((string)($region['code'] ?? ''));
- $region['lang'] = strtolower((string)($region['lang'] ?? cms_default_lang()));
- $region = $region;
- return $region;
- }
- function cms_region_lang($region, $fallback = 'cn')
- {
- $fallback = strtolower(trim((string)$fallback));
- if (is_array($region)) {
- $lang = strtolower(trim((string)($region['lang'] ?? '')));
- } else {
- $lang = '';
- }
- if ($lang !== '' && Db::name('lang')->where(['mark' => $lang, 'is_enabled' => 1])->count()) {
- return $lang;
- }
- return $fallback !== '' ? $fallback : cms_default_lang();
- }
- function cms_lang_by_region_code($regionCode = '', $fallback = 'cn')
- {
- $fallback = strtolower(trim((string)$fallback));
- $region = cms_find_region($regionCode);
- if ($region) {
- return cms_region_lang($region, $fallback);
- }
- return $fallback !== '' ? $fallback : cms_default_lang();
- }
- function cms_current_region_lang($fallback = 'cn')
- {
- $fallback = strtolower(trim((string)$fallback));
- return cms_region_lang(cms_current_region(), $fallback);
- }
- function cms_region_display_name($region)
- {
- if (!is_array($region)) {
- return '';
- }
- $name = trim((string)($region['name'] ?? ''));
- $lang = cms_region_lang($region, '');
- if ($name === '') {
- $name = strtoupper((string)($region['code'] ?? ''));
- }
- $langLabel = cms_region_lang_label($lang);
- return $name . ($langLabel ? ' (' . $langLabel . ')' : '');
- }
- function cms_region_lang_label($lang)
- {
- static $langNameMap = null;
- $lang = strtolower(trim((string)$lang));
- if ($lang === '') {
- return '';
- }
- if ($langNameMap === null) {
- $langNameMap = Db::name('lang')
- ->where('is_enabled', 1)
- ->column('name', 'mark');
- $langNameMap = array_change_key_case((array)$langNameMap, CASE_LOWER);
- }
- $label = trim((string)($langNameMap[$lang] ?? ''));
- return $label !== '' ? $label : strtoupper($lang);
- }
- function cms_region_shop_url($region, $fallback = '')
- {
- if (empty($region) || !is_array($region)) {
- return (string)$fallback;
- }
- foreach (['shopurl', 'shop_url', 'mallurl', 'mall_url', 'storeurl', 'store_url'] as $field) {
- $value = trim((string)($region[$field] ?? ''));
- if ($value !== '') {
- return $value;
- }
- }
- return (string)$fallback;
- }
- function cms_default_lang()
- {
- static $default = null;
- if ($default === null) {
- $default = Db::name('lang')->where('is_default', 1)->value('mark') ?: 'cn';
- }
- return strtolower($default);
- }
- function cms_html_lang($lang = null)
- {
- $lang = strtolower(trim((string)($lang ?: cms_current_lang())));
- if ($lang === '') {
- $lang = cms_default_lang();
- }
- static $codeMap = null;
- if ($codeMap === null) {
- $codeMap = Db::name('lang')
- ->where('is_enabled', 1)
- ->column('code', 'mark');
- $codeMap = array_change_key_case((array)$codeMap, CASE_LOWER);
- }
- return trim((string)($codeMap[$lang] ?? $lang));
- }
- function cms_current_lang()
- {
- static $lang = null;
- if ($lang !== null) {
- return $lang;
- }
- $lang = cms_current_region_lang(cms_default_lang());
- return $lang;
- }
- function getCategory($cat, $fields = '', $newCache = false)
- {
- $url_mode = get_addon_config('cms')['site_url_mode'];
- if (empty($cat)) {
- return false;
- }
- $lang = cms_current_lang();
- $field = is_numeric($cat) ? 'id' : 'catdir';
- $key = 'getCategory_' . $cat . '_' . $lang;
- if ($newCache) {
- Cache::delete($key, null);
- }
- $cache = Cache::get($key);
- if ($cache === 'false') {
- return false;
- }
- if (empty($cache)) {
- $cache = \addons\cms\model\Category::where($field, $cat)->findOrEmpty()->toArray();
- if (empty($cache)) {
- Cache::tag('cms')->set($key, 'false', 60);
- return false;
- }
- $defaultLang = cms_default_lang();
- $translate = Db::name('cms_category_data')->where(['catid' => $cache['id'], 'lang' => $lang])->find();
- if (!$translate && $lang !== $defaultLang) {
- $translate = Db::name('cms_category_data')->where(['catid' => $cache['id'], 'lang' => $defaultLang])->find();
- }
- if ($translate) {
- $cache['catname'] = $translate['catname'] ?: ($cache['catname'] ?? '');
- $cache['description'] = $translate['description'] ?: ($cache['description'] ?? '');
- $cache['setting']['meta_title'] = $translate['meta_title'] ?: ($cache['setting']['meta_title'] ?? '');
- $cache['setting']['meta_keywords'] = $translate['meta_keywords'] ?: ($cache['setting']['meta_keywords'] ?? '');
- $cache['setting']['meta_description'] = $translate['meta_description'] ?: ($cache['setting']['meta_description'] ?? '');
- $cache['lang'] = $translate['lang'];
- } else {
- $cache['lang'] = $defaultLang;
- }
- $urlField = 1 == $url_mode ? 'id' : 'catdir';
- $cache['url'] = buildCatUrl($cache[$urlField], $cache['url']);
- Cache::tag('cms')->set($key, $cache, 3600);
- }
- if ($fields) {
- if (false !== strpos($fields, '.')) {
- $vars = explode('.', $fields);
- return $cache[$vars[0]][$vars[1]];
- }
- return $cache[$fields];
- }
- return $cache;
- }
- function filters($modelid, $catid)
- {
- $url_mode = get_addon_config('cms')['site_url_mode'];
- $data = get_filters_field($modelid);
- Request::filter('trim,strip_tags');
- $param = Request::except(['addon', 'controller', 'action']);
- unset($param['catid'], $param['catdir'], $param['page']);
- $conditionParam = [];
- foreach ($data as $name => $rs) {
- $data[$name]['options'][0] = '不限';
- $ifradio = 'checkbox' == $data[$name]['type'] ? false : true;
- if ($ifradio) {
- if (!empty($param[$name])) {
- $conditionParam[$name]['options'][$param[$name]]['active'] = true;
- $nowParam = $param;
- $nowParam[$name] = '';
- $conditionParam[$name]['options'][$param[$name]]['param'] = paramencode($nowParam);
- }
- } else {
- if (!empty($param[$name])) {
- $paramContent = explode('_', $param[$name]);
- foreach ($paramContent as $k => $v) {
- $nowParamContent = $paramContent;
- unset($nowParamContent[$k]);
- $nowParam = $param;
- $nowParam[$name] = implode('_', $nowParamContent);
- $conditionParam[$name]['options'][$v]['active'] = true;
- $conditionParam[$name]['options'][$v]['param'] = paramencode($nowParam);
- }
- }
- }
- $conditionParam[$name]['title'] = $rs['title'];
- $conditionParam[$name]['name'] = $rs['name'];
- foreach ($data[$name]['options'] as $k => $v) {
- $conditionParam[$name]['options'][$k]['title'] = $v;
- if (!isset($conditionParam[$name]['options'][$k]['active'])) {
- $conditionParam[$name]['options'][$k]['active'] = 0;
- $nowParam = $param;
- if ($ifradio) {
- $nowParam[$name] = $k;
- } else {
- $nowParam[$name] = empty($param[$name]) || !$k ? $k : $param[$name] . '_' . $k;
- }
- $conditionParam[$name]['options'][$k]['param'] = paramencode($nowParam);
- }
- if ($url_mode == 1) {
- $field = ':catid';
- } else {
- $field = ':catdir';
- $catid = getCategory($catid, 'catdir');
- }
- $newParam = $conditionParam[$name]['options'][$k]['param'];
- $conditionParam[$name]['options'][$k]['url'] = cms_lang_url(addon_url('cms/index/lists', [$field => $catid])) . ($newParam ? '?' . $newParam : '');
- ksort($conditionParam[$name]['options']);
- }
- if (!isset($param[$rs['name']]) && empty($param[$rs['name']])) {
- $conditionParam[$name]['options'][0]['active'] = true;
- }
- }
- return $conditionParam;
- }
- function structure_filters_sql($modelid)
- {
- $data = get_filters_field($modelid);
- $fields_key = array_keys($data);
- $sql = '`status` = \'1\'';
- $param = Request::param();
- foreach ($param as $k => $r) {
- if (isset($data[$k]['type']) && in_array($k, $fields_key) && intval($r) != 0) {
- if ('radio' == $data[$k]['type']) {
- $sql .= " AND `$k` = '$r'";
- } elseif ('checkbox' == $data[$k]['type']) {
- if (strpos($r, '_')) {
- $r = explode('_', $r);
- $flag = [];
- foreach ($r as $val) {
- $flag[] = "FIND_IN_SET($val,`$k`)";
- }
- $sql .= ' AND (' . implode(' OR ', $flag) . ')';
- } else {
- $sql .= " AND FIND_IN_SET($r,`$k`)";
- }
- }
- }
- }
- return $sql;
- }
- function get_filters_field($modelid)
- {
- static $filters_data = [];
- if ($filters_data) {
- return $filters_data;
- }
- $options = cms_cache('ModelField')[$modelid];
- foreach ($options as $_v) {
- if (isset($_v['filtertype']) && $_v['filtertype']) {
- $_v['options'] = parse_attr($_v['options']);
- } else {
- continue;
- }
- $filters_data[$_v['name']] = array_intersect_key($_v, array_flip(['name', 'title', 'type', 'options']));
- }
- return $filters_data;
- }
- function paramencode($arr)
- {
- $str = '';
- if (!empty($arr)) {
- foreach ($arr as $key => $vo) {
- if (!empty($vo)) {
- $str .= $key . '=' . $vo . '&';
- }
- }
- $str = $str ? substr($str, 0, -1) : '';
- }
- return $str;
- }
- function seo($catid = '', $title = '', $description = '', $keyword = '')
- {
- if (!empty($title)) {
- $title = strip_tags($title);
- }
- if (!empty($description)) {
- $description = strip_tags($description);
- }
- if (!empty($keyword)) {
- $keyword = str_replace(' ', ',', strip_tags($keyword));
- }
- $site = get_addon_config('cms');
- $lang = cms_current_lang();
- $defaultLang = cms_default_lang();
- if ($lang && $lang !== $defaultLang) {
- $translate = Db::name('cms_config_data')->where('lang', $lang)->find();
- if ($translate) {
- foreach (['site_name', 'site_title', 'site_keyword', 'site_description'] as $field) {
- if (!empty($translate[$field])) {
- $site[$field] = $translate[$field];
- }
- }
- }
- }
- if (!empty($catid)) {
- $cat = getCategory($catid);
- }
- $seo['site_title'] = !empty($site['site_title']) ? $site['site_title'] : $site['site_name'];
- $seo['keyword'] = !empty($keyword) ? $keyword : $site['site_keyword'];
- $seo['description'] = !empty($description) ? $description : (($cat['setting']['meta_description'] ?? '') ?: ($site['site_description'] ?? ''));
- $seo['title'] = (!empty($title) ? $title . ' - ' : '') . (($cat['setting']['meta_title'] ?? '') ? $cat['setting']['meta_title'] . ' - ' : (($cat['catname'] ?? '') ? $cat['catname'] . ' - ' : ''));
- foreach ($seo as $k => $v) {
- $seo[$k] = str_replace(["\n", "\r"], '', $v);
- }
- return $seo;
- }
- function cms_lang_url($url, $lang = null, $regionCode = null)
- {
- $parts = parse_url($url);
- if (!$parts) {
- return $url;
- }
- $path = $parts['path'] ?? '/';
- $path = '/' . ltrim($path, '/');
- $region = null;
- if ($regionCode !== null && $regionCode !== '') {
- $region = cms_find_region($regionCode);
- }
- if (!$region && $lang !== null && $lang !== '') {
- $region = cms_find_region('', strtolower((string)$lang));
- }
- if (!$region) {
- $region = cms_current_region();
- }
- if (!$region) {
- $region = cms_default_region();
- }
- $regionSegment = strtolower((string)($region['code'] ?? ''));
- $knownPrefixes = [];
- foreach (cms_enabled_regions() as $item) {
- $knownPrefixes[] = strtolower((string)($item['code'] ?? ''));
- }
- $enabledLangs = Db::name('lang')->where('is_enabled', 1)->column('mark');
- $knownPrefixes = array_unique(array_merge($knownPrefixes, array_map('strtolower', $enabledLangs ?: [])));
- $segments = array_values(array_filter(explode('/', trim($path, '/')), 'strlen'));
- $first = strtolower((string)($segments[0] ?? ''));
- if ($first !== '' && in_array($first, $knownPrefixes, true)) {
- array_shift($segments);
- }
- if ($regionSegment !== '') {
- array_unshift($segments, $regionSegment);
- }
- $newPath = '/' . implode('/', $segments);
- if ($newPath === '') {
- $newPath = '/';
- }
- $query = [];
- if (!empty($parts['query'])) {
- parse_str($parts['query'], $query);
- }
- unset($query['region'], $query['lang']);
- $result = '';
- if (!empty($parts['scheme'])) {
- $result .= $parts['scheme'] . '://';
- }
- if (!empty($parts['user'])) {
- $result .= $parts['user'];
- if (!empty($parts['pass'])) {
- $result .= ':' . $parts['pass'];
- }
- $result .= '@';
- }
- if (!empty($parts['host'])) {
- $result .= $parts['host'];
- }
- if (!empty($parts['port'])) {
- $result .= ':' . $parts['port'];
- }
- $result .= $newPath;
- if (!empty($query)) {
- $result .= '?' . http_build_query($query);
- }
- if (!empty($parts['fragment'])) {
- $result .= '#' . $parts['fragment'];
- }
- return $result;
- }
- function cms_switch_lang_url($lang, $url = '')
- {
- $lang = strtolower((string) $lang);
- if ($url === '') {
- $url = request()->url(true);
- }
- $region = cms_find_region('', $lang);
- if ($region) {
- return cms_lang_url($url, $lang, (string)$region['code']);
- }
- return cms_lang_url($url, $lang, '');
- }
- function cms_switch_region_url($regionCode, $url = '')
- {
- $regionCode = strtoupper((string)$regionCode);
- $region = cms_find_region($regionCode);
- if ($url === '') {
- $url = request()->url(true);
- }
- if (!$region) {
- return cms_lang_url($url, cms_current_region_lang(cms_default_lang()), $regionCode);
- }
- return cms_lang_url($url, cms_region_lang($region, cms_default_lang()), $regionCode);
- }
- function cms_load_lang_dict($lang)
- {
- static $loaded = [];
- if (isset($loaded[$lang])) {
- return $loaded[$lang];
- }
- $dict = [];
- $lang = strtolower((string)$lang);
- $basePath = root_path() . 'addons/cms/lang/' . $lang;
- if (is_dir($basePath)) {
- foreach (glob($basePath . '/*.php') ?: [] as $file) {
- $data = include $file;
- if (is_array($data)) {
- $dict = array_merge($dict, $data);
- }
- }
- }
- $loaded[$lang] = $dict;
- return $dict;
- }
- function cms_t($key, $default = '')
- {
- $lang = cms_current_lang();
- $defaultLang = cms_default_lang();
- $fileDict = cms_load_lang_dict($lang);
- $defaultFileDict = $lang === $defaultLang ? $fileDict : cms_load_lang_dict($defaultLang);
- return $fileDict[$key]
- ?? $defaultFileDict[$key]
- ?? $default;
- }
- function buildCatUrl($cat, $url = '', $suffix = true, $domain = false)
- {
- $url_mode = get_addon_config('cms')['site_url_mode'];
- $category = cms_cache('Category');
- $field = is_numeric($cat) ? ':catid' : ':catdir';
- if (is_numeric($cat) && $url_mode == 2 && isset($category[$cat])) {
- $cat = $category[$cat]['catdir'];
- $field = ':catdir';
- }
- if (empty($url)) {
- return cms_lang_url(addon_url('cms/index/lists', [$field => $cat], $suffix, $domain));
- }
- $parsedUrl = parse_url($url);
- if (isset($parsedUrl['scheme']) && strpos($url, '://') !== false) {
- return $url;
- }
- $queryParams = $parsedUrl['query'] ?? [];
- return cms_lang_url(addon_url($parsedUrl['path'], $queryParams, $suffix, $domain));
- }
- function buildContentUrl($cat, $id, $url = '', $suffix = true, $domain = false)
- {
- $url_mode = get_addon_config('cms')['site_url_mode'];
- $category = cms_cache('Category');
- $field = is_numeric($cat) ? ':catid' : ':catdir';
- if (is_numeric($cat) && $url_mode == 2 && isset($category[$cat])) {
- $cat = $category[$cat]['catdir'];
- $field = ':catdir';
- }
- if (empty($url)) {
- return cms_lang_url(addon_url('cms/index/shows', [$field => $cat, ':id' => $id], $suffix, $domain));
- }
- $parsedUrl = parse_url($url);
- if (isset($parsedUrl['scheme']) && strpos($url, '://') !== false) {
- return $url;
- }
- $queryParams = $parsedUrl['query'] ?? [];
- return cms_lang_url(addon_url($parsedUrl['path'], $queryParams, $suffix, $domain));
- }
- function cms_highlightKeyword($text, $keyword, $highlightStyle = 'color: red;')
- {
- if (empty($keyword)) {
- return $text;
- }
- $pattern = '/' . preg_quote($keyword, '/') . '/i';
- return preg_replace($pattern, '<span style="' . $highlightStyle . '">$0</span>', $text);
- }
|