Movable Type 備忘録

 WriteToFile プラグイン

こんにちわ^^

先日、The blog of H.Fujimoto さんとこで WriteToFile プラグインというものが公開されました。

掻い摘んで言うと、MT タグの出力結果を任意のファイルに出力することが可能になります。
で、このプラグインを使用してページ分割をやってみました。

WriteToFile プラグインを使ったページ分割では、トップページ( index.php )は通常通り表示して、その他のページは一覧形式にしたりなど、ページ毎に変化を付けることができます。
WriteToFile プラグインを使った使用例を壱さんとこでご紹介してますので参考にしてください。

わたしのサイトでは Ajax を使ってページ分割やってみました。
トップページの下の方にある各ページへのリンクをクリックしてもらえれば、どんなかんじか分かると思います (●´∀`●)

ということで、ここでは WriteToFile プラグインを使ってページ分割したページを Ajax で表示する方法をご紹介したいと思います。

メインページを Ajax でページ分割

デフォルトのメインページのテンプレートを WriteToFile プラグインを使ってページ分割( Ajax )したものを以下に記します。

メインページ

  1. <mt:SetVar name="pagecnt" value="5">
  2. <mt:SetVar name="entofs" value="0">
  3. <$MTEntriesCount setvar="entcnt"$>
  4. <mt:SetVarTemplate name="page_content">
  5. <MTEntries offset="$entofs" lastn="$entcnt">
  6. <$mt:Include module="<__trans phrase="Entry Summary">"$>
  7. </MTEntries>
  8.  
  9. <div class="content-nav">
  10. <ul>
  11. <mt:For var="page_ctr" from="1" to="$pagecnt">
  12. <mt:If name="page_ctr" eq="$pageno">
  13. <li><span><$mt:GetVar name="page_ctr"$></span></li>
  14. <mt:Else>
  15. <li><a href="javascript:void(0);" onclick="javascript:ajaxpager.pager('<$MTBlogURL$>index_<$mt:GetVar name="page_ctr"$><$MTBlogFileExtension lower_case="1"$>', 'alpha-inner');"><$mt:GetVar name="page_ctr"$></a></li>
  16. </mt:If>
  17. </mt:For>
  18. <li><a href="<$mt:Link template="archive_index"$>"><__trans phrase="Archives"></a></li>
  19. </ul>
  20. </div>
  21. </mt:SetVarTemplate>
  22.  
  23. <mt:For var="pageno" from="1" to="$pagecnt">
  24. <mt:SetVarBlock name="fname">index_<$mt:GetVar name="pageno"><$MTBlogFileExtension lower_case="1"$></mt:SetVarBlock>
  25.  
  26. <mt:If name="pageno" eq="1">
  27.         <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  28.             "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  29.         <html xmlns="http://www.w3.org/1999/xhtml" id="sixapart-standard">
  30.         <head>
  31.             <$mt:Include module="<__trans phrase="HTML Head">"$>
  32.             <link rel="EditURI" type="application/rsd+xml" title="RSD" href="<$mt:Link template="rsd"$>" />
  33.             <title><$mt:BlogName encode_html="1"$></title>
  34. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>
  35. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.1/scriptaculous.js"></script>
  36. <script type="text/javascript">
  37. var ajaxpager = {
  38. version: '1.00',
  39. ajaxloader: ['<$MTBlogURL$>', 'ajax-loader.gif'].join(''),
  40. boxid: 'alpha-inner',
  41. url: '',
  42. safari_escape: function(req) {
  43. var text = req.responseText.replace(/\n/g,'');
  44.  
  45. if (navigator.appVersion.indexOf("KHTML") > -1) {
  46. var esc = escape(text);
  47.  
  48. if (esc.indexOf("%u") < 0 && esc.indexOf("%") > -1) {
  49. text = decodeURIComponent(esc);
  50. }
  51. }
  52.  
  53. return text;
  54. },
  55. show_ajaxloader: function(enable) {
  56. var elem = $(this.boxid);
  57. if (enable) {
  58. elem.innerHTML = '';
  59. elem.style.height = '100px';
  60. elem.style.background = 'transparent url('+this.ajaxloader+') no-repeat center center';
  61. }
  62. else {
  63. elem.style.height = 'auto';
  64. elem.style.background = 'none';
  65. }
  66. },
  67. delay_request: function(effect) {
  68. new Ajax.Request(ajaxpager.url, {
  69. method: 'get',
  70. onComplete: function(req) {
  71. ajaxpager.show_ajaxloader(false);
  72. $(ajaxpager.boxid).innerHTML = ajaxpager.safari_escape(req);
  73. }
  74. });
  75. },
  76. pager: function(url, boxid) {
  77. this.boxid = boxid;
  78. this.url = url;
  79. this.show_ajaxloader(true);
  80. new Effect.ScrollTo($(boxid), { afterFinishInternal: this.delay_request });
  81. return false;
  82. }
  83. };
  84. </script>
  85.         </head>
  86.         <body id="<$mt:BlogTemplateSetID$>" class="mt-main-index <$mt:Var name="page_layout"$>">
  87.             <div id="container">
  88.                 <div id="container-inner">
  89.                     <$mt:Include module="<__trans phrase="Banner Header">"$>
  90.                     <div id="content">
  91.                         <div id="content-inner">
  92.                             <div id="alpha">
  93.                                 <div id="alpha-inner">
  94. <$mt:GetVar name="page_content"$>
  95.                                 </div>
  96.                             </div>
  97.                             <$mt:Include module="<__trans phrase="Sidebar">"$>
  98.                         </div>
  99.                     </div>
  100.                     <$mt:Include module="<__trans phrase="Banner Footer">"$>
  101.                 </div>
  102.             </div>
  103.         </body>
  104.         </html>
  105. </mt:If>
  106.  
  107. <MTWriteToFile file="$fname">
  108. <$mt:GetVar name="page_content"$>
  109. </MTWriteToFile>
  110. <mt:SetVar name="entofs" value="$entcnt" op="+">
  111. </mt:For>

青字の部分を追加してます。
カンタンに説明するとデフォルトテンプレート内の alpha-inner で囲まれた、23 行目~31 行目のブログ記事の概要表示のコードを上記 3 ~ 19 行目に移動してます。
なぜ移動したかというと、Ajax によるページ分割用にブログ記事概要だけをファイル出力するためです。

106 行目~108 行目で Ajax 用のページ分活ページをファイル出力してます。
110 行目で entofs にエントリのオフセットを entcnt( MT 管理画面の公開で設定したエントリ数 )で加算することで順次エントリを遡るようにしてます。

使い方

  1. 「メインページ」テンプレートを上記コードと差し替えます。

  2. 1 行目の pagecnt の値には分割したいページ数を指定します。
    デフォルトでは 5 ページ分に分割されます。

  3. 38 行目には ajax loader イメージの URL を指定します。
    デフォルトではメインページと同じ場所にある ajax-loader.gif が使用されます。

  4. メインページを再構築します。

以上です。
後は各自のサイトデザインに合わせて CSS でページナビをスタイルするだけです。

 Trackback Pings(0)

No trackbacks found.

 Comments(0)

No comments found.

 Post a Comment

 

コメント用フィード