1

我已经在互联网上进行了一些挖掘,但没有什么让自己变得明显。

我正在寻找将自定义 CMS 与骨干网集成,以便可以使用原始 http 请求或通过骨干网的“状态”开关加载页面。CMS 目前专注于通过 htaccess/mod-rewrite 为其路由/url 自动重写规则,但是骨干网对其内部路由使用不同的格式结构。

我希望 CMS 可以将其重写规则转换为骨干格式,以便每当将页面添加到 CMS 时,骨干就会意识到它并自动更新。例如,CMS 将这样的页面负载输出到全局 SiteMap 对象:

....
"contact"       => array(
        "key"       =>      "contact",
        "url"       =>      "^(en|fr|de)/contact/$",
        "type"      =>      "page",
        "template"  =>      "contact",
        "method"    =>      "contact",
        "sitemap"   =>      TRUE,
        //other page config vars etc
    ),//..and so on
...

然后有一个解析器,它向 .htaccess 写入规则,如下所示:

RewriteRule ^(en|fr|de)/contact$ index.php?page=contact&lang=$1&section=$2

问题:

显然,主干路由器格式有点不同,需要在 PHP 中完成大量的翻译工作才能输出干净整洁的路由器配置。我不敢相信我是第一个遇到这种情况的人,因为这似乎是尝试将 Backbone 应用程序集成到 CMS 的必要步骤。谁能指出一些翻译这些字符串格式的方法的方向?也许我以错误的方式接近这个?

确实非常感谢。

4

1 回答 1

1

router.routeBackbone 支持使用该方法将路由定义为正则表达式。Apache mod_rewrite 规则也是正则表达式。因此,诸如此类的表达式^(en|fr|de)/contact/$已经是有效的主干路由。

你没有说你是否已经有一种机制来获取客户端的路由配置,无论是通过“站点地图”服务还是通过将数据引导到服务器上的 HTML 页面。但是,假设您可以像这样输出站点地图对象:

var sitemap = {
  "contact": {
    "url": "^(en|fr|de)/contact/$",
    "type": "page"
    //..other properties
   },
   //...other pages
}

您可以通过迭代站点地图来注册路线:

var CMSRouter = Backbone.Router.extend({
  page: function(pageName, language) {
      console.log(pageName); // -> "contact"
      console.log(language); // -> "en"
  }
});

var router = new CMSRouter();
_.each(sitemap, function(entry, key) {
    //handler method based on type ("page")
    var handler = router[entry.type];

    //create a pre-applied callback function where the first argument
    //is always set to the sitemap entry key ("contact"), and the
    //rest of the arguments are filled from the capturing groups from
    //the regular expression.
    var callback = _.bind(handler, router, key);

    //register route
    router.route(new RegExp(entry.route), callback);
});

Backbone.history.start();

这可能没有考虑到系统的很多复杂性,但原则上它应该可以正常工作。如果您可以使用更准确的要求编辑您的问题,我将很乐意编辑答案。

于 2013-01-21T12:53:28.337 回答