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.routeバックボーンは、メソッドを使用した正規表現としてのルートの定義をサポートしています。Apachemod_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 に答える