実際には、Symfony2PHPフレームワークとTwigをテンプレートエンジンとして使用しています。ビューレイヤーのコードの重複を回避し、プログレッシブエンハンスメント(p-jax)の恩恵を受けることができると考えています。
現在のステータス:
PJAXは、ルートに基づくページレイアウトの部分的な更新を処理しません。私たちの目標は、ナビゲーションがY.App(ルーティング)によって処理されるときに、一部のページの「フラグメント」(HTMLノード)のみが更新されるシステムを実装することです。
この点で、POCの実装を開始しました:https ://github.com/benjamindulau/PocSfYui/ Javascriptはここにあります:https ://github.com/benjamindulau/PocSfYui/tree/master/src/Acme/PocBundle / Resources / public / js およびY.Appの初期構成:https ://github.com/benjamindulau/PocSfYui/blob/master/src/Acme/PocBundle/Resources/views/layout.html.twig#L66
アイデアは、最初にページをロードするときに、すべてがサーバー側で処理される(プログレッシブエンハンスメント)ということです。つまり、ページ全体とページフラグメントがサーバーによってレンダリングされます。Y.Appによって実行される必要がある次のリクエストでは、次のようなJSON形式を定義しました(/ photos path response):
{
"title": "MyAwesomeWebsite - Photos", // page <title>,
"fragments": {
"sidebar": "<h2>Sidebar Menu<\/h2><!-- etc.... -->", // ..... maybe an updated menu for active page
"main": "<h2>Photos<\/h2><div id=\"photo-list-container\"><ul id=\"photo-list\"><!-- photo items.... --></ul></div>", // Pre-rendered photo list
},
"templates": {
"photo_item_tpl": "<li data-id=\"{{index}}\"><img src=\"{{url}}\" alt=\"{{title}}\" \/><\/li>" // template used later by Y.App for adding new photos
}
}
これは基本的に、現在のビューコンテンツ(ルート)の「JSON化」バージョンです。
サーバー側では、リクエストがY.Appからのものであることを検出し、Twigテンプレートをレンダリングする代わりに、そこから「ブロック」を抽出し、更新が必要なページフラグメントとクライアントが必要とするハンドルバーテンプレートを含むこのJSONレスポンスを構築しますこの特定のページ。
クライアント側(Y.App):
- ページレイアウト全体を表すベースPageCompositeViewを定義し、次にこれを継承して独自のサブビュー(SidebarView、MainView、HeaderView、...)をインスタンス化するPage2colLeftViewを定義しました。
- PJAXのようなリクエストを偽造するIOモジュールを作成しました。「loadContent」の代わりに使用します(https://github.com/benjamindulau/PocSfYui/blob/master/src/Acme/PocBundle/Resources/views/layout.html.twig#L93を参照)
- 最初のロード時にshowViewを呼び出し、ページのサブビューをそれぞれのコンテナーに「再接続」しようとします(https://github.com/benjamindulau/PocSfYui/blob/master/src/Acme/PocBundle/Resources/を参照)。 public / js / views / page.js#L27)
- ページ内を移動するとき、Y.Appはページ構造について知っています。
ブラウザに「/photos」パスを直接ロードするとします。1。サーバーは写真リストを含むページ全体をレンダリングします2.YUIアプリはPageCompositeViewを作成し、各サブビューをコンテナに再接続します3.YUIアプリはそれを認識しています「MainView」ビュー(メインコンテンツに対応)には、「PhotoModelList」モデルリストにバインドされた「PhotoListView」サブビューが含まれている必要があります。したがって、「/ photos」パスのコールバックは「PhotoView」インスタンスを作成し、それをそのコンテナ(サーバーによってレンダリングされる)に再接続します。
2と3(特に3)は手動で行われます。
POCは実際に機能します。
しかし、先に進む前に、私たちはあなたのアドバイスを得たいと思います。
まず最初に、このPOCについてどう思いますか?
私たちは実際にこのアプローチの賛否両論を見ています。
私たちの主な関心事は、Y.Appを微調整して目的を達成する方法です。-単一の複合ビュー-最初のロード時に、既存のDOMを読み取ることによってモデルが再水和されます(つまり、写真リストがサーバーによってレンダリングされるとき) -前進すればするほど、Y.Appについて何かが欠けていて、間違った方向に進んだと思います;-)
しかし、これらすべての良い面は、それほど多くの作業をしなくても完全な非同期Webサイトを構築できることです。
私たちの主な目標は、「ほぼ完全な」汎用ソリューションを提供することにより、すべてを保守可能に保つことです。
たぶん、そのメッセージから浮かび上がる主な質問は次のようになります。
「Y.Appを正しい方法で使用していますか?」;-)
それで、あなたはどう思いますか ?
ありがとう、Cya