|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我们就把这段代码逐行详细讲解,帮助你 彻底理解它的作用和执行过程。
<?php
// 文件:upload/catalog/controller/startup/ocml_hreflang.php
class ControllerStartupOcmlHreflang extends Controller {
public function index() {
if (!isset($this->request->get['_route_'])) return;
$route = $this->request->get['_route_'];
$parts = explode('/', trim($route, '/'));
// 获取语言代码列表
$languages = $this->config->get('config_language');
$languages = explode(',', $languages);
$prefix = $parts[0];
$language_code = null;
foreach ($languages as $lang) {
if ($prefix == substr($lang, 0, 2)) {
$language_code = $lang;
break;
}
}
if ($language_code && $this->session->data['language'] != $language_code) {
$this->session->data['language'] = $language_code;
$this->language->set($language_code);
}
}
}
📁 文件位置
catalog/controller/startup/ocml_hreflang.php
这是一个 OpenCart 的 “startup controller”,也就是在每次前台加载页面时,系统最先执行的一类逻辑。我们将在后续注册这个文件,让它每次加载时都自动运行。
✅ 完整代码 + 注解
<?php
class ControllerStartupOcmlHreflang extends Controller {
public function index() {
📝解释:
- 创建一个名为 ControllerStartupOcmlHreflang 的控制器类;
- OpenCart 会自动加载这个类,并执行它的 index() 方法(如果我们在注册文件中指定了它);
- 每次前台访问网站时,都会执行这里的逻辑(如果注册成功);
if (isset($this->request->server['REQUEST_URI'])) {
$uri = trim($this->request->server['REQUEST_URI'], '/');
📝解释:
- 从服务器变量中取出当前访问的 URL 路径(不包括域名);
- 用 trim() 去除前后的 /,结果变为:en/category/product-name
$parts = explode('/', $uri);
📝解释:
- 用 / 拆分 URL 路径,比如:
- en/category/product-name 会被拆分为数组:
['en', 'category', 'product-name']
if (!empty($parts[0]))
📝解释:
- 确认数组第一个元素存在(即是否包含语言前缀);
- 如果没有,比如访问的是 /(首页),就不会进入后续逻辑。
$languages = $this->model_localisation_language->getLanguages();
📝解释:
- 调用 OpenCart 的模型 model_localisation_language 获取所有激活语言;
- 它返回的是一个数组,每个语言对象含有 code(如 en-gb)和其他字段。
foreach ($languages as $language) {
$code = substr($language['code'], 0, 2);
📝解释:
- 遍历每一种语言;
- 取语言 code 的前两位,比如 en-gb 取出 en,es-es 取出 es;
- 这是为了支持用 /en/, /es/ 这样的短前缀做语言识别。
if ($parts[0] == $code) {
📝解释:
- 如果 URL 第一段是语言前缀(如 en),匹配到某个语言,就进入以下逻辑。
$this->session->data['language'] = $language['code'];
$this->language->set($language['code']);
📝解释:- 设置 session 中的语言为匹配结果;
- 同时也告诉 OpenCart 立即切换这个语言(影响接下来的 language->load(),页面展示语言);
$this->request->get['_route_'] = implode('/', array_slice($parts, 1));
break;
}
📝解释:
- _route_ 是 OpenCart 的内部路由系统的变量;
- 把 URL 中除掉语言前缀后的部分(例如 category/product-name)赋值给 _route_;
- 这样就能让 OpenCart 后续继续解析这个 URL 的路由,不影响页面访问;
- break 跳出循环,不再检查其他语言。
}
}
}
}
📝解释:
- 整个过程完成后,系统接下来会正常执行页面加载;
- 我们只在最开始干预了一次语言设置。
🧠 总结这段代码做了什么[td]步骤 | 动作 | 说明 | 1 | 获取访问路径 | 获取当前访问的 URL 路径,例如 /en/category/... | 2 | 判断是否有语言前缀 | 检查第一个路径段是否是某种语言的前缀 | 3 | 匹配语言 | 如果是 /en/,就找 en-gb;如果是 /es/,就找 es-es | 4 | 设置语言 | 设置 OpenCart 当前语言和 session | 5 | 移除前缀继续路由 | 删除语言前缀后把路径交给 OpenCart 正常解析 |
📂 涉及哪些 OpenCart 文件/目录?[td]类型 | 文件/目录 | 用途 | 控制器 | catalog/controller/startup/ocml_hreflang.php | 我们新建的语言前缀控制器 | 模型 | model_localisation_language | 系统语言列表调用 | Session | $this->session->data['language'] | 语言持久化在用户会话中 | 路由 | $this->request->get['_route_'] | 告诉 OpenCart 该如何继续解析路由 |
是否继续执行下一步:注册这个 startup 控制器 到 OpenCart 系统?这样才能生效每次访问时运行它。
|
|