桐木舟学英语人工智能

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 7|回复: 0

开发一款插件:语言前缀+hreflang标识(详细解释)

[复制链接]

7

主题

3

回帖

35

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
35
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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 系统?这样才能生效每次访问时运行它。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|桐木舟论坛

GMT+8, 2025-7-21 13:25 , Processed in 0.049250 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表