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, '$0', $text); }