MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン(改)
先日作成した「営業日(休日)をイッパツで表現するカレンダープラグイン」であるが、テンプレートって何?という人が少しでも使いやすいようにと、ブログごとに設定をつけた。
alt-tmplフォルダへ拡張した設定画面を置き、追加したDBフィールドとの連携を図っただけである。
プラグインを入れると、ブログの設定画面が下図のようになる。
- Input Target Month
- ここには、カレンダーで表示したい年と月を「2008/05」のようなカタチで入力する。
- Input Holiday Data
- ここには、休日とする日をカンマ区切りで「5,6,12,13,20,21,28,29」という具合に入力する。
拡張されるテンプレートタグ
- MTHolidayCalendarCurrentDate
- 設定画面で入力した年/月データを取得する。
- MTHolidayCalendarHolidayData
- 設定画面で入力したカンマ区切り休日データを取得する。
- MTHolidayCalendar
- カレンダーのhtmlタグを吐き出す。
テンプレートタグの組み方と出力結果
スタイル定義はCSSに書いたほうがイイ。これは実験なのでこう書いている。コードはとても簡単になった。
<style type="text/css">
<!--
table.calendar {
border-collapse : collapse;
}
.calendar td{
color: #000099;
border : 1px solid black;
width : 30px;
padding : 2px 0;
text-align : center;
}
.calendar td.holiday{
color: #ff0000;
font-weight: bold;
}
.calendar tr.calendarhead{
background-color: #ededed;
}
-->
</style>
<MTSetVarBlock name="targetDate"><$MTHolidayCalendarCurrentDate$></MTSetVarBlock>
<MTSetVarBlock name="HolidayDataStrings"><$MTHolidayCalendarHolidayData$></MTSetVarBlock>
<MTHolidayCalendar date="$targetDate" holiday="$HolidayDataStrings">
このように出力される。
プラグインコード
holidaycalendar.pl などと名づけ、pluginsフォルダへ投げ込むといい。
package MT::Plugin::HolidayCalendar;
use strict;
use MT::Plugin;
use base qw(MT::Plugin);
our $VERSION = '0.1';
my $plugin = new MT::Plugin::HolidayCalendar({
id => 'HolidayCalendar',
key => 'holiday_calendar',
name => 'HolidayCalendar',
version => $VERSION,
description => '<MT_TRANS phrase=\'The Holiday Showing Calendar \'>',
author_name => 'apstar',
author_link => 'http://www.mtde.info/',
schema_version => 0.01,
});
MT->add_plugin($plugin);
sub init_registry
{
my $plugin = shift;
$plugin->registry({
object_types => {
'blog' => {
'calendar_holiday' => 'string(255)',
'calendar_currentmonth' => 'string(255)',
},
},
tags => {
function => {
'HolidayCalendar' => \&_hdlr_outputcalendar,
'HolidayCalendarHolidayData' => \&_hdlr_get_holiday,
'HolidayCalendarCurrentDate' => \&_hdlr_get_date,
},
},
});
}
sub _hdlr_get_holiday {
my ($ctx, $args) = @_;
my $tag = 'HolidayCalendarHolidayData';
(my $blog = $ctx->stash('blog')) || return $ctx->_no_entry_error('MT' . $tag);
return $blog->calendar_holiday || '';
}
sub _hdlr_get_date {
my ($ctx, $args) = @_;
my $tag = 'HolidayCalendarCurrentDate';
(my $blog = $ctx->stash('blog')) || return $ctx->_no_entry_error('MT' . $tag);
return $blog->calendar_currentmonth || '';
}
sub _hdlr_outputcalendar {
my ($ctx, $args) = @_;
my $date = $args->{date};
my $holiday = $args->{holiday};
my @holidaylist = split( /,/ , $holiday );
my $i = 0;
my $col = 0;
my $out ='';
my $year = substr($date , 0, 4);
my $month = substr($date , 5, 2);
my @days = (31,28,31,30,31,30,31,31,30,31,30,31);
my $pair = '';
my @pairs;
my $startday = '';
my $lastday='';
my $hcount =0;
#Judgment Leap year
if( (($year%4 ==0)&&($year%100 != 0))||($year%400 == 0) ){
$days[1]=29;
}
#Zeller's congruence
$startday = &get_start_day($year,$month,1);
$lastday = $days[$month-1];
#Output html Tag
$out .= "<table class=\"calendar\">\n";
$out .= "<tr class=\"calendarhead\"><td>Sun</td><td>Mon</td><td>Tue</td><td>Wed</td><td>Thu</td><td>Fri</td><td>Sat</td></tr>\n";
#Insert Head Space
if($startday!=0){
$out .= "<tr>";
for($i=0;$i<$startday;$i++){ $out .= "<td><br /></td>"; $col++; }
}
#Create Cell
for($i=1;$i<=$lastday;$i++){
if($col==0){ $out .= "<tr>"; }
if($i == $holidaylist[$hcount]){
$out .= "<td class=\"holiday\">$i</td>";
$hcount++;
} else {
$out .= "<td>$i</td>";
}
$col++;
if($col>=7){
$out .= "</tr>\n";
if ($i<$lastday) { $col=0; }
}
}
for($i=$col;$i<7;$i++){ $out .= "<td><br /></td>"; }
$out .= "</table>";
}
sub get_start_day {
#Zeller's congruence
my ($year,$month,$day)=@_;
if($month<3){ $month += 12; $year--; }
return ($year+int($year/4)-int($year/100)+int($year/400)+int((13*$month+8)/5)+$day)% 7;
}
1;
ブログの設定画面 代替テンプレートコード
cfg_prefs.tmpl というファイル名で、alt-tmplフォルダへ投げ込むといい。
<mt:setvar name="page_title" value="<__trans phrase="General Settings">">
<$mt:setvar name="position_actions_bottom" value="1"$>
<mt:setvar name="general-settings" value="1">
<MTSetVarBlock name="system_msg">
<mt:if name="error">
<mtapp:statusmsg
id="generic-error"
class="error">
<mt:var name="error">
</mtapp:statusmsg>
</mt:if>
<mt:if name="saved">
<mtapp:statusmsg
id="saved"
class="success"
rebuild="all">
<__trans phrase="Your preferences have been saved.">
</mtapp:statusmsg>
</mt:if>
</MTSetVarBlock>
<MTSetVarBlock name="content_nav">
<mt:include name="include/cfg_content_nav.tmpl">
</MTSetVarBlock>
<mt:include name="include/header.tmpl">
<script type="text/javascript">
<!--
function doRemoveLicense () {
document.cfg_form.cc_license.value = '';
var e = getByID('has-license');
if (e) e.style.display = 'none';
e = getByID('no-license');
if (e) e.style.display = 'block';
}
function validate (f) {
if (!f.name.value) {
alert('<__trans phrase="You must set your Blog Name." escape="singlequotes">');
return false;
} else if (f.server_offset.value == '') {
alert('<__trans phrase="You did not select a timezone." escape="singlequotes">');
return false;
}
return true;
}
function setLicense() {
var w = window.open('http://creativecommons.org/license/?partner=SixApart&jurisdiction_choose=1&exit_url=<mt:var name="script_full_url">?__mode=cc_return%26license_code=[license_code]%26license_url=[license_url]%26license_button=[license_button]', 'cc', 'width=600,height=650,scrollbars=yes,resizable=no');
if ( w ) w.focus();
return false;
}
//-->
</script>
<form name="cfg_form" method="post" action="<mt:var name="script_url">" onsubmit="return validate(this)">
<input type="hidden" name="id" value="<mt:var name="id">" />
<input type="hidden" name="__mode" value="save" />
<input type="hidden" name="_type" value="blog" />
<input type="hidden" name="cfg_screen" value="cfg_prefs" />
<input type="hidden" name="blog_id" value="<mt:var name="blog_id">" />
<input type="hidden" name="return_args" value="<mt:var name="return_args" escape="html">" />
<input type="hidden" name="magic_token" value="<mt:var name="magic_token">" />
<fieldset>
<h3><__trans phrase="Blog Settings"></h3>
<mtapp:setting
id="name"
label="<__trans phrase="Name">"
hint="<__trans phrase="Name your blog. The blog name can be changed at any time.">"
help_page="blog_settings_general"
help_section="blog_name">
<div class="textarea-wrapper">
<input name="name" id="name" class="full-width" value="<mt:var name="name" escape="html">" size="30" />
</div>
</mtapp:setting>
<mtapp:setting
id="description"
label="<__trans phrase="Description">"
hint="<__trans phrase="Enter a description for your blog.">"
help_page="blog_settings_general"
help_section="blog_description">
<textarea name="description" id="description" class="full-width short" cols="" rows=""><mt:var name="description" escape="html"></textarea>
</mtapp:setting>
<mtapp:setting
id="server_offset"
label="<__trans phrase="Timezone">"
hint="<__trans phrase="Select your timezone from the pulldown menu.">"
help_page="blog_settings_general"
help_section="blog_timezone">
<select name="server_offset" id="server_offset" class="half-width">
<option value=""><__trans phrase="Time zone not selected"></option>
<option value="13"<mt:if name="SERVER_OFFSET_13"> selected="selected"</mt:if>><__trans phrase="UTC+13 (New Zealand Daylight Savings Time)"></option>
<option value="12"<mt:if name="SERVER_OFFSET_12"> selected="selected"</mt:if>><__trans phrase="UTC+12 (International Date Line East)"></option>
<option value="11"<mt:if name="SERVER_OFFSET_11"> selected="selected"</mt:if>><__trans phrase="UTC+11"></option>
<option value="10"<mt:if name="SERVER_OFFSET_10"> selected="selected"</mt:if>><__trans phrase="UTC+10 (East Australian Time)"></option>
<option value="9.5"<mt:if name="SERVER_OFFSET_9_5"> selected="selected"</mt:if>><__trans phrase="UTC+9.5 (Central Australian Time)"></option>
<option value="9"<mt:if name="SERVER_OFFSET_9"> selected="selected"</mt:if>><__trans phrase="UTC+9 (Japan Time)"></option>
<option value="8"<mt:if name="SERVER_OFFSET_8"> selected="selected"</mt:if>><__trans phrase="UTC+8 (China Coast Time)"></option>
<option value="7"<mt:if name="SERVER_OFFSET_7"> selected="selected"</mt:if>><__trans phrase="UTC+7 (West Australian Time)"></option>
<option value="6.5"<mt:if name="SERVER_OFFSET_6_5"> selected="selected"</mt:if>><__trans phrase="UTC+6.5 (North Sumatra)"></option>
<option value="6"<mt:if name="SERVER_OFFSET_6"> selected="selected"</mt:if>><__trans phrase="UTC+6 (Russian Federation Zone 5)"></option>
<option value="5.5"<mt:if name="SERVER_OFFSET_5_5"> selected="selected"</mt:if>><__trans phrase="UTC+5.5 (Indian)"></option>
<option value="5"<mt:if name="SERVER_OFFSET_5"> selected="selected"</mt:if>><__trans phrase="UTC+5 (Russian Federation Zone 4)"></option>
<option value="4"<mt:if name="SERVER_OFFSET_4"> selected="selected"</mt:if>><__trans phrase="UTC+4 (Russian Federation Zone 3)"></option>
<option value="3.5"<mt:if name="SERVER_OFFSET_3_5"> selected="selected"</mt:if>><__trans phrase="UTC+3.5 (Iran)"></option>
<option value="3"<mt:if name="SERVER_OFFSET_3"> selected="selected"</mt:if>><__trans phrase="UTC+3 (Baghdad Time/Moscow Time)"></option>
<option value="2"<mt:if name="SERVER_OFFSET_2"> selected="selected"</mt:if>><__trans phrase="UTC+2 (Eastern Europe Time)"></option>
<option value="1"<mt:if name="SERVER_OFFSET_1"> selected="selected"</mt:if>><__trans phrase="UTC+1 (Central European Time)"></option>
<option value="0"<mt:if name="SERVER_OFFSET_0"> selected="selected"</mt:if>><__trans phrase="UTC+0 (Universal Time Coordinated)"></option>
<option value="-1"<mt:if name="SERVER_OFFSET__1"> selected="selected"</mt:if>><__trans phrase="UTC-1 (West Africa Time)"></option>
<option value="-2"<mt:if name="SERVER_OFFSET__2"> selected="selected"</mt:if>><__trans phrase="UTC-2 (Azores Time)"></option>
<option value="-3"<mt:if name="SERVER_OFFSET__3"> selected="selected"</mt:if>><__trans phrase="UTC-3 (Atlantic Time)"></option>
<option value="-3.5"<mt:if name="SERVER_OFFSET__3_5"> selected="selected"</mt:if>><__trans phrase="UTC-3.5 (Newfoundland)"></option>
<option value="-4"<mt:if name="SERVER_OFFSET__4"> selected="selected"</mt:if>><__trans phrase="UTC-4 (Atlantic Time)"></option>
<option value="-5"<mt:if name="SERVER_OFFSET__5"> selected="selected"</mt:if>><__trans phrase="UTC-5 (Eastern Time)"></option>
<option value="-6"<mt:if name="SERVER_OFFSET__6"> selected="selected"</mt:if>><__trans phrase="UTC-6 (Central Time)"></option>
<option value="-7"<mt:if name="SERVER_OFFSET__7"> selected="selected"</mt:if>><__trans phrase="UTC-7 (Mountain Time)"></option>
<option value="-8"<mt:if name="SERVER_OFFSET__8"> selected="selected"</mt:if>><__trans phrase="UTC-8 (Pacific Time)"></option>
<option value="-9"<mt:if name="SERVER_OFFSET__9"> selected="selected"</mt:if>><__trans phrase="UTC-9 (Alaskan Time)"></option>
<option value="-10"<mt:if name="SERVER_OFFSET__10"> selected="selected"</mt:if>><__trans phrase="UTC-10 (Aleutians-Hawaii Time)"></option>
<option value="-11"<mt:if name="SERVER_OFFSET__11"> selected="selected"</mt:if>><__trans phrase="UTC-11 (Nome Time)"></option>
</select>
</mtapp:setting>
<mtapp:setting
id="has-license"
label="<__trans phrase="License">"
content_class="field-content-text"
help_page="blog_settings_general"
help_section="creative_commons_license">
<div id="has-license" style="display: none;">
<mt:if name="cc_license"><a href="<mt:var name="cc_license_url">"><img src="<mt:var name="cc_license_image_url">" /></a><br /></mt:if>
<__trans phrase="Your blog is currently licensed under:"> <strong id="cc-license-name"><mt:var name="cc_license_name"></strong><br />
<a href="javascript:void(0);" onclick="return setLicense();"><__trans phrase="Change license"></a> | <a href="javascript:void(0);" onclick="return doRemoveLicense();"><__trans phrase="Remove license"></a>
</div>
<div id="no-license" style="display: none;">
<__trans phrase="Your blog does not have an explicit Creative Commons license."><br />
<a href="javascript:void(0);" onclick="return setLicense();"><__trans phrase="Select a license"></a>
</div>
<mt:if name="cc_license">
<script type="text/javascript">
var e = getByID('has-license');
if (e) e.style.display = 'block';
</script>
<mt:else>
<script type="text/javascript">
var e = getByID('no-license');
if (e) e.style.display = 'block';
</script>
</mt:if>
<input type="hidden" name="cc_license" value="<mt:var name="cc_license" escape="html">" />
</mtapp:setting>
</fieldset>
<!-- HolidayCalendar DateData Add -->
<fieldset>
<h3>Input Target Month</h3>
<h4>Example: 2008/05</h4>
<mtapp:setting
id="calendar_currentmonth"
label="TargetMonth">
<div class="textarea-wrapper">
<input name="calendar_currentmonth" id="calendar_currentmonth" class="full-width" maxlength="100" value="<mt:var name="calendar_currentmonth" escape="html">" class="wide" />
</div>
</mtapp:setting>
<h3>Input Holiday Data</h3>
<h4>Example: 5,6,12,13,20,21,28,29</h4>
<mtapp:setting
id="calendar_holiday"
label="HolidayData">
<div class="textarea-wrapper">
<input name="calendar_holiday" id="calendar_holiday" class="full-width" maxlength="100" value="<mt:var name="calendar_holiday" escape="html">" class="wide" />
</div>
</mtapp:setting>
</fieldset>
<!-- HolidayCalendar DateData Add -->
<mt:setvarblock name="action_buttons">
<button
type="submit"
accesskey="s"
title="<__trans phrase="Save changes to these settings (s)">"
class="primary-button"
><__trans phrase="Save Changes"></button>
</mt:setvarblock>
<mt:include name="include/actions_bar.tmpl" bar_position="bottom" hide_pager="1" settings_bar="1">
</form>
<mt:include name="include/footer.tmpl">
- カテゴリ:215プラグイン関係
トラックバック(0)
このブログ記事を参照しているブログ一覧: MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン(改)
このブログ記事に対するトラックバックURL:
- Categories
- Entries
-
- 管理画面を拡張する(メニューとメソッド追加)
- MT4.1:追加したファンクションタグのみへモデファイア追加
- MT4.1:エントリの既存DBへアクセスしてデータ取得
- MT4.1:MTの計算機能を拡張するプラグイン(CalcExp)開発の話
- MT4.1:MTの計算機能を拡張するプラグイン(CalcExp)配布
- MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン(改)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(プラグイン設定編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(ブログ毎編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(カテゴリ編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(エントリ編)
- MT4.1:カテゴリの並べ替え(オリジナルプラグイン+ハッシュ変数)
- サンプルプラグインを手入力した(AddField)
- MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン
- サンプルプラグインを手入力した(RandomEntry)
- 最小単位のプラグインを生成するサンプル(ファンクション、ブロック、モデファイア、コールバック)

コメント(2)
かおるこ (2008年7月 9日 13:06)
はじめまして。
ちょうどお店の営業日をカレンダーで表現したいと思っていたので早速利用させていただきました。
ただ、導入前のカレンダーは投稿日に日付アーカイブへジャンプするリンクをつけていたので、その部分はどう再現したらいいものかと考えあぐねています。
もし良いアイデアがございましたらご教示ください。
yoshi (2008年7月 9日 23:24)
このプラグインは、単なるperl書きの練習だったものです。未来の日付カレンダーを色分けする機能しか持たないのです。
もしエントリがある場合にそこへリンクを貼るということは考えてませんでしたし、今後も実装するつもりはないです。
それを実現するアイデアですが
1.プラグインを改造する
2.別のカレンダーを使う
くらいしか思いつきません。すいませんです。
コメントする