TopMovable Typeカスタマイズカレンダー > 2008年10月
2008年10月31日

「Ajax 月送りカレンダー」の表示月をブログ記事の投稿月や月別アーカイブに連動させる

October 31,2008 12:55 AM
Tag:[, , , ]
Permalink

『Ajax 月送りカレンダー(MT4版)』で未来月のブログ記事を表示しない」の続きで、「Ajax 月送りカレンダー(MT4版)」をブログ記事の投稿月や日付アーカイブに連動させるためのカスタマイズです。

具体的には、

  • ブログ記事アーカイブ:投稿月のカレンダーを表示
  • 日別・月別アーカイブ/日別カテゴリー・月別カテゴリーアーカイブ/日別ユーザー・月別ユーザーアーカイブ:該当月のカレンダーを表示
  • メインページ/カテゴリーアーカイブ/ユーザーアーカイブ:最新月(未来月を除く)のカレンダーを表示

となります。

ブログ記事アーカイブでの表示例(投稿月である9月のカレンダーを表示)
ブログ記事アーカイブでの表示

月別アーカイブでの表示例(アーカイブの月である8月のカレンダーを表示)
月別アーカイブでの表示

何人かの方から質問を頂いてますので、本エントリーで回答致します。

1.変更点(その1)

Ajax 月送りカレンダー(MT4版)の「5.2 カレンダー表示部分の設定」を次の内容に入れ替えてください。

<div id="calendar"></div>
<script type="text/javascript">
<mt:if name="archive_class" like="monthly|daily">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:archiveDate format="%Y/%m/" />");
<mt:elseIf name="archive_class" like="weekly|yearly">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:date format="%Y/%m/" />");
<mt:elseIf name="entry_archive">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:entryDate format="%Y/%m/" />");
<mt:else>
<mt:date format="%Y/%m" setvar="current_date" />
<mt:setVar name="flag" value="0" />
<mt:archiveList archive_type="Monthly">
  <mt:unless name="flag">
    <mt:archiveDate format="%Y/%m" setvar="archive_date" />
    <mt:if name="archive_date" le="$current_date">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:getVar name="archive_date" />");
      <mt:setVar name="flag" value="1" />
    </mt:if>
  </mt:unless>
</mt:archiveList>
</mt:if>
</script>

当サイトの 4.2 対応のテンプレートでサイドバーに設置する場合は、次のように dd 要素でマークアップしてください。

<dd id="calendar"></dd>
<dd>
<script type="text/javascript">
<mt:if name="archive_class" like="monthly|daily">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:archiveDate format="%Y/%m/" />");
<mt:elseIf name="archive_class" like="weekly|yearly">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:date format="%Y/%m/" />");
<mt:elseIf name="entry_archive">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:entryDate format="%Y/%m/" />");
<mt:else>
<mt:date format="%Y/%m" setvar="current_date" />
<mt:setVar name="flag" value="0" />
<mt:archiveList archive_type="Monthly">
  <mt:unless name="flag">
    <mt:archiveDate format="%Y/%m" setvar="archive_date" />
    <mt:if name="archive_date" le="$current_date">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:getVar name="archive_date" />");
      <mt:setVar name="flag" value="1" />
    </mt:if>
  </mt:unless>
</mt:archiveList>
</mt:if>
</script>
</dd>

年別アーカイブ・週別アーカイブ(カテゴリ・ユーザー別含む)の場合は、日別や月別と同じ制御(MTArchiveDate タグで年月を取得)では正常に表示されない場合があり、制御がやや面倒なので現在月を表示するようにしています。ちなみに正常に表示されない理由は次の通りです。

  • 年別アーカイブ:その年の最初の月を表示するが、その月に投稿がないと正常に表示されない。
  • 週別アーカイブ:週が2ヶ月にまたがっていると、最初の月のカレンダーを表示するが、その月に投稿がないと正常に表示されない。

2.変更点(その2)

ajaxCalendar.js をアップロードする前に(アップロードしていたらダウンロードして)、任意のエディタで開き、下記の青色部分を追加してください。この追加を行わないと、最初に表示された(または月送りした)カレンダー月がクッキーにカレンダー年月が保存され、その年月のカレンダー表示が優先されてしまいます。

...前略...
function getCalendar(blogURL, id, path) {
    blogID = id;
    var cookie = readCookie("AjaxCal" + id);
    cookie = null;
    if(cookie != null) {
        if(blogURL.lastIndexOf("/") != blogURL.length - 1) {
            path = blogURL + "/calendar/" + cookie + "/";
        } else {
            path = blogURL + "calendar/" + cookie + "/";
        }
    }
    changeMonth(path);
}
...後略...
Comments [3] | Trackbacks [0]
2008年10月30日

「Ajax 月送りカレンダー」で未来月のブログ記事を表示しない

October 30,2008 12:03 AM
Tag:[, , , ]
Permalink

公開中の「Ajax 月送りカレンダー(MT4版)」のデフォルト表示月は最新投稿があったブログ記事の月になるようにしていますが、未来の月に投稿があると、その月が表示されてしまいます。

「このような場合でも現在の月を表示したいのですが」というご質問を頂きましたので、本エントリーにて紹介致します。

1.変更点(その1)

Ajax 月送りカレンダー(MT4版)の「5.2 カレンダー表示部分の設定」を次のように変更してください(青色部分を追加し、赤色部分を変更)。

変更前

<div id="calendar"></div>
<script type="text/javascript">
getCalendar("<$MTBlogArchiveURL$>", "<$MTBlogID$>", "<$MTBlogArchiveURL$><MTEntries lastn="1" sort_order="descend"><$MTEntryDate format="calendar/%Y/%m/" $></MTEntries>");
</script>

変更後

<div id="calendar"></div>
<script type="text/javascript">
<mt:date format="%Y/%m" setvar="current_date" />
<mt:setVar name="flag" value="0" />
<mt:archiveList archive_type="Monthly">
  <mt:unless name="flag">
    <mt:archiveDate format="%Y/%m" setvar="archive_date" />
    <mt:if name="archive_date" le="$current_date">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:getVar name="archive_date" />");
      <mt:setVar name="flag" value="1" />
    </mt:if>
  </mt:unless>
</mt:archiveList>
</script>

変更前は、JavaScript を起動するパラメータに、最新のブログ記事が投稿されている年月を設定していますが、変更後は、再構築年月(MTDate)を現在月とみなして、その月以前に投稿されたブログ記事がある年月を、JavaScript を起動するパラメータに設定しています。
これで未来月に投稿があっても、現在月のカレンダーを表示します。

MTDate の代わりに JavaScript でダイナミックに年月を取得すると、月が切り変わった瞬間など、存在しない月のカレンダーを取得する可能性があるため、ここでは採用していません。

当サイトの 4.2 対応のテンプレートでサイドバーに設置する場合は、次のように dd 要素でマークアップしてください。

<dd id="calendar"></dd>
<dd>
<script type="text/javascript">
<mt:date format="%Y/%m" setvar="current_date" />
<mt:setVar name="flag" value="0" />
<mt:archiveList archive_type="Monthly">
  <mt:unless name="flag">
    <mt:archiveDate format="%Y/%m" setvar="archive_date" />
    <mt:if name="archive_date" le="$current_date">
getCalendar("<mt:blogArchiveURL />", "<mt:blogID />", "<mt:blogArchiveURL />calendar/<mt:getVar name="archive_date" />");
      <mt:setVar name="flag" value="1" />
    </mt:if>
  </mt:unless>
</mt:archiveList>
</script>
</dd>

2.変更点(その2)

Ajax 月送りカレンダー(MT4版)の「2.カレンダーテンプレート作成」のリストを、次のように変更してください(青色部分を追加)。

変更前

...前略...
<MTArchiveNext>
<a href="javascript:void(0);" onclick="changeMonth('<$MTBlogArchiveURL$><MTArchiveDate format="calendar/%Y/%m/%i">');" >&#65310;</a>
</MTArchiveNext>
...後略...

変更後

...前略...
<MTArchiveNext>
<mt:archiveDate format="%Y%m" setvar="archive_date" />
<mt:if name="archive_date" le="$current_date">
<a href="javascript:void(0);" onclick="changeMonth('<$MTBlogArchiveURL$><MTArchiveDate format="calendar/%Y/%m/%i">');" >&#65310;</a>
</mt:if>
</MTArchiveNext>
...後略...

これはカレンダーの前後月のリンクで、未来月へのリンクを表示しない対処です。

3.謝辞

この手法は、WingMemo さんのブログで紹介されている、次の記事をヒントにカスタマイズさせて頂きました。ありがとうございました。

WingMemo - ダイナミックで月送りカレンダー(5) MT4版~現在の月編
Comments [4] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2021年
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3