Under the Bridge

a Picture of the Late Him

MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン(改)

2008年5月 5日 16:29 | Writer: yoshi | 記事本文 | コメント(2) | トラックバック(0)

先日作成した「営業日(休日)をイッパツで表現するカレンダープラグイン」であるが、テンプレートって何?という人が少しでも使いやすいようにと、ブログごとに設定をつけた。

alt-tmplフォルダへ拡張した設定画面を置き、追加したDBフィールドとの連携を図っただけである。

プラグインを入れると、ブログの設定画面が下図のようになる。

20080505_01.png
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">

このように出力される。

20080505_02.png

プラグインコード

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&amp;jurisdiction_choose=1&amp;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">

トラックバック(0)

このブログ記事を参照しているブログ一覧: MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン(改)

このブログ記事に対するトラックバックURL:

コメント(2)

かおるこ (2008年7月 9日 13:06)

はじめまして。
ちょうどお店の営業日をカレンダーで表現したいと思っていたので早速利用させていただきました。
ただ、導入前のカレンダーは投稿日に日付アーカイブへジャンプするリンクをつけていたので、その部分はどう再現したらいいものかと考えあぐねています。
もし良いアイデアがございましたらご教示ください。

yoshi (2008年7月 9日 23:24)

このプラグインは、単なるperl書きの練習だったものです。未来の日付カレンダーを色分けする機能しか持たないのです。
もしエントリがある場合にそこへリンクを貼るということは考えてませんでしたし、今後も実装するつもりはないです。

それを実現するアイデアですが
1.プラグインを改造する
2.別のカレンダーを使う
くらいしか思いつきません。すいませんです。

コメントする






Categories
Entries
Feed
スポンサードリンク

parts

フィードメーター - Under the Bridge

あわせて読みたい

なかのひと

2008年4月5日開催、MT4LP5

2008 yoshi(apstar)