templateの最近のブログ記事

エントリー全件を出力させる場合、<MTEntries lastn="9999">などと、エントリーを通常想定されるはるか上限の9999をモデファイアで指定することが多いのですが、エレガントではないので、WingMemoさんの、「WingMemo: <MTEntries>で全件出力する方法 MT4版」というエントリーに書かれた方法を利用しています。

<mt:SetVarBlock name="ecount"><$mt:BlogEntryCount$></mt:SetVarBlock>
<mt:Entries lastn="$ecount">
内容
</mt:Entries>

あるいは、

<mt:BlogEntryCount setvar="entry_count">
<$mt:Entries lastn="$entry_count">
内容
</$mt:Entries>

としています。

記事本文で和暦を使っているのに、全体では西暦表示だったのがいまいちでしたが、2つのサイトから解決策が。

MovableType4からは、年別アーカイブがプラグイン無しで作成できますが、月毎にヘッダーをつけるにはどうすればよいか?

デザインユニット「linker」のwebsiteにピッタリの記事が出ていましたので早速採用しました。

実際のコードは次の通りです。

<mt:IfArchiveType archive_type="Yearly">
<div class="section">
<mt:SetVar name="match" value="1">
<mt:Entries sort_order="ascend">
<mt:SetVarBlock name="thisMonth"><mt:EntryDate format="%b"></mt:SetVarBlock>
<mt:If name="match" eq="1">
<h3><mt:GetVar name="thisMonth">月</h3>
<div class="asset-content">
</mt:If>
<dl class="archive_list">
<$mt:Include module="ブログ記事の概要"$>
</dl>
<mt:EntryNext><mt:SetVarBlock name="entryMonth"><mt:EntryDate format="%m"></mt:SetVarBlock></mtEntryNext>
<mt:If name="entryMonth" ne="$thisMonth">
</div>
<mt:SetVar name="match" value="1">
<mt:Else>
<mt:SetVar name="match" value="0">
</mt:If>  
<mt:EntriesFooter>
<mt:If name="match" eq="0">
</div>
</mt:If>
</mt:EntriesFooter>
</mt:Entries>
</div>
</mt:IfArchiveType>

複数ブログで構成されたサイトで、検索結果のテンプレートを共通化したい場合は、mt-config.cgiに環境変数

SearchAltTemplate altsearch altsearch.tmpl

と記述し、代替の検索結果のテンプレートを指定(MT/search_templates/altsearch.tmpl)しますが、ここで落とし穴。

このままだと、検索結果のFeedが出力されません。

検索結果のFeedをクリック

検索結果Feedテンプレートが無いエラー

そこで、検索結果のFeedテンプレートも次のように環境変数に記述します。

SearchAltTemplate altsearch altsearch.tmpl
SearchAltTemplate feed results_feed.tmpl

MT4iの作者、太鉄さんにご指摘頂き気付きました。ありがとうございます。

「Movable Type 4.2 パーフェクトガイド」(小粋空間の荒木勇次郎著:毎日コミュニケーションズ)に、メールマガジンを発行する方法について解説がありました。

具体的には、本を読んでいただくとして自分自身の覚書。

手順

1.購読・購読解除用のインデックステンプレートを新規に作成し、次のフォームを埋め込む。

<div class="section">
<h3>メールマガジンの購読</h3>
<div class="asset-content">
<p>次のフォームからメールアドレスを登録するだけで、このサイトのブログをメールで受け取ることができます。どうぞご利用ください。</p>
<form method="post" action="<$mt:CGIPath$>mt-add-notify.cgi">
<div id="comments-open-data">
<input type="hidden" name="blog_id" value="<$mt:BlogID$>" />
<input type="hidden" name="_redirect" value="<$mt:BlogURL$>" />
<div id="comment-form-email">
<label for="registry-email">登録するアドレス:</label><br />
<input name="email" for="registry-email" size="30" />
</div>
</div>
<div id="comments-open-footer">
<input type="submit" class="submit" value="購読する" />
</div>
</form>
</div>
<h3>メールマガジンの購読を解除</h3>
<div class="asset-content">
<p>メールマガジンの購読を解除するには、次のフォームにメールアドレスを入力して「購読を解除」をクリックしてください。</p>
<form method="post" action="<$mt:CGIPath$>mt-add-notify.cgi">
<div id="comments-open-data">
<input type="hidden" name="__mode" value="unsubscribe" />
<div id="comment-form-email">
<label for="deregistration-email">解除するアドレス:</label><br />
<input name="email" id="deregistration-email" size="30" />
</div>
<div id="comments-open-footer">
<input type="submit" class="submit" value="購読を解除する" />
</div>
</div>
</form>
</div>

2.システムの「ブログ記事の共有」テンプレートを次のように書き換え。

富山市議会議員 しきだ博紀 メールマガジン「<$mt:EntryTitle$>」
<$mt:EntryDate mail="1" format="%x"$>
<mt:If name="object_type" eq="entry">表示する<mt:Else>表示する</mt:If>: <mt:SetVarBlock name="entry_status"><$mt:EntryStatus$></mt:SetVarBlock><mt:If name="entry_status" eq="Publish"><$mt:EntryPermalink$><mt:Else><$mt:Var name="entry_editurl"$></mt:If>
-------------------------------------
<mt:If name="send_excerpt">
<$mt:EntryExcerpt wrap_text="72"$>
-------------------------------------</mt:If>
<mt:If name="message">メッセージ: 
<$mt:Var name="message"$>
-------------------------------------</mt:If>
<mt:If name="send_body">
<$mt:EntryBody remove_html="1" wrap_text="72"$>
-------------------------------------</mt:If>
■ 富山市議会議員 しきだ博紀
e-mail info@shikidahironori.jp
Twitter http://twitter.com/h_shikida
公式サイト http://<$mt:BlogHost$>
購読と解除(PCから) http://<$mt:BlogHost$>/blog/mail_magazine.html
購読と解除(携帯から) http://<$mt:BlogHost$>/blog/m/mail_magazine.html

3.必要に応じ、lib/MT/L10N/ja.pmを書き換えて読確認メールのメッセージと、メールマガジンのタイトルを変更することもできます。このサイトでは、タイトルに関するの982行目のみを変更していますが、詳しくは書籍をご覧ください。

'[_1] Update: [_2]' => 'メルマガ: [_1] - [_2]',

4.あとはブログ記事の編集画面で「共有」をクリックすれば、アドレス帳に登録されたメールアドレスへ、ブログ記事を送ることが出来ます。

履歴が残らないなどの点はありますが、とりあえず手軽にメールマガジンを発行したい場合に使えます。本当はプラグインがあればいいのだけれど。

【2010-04-21 追記】
mt-config.cgiに
EnableAddressBook 1
と記述しないとアドレス帳が有効になりません(一覧に表示されません)
photo
Movable Type 4.2 パーフェクトガイド
毎日コミュニケーションズ 2008-07-31

by G-Tools , 2009/11/09

オリジナルのcssでデザインした場合、コメントのサインイン画面でロード中の画像が表示されない場合は、次のような画像を用意し(以前書いたように、このサイトでは、ajaxload.infoというサイトで作成したものを使用しています。)

ロード中の画像(ajax-loader.gif)

スタイルシートに次の記述をします。

.status-indicator {
    display: inline;
    height: 16px;
    width: 16px;
    background: url(../images/ajax-loader.gif) no-repeat left center;
    padding: 2px 7px;
}

当然のことながら、heightとwidthは画像の大きさに合わせてください。backgroundのurlも画像へのパスもか各自の環境にあわせて書き換えを。

テンプレートだけで関連するエントリーを表示する方法の覚書。

こんなサイトで使用してます。

いくつかの方法がありますが二つご紹介。なお、テンプレートタグは当方で使用しているものに変更してあります(ul要素ではなくdl要素を使うなど)。

1. MTSetVar(Block)/MTIfタグの具体的な利用例。 - Junnama Onlineで公開されている方法。

<mt:EntryIfTagged>
<div class="asset-more">
<mt:SetVarBlock name="entrytags"><mt:EntryTags glue=" OR "><$mt:TagName$></mt:EntryTags></mt:SetVarBlock>
<mt:SetVarBlock name="thisid"><mt:EntryID></mt:SetVarBlock>
<mt:SetVar name="match" value="0"><mt:Ignore><!--←当該エントリーがマッチしたかどうか--></mt:Ignore>
<mt:Entries tag="$entrytags" lastn="11"><mt:Ignore><!--←10件でなく11件にしておく--></mt:Ignore>
<mt:SetVarBlock name="eid"><mt:EntryID></mt:SetVarBlock>
<mt:SetVarBlock name="entryCount"><mt:EntriesCount></mt:SetVarBlock><mt:Ignore><!--←何件マッチしたか--></mt:Ignore>
<mt:If name="entryCount" gt="1">
<mt:Ignore><!--↑1件以上マッチしたら出力 / 1件だったら当該エントリのみと判断できる--></mt:Ignore>
<mt:EntriesHeader><dl class="relatedEntry">
<dt><$mt:GetVar name="entrytags"$>の記事</dt>
<dd>
<ul></mt:EntriesHeader>
<mt:Unless name="__last__"><mt:Ignore><!--←ループの最後でなければ--></mt:Ignore>
<mt:Unless name="eid" eq="$thisid">
<li><a href="<mt:EntryPermalink>" title="<$mt:EntryTitle encode_html="1"$>に移動します"><mt:EntryTitle></a></li>
<mt:Else>
<mt:SetVar name="match" value="1"><mt:Ignore><!--←当該エントリーがマッチしたことを覚えておく!--></mt:Ignore>
</mt:Else>
</mt:Unless>
<mt:Else><mt:Ignore><!--←ループの最後ならば--></mt:Ignore>
<mt:If name="match"><mt:Ignore><!--←当該エントリと既に一致していた場合は11件目を表示--></mt:Ignore>
<li><a href="<mt:EntryPermalink>" title="<$mt:EntryTitle encode_html="1"$>に移動します"><mt:EntryTitle></a></li>
<mt:Else>
<mt:If name="__counter__" ne="11"><mt:Ignore><!--←11件に満たない場合も無条件に表示--></mt:Ignore>
<li><a href="<mt:EntryPermalink>" title="<$mt:EntryTitle encode_html="1"$>に移動します"><mt:EntryTitle></a></li>
</mt:If>
</mt:Else>
</mt:If>
</mt:Else>
</mt:Unless>
<mt:EntriesFooter></ul>
</dd>
</dl></mt:EntriesFooter>
</mt:If>
</mt:Entries>
</div>
</mt:EntryIfTagged>

2. Movable Type 備忘録 - エントリ・タグを使って関連するエントリ一覧を表示だとこんな感じ

<mt:EntryIfTagged>
<div class="asset-more">
<mt:SetVarBlock name="entid"><$MTEntryID$></mt:SetVarBlock>
<mt:SetVarBlock name="enttags"><MTEntryTags glue=" OR "><$MTTagName$></MTEntryTags></mt:SetVarBlock>
<MTEntries tags="$enttags" lastn="6">
<MTEntriesHeader>
<dl class="relatedEntry">
<dt><$mt:GetVar name="enttags"$>の記事</dt>
<dd>
<ul>
</MTEntriesHeader>
<mt:SetVarBlock name="cur"><$MTEntryID$></mt:SetVarBlock>
<mt:If name="entid" ne="$cur">
<li><a href="<MTEntryPermalink>" title="<$mt:EntryTitle encode_html="1"$>に移動します"><$MTEntryTitle$></a></li>
</mt:If>
<MTEntriesFooter>
</ul>
</dd>
</dl>
</MTEntriesFooter>
</MTEntries>
</div>
</mt:EntryIfTagged>

mt.jsは、コメントにしか利用しないので、HTMLヘッダーテンプレートから

<script type="text/javascript" src="<$mt:Link template="javascript"$>"></script>

を削除して、ブログ記事アーカイブテンプレートに記述しなおしたら、検索テンプレートで次の個所でスクリプトエラーが発生。

var xh = mtGetXmlHttp();

「mt.jsの呼び出しを元に戻したら、スクリプトエラーが無くなった」という覚書でした。

新着エントリーに新着表示マークをつけるには、JavaScriptを使う方法がありますが、このサイトではメインページ以外のサイドバーの新着記事リストを「Ajax によるモジュール化」により行っているため、新着表示マークを表示させるためには再度JavaScriptを読み込ませなくてはいけません。

そこで、MTタグで自動で消える"New"マークを表示する | 石輪っぷり! | 有限会社 Willさんいんで紹介されている、MTタグのみで行う方法にしてみました。

実際のテンプレートは次の通りです。

<mt:SetVarBlock name="today"><$mt:Date format="%Y%j"%></mt:SetVarBlock>
<h2>ブログ最新</h2>
<div class="widget-content">
  <ul>
  <mt:Entries lastn="10">
    <li><a href="<$mt:EntryPermalink$>" title="<$mt:EntryTitle encode_html="1"$>に移動します"><$mt:EntryTitle encode_html="1"$></a> (<$mt:EntryDate format="%b月%e日"$>)
    <mt:SetVarBlock name="passed"><$mt:EntryDate format="%Y%j"%></mt:SetVarBlock>
    <mt:SetVar name="passed" value="$today" op="sub">
    <mt:If name="passed" ge="-5">
     <span class="newmark">New!</span>
    </mt:If>
    <mt:If name="passed" ge="-640">
      <mt:If name="passed" le="-635">
       <span class="newmark">New!</span>
      </mt:If>
    </mt:If>
    </li>
  </mt:Entries>
  </ul>
</div>
関連エントリー

イントロダクション

【2009-11-06 追記】
勘違いがあったので全面書き直し

MTWriteToFileプラグインでフォルダアーカイブ特定のフォルダをフィルタリングという記事の続きです。

サーバーの出力するエラーページ(404.htmlなど)ではあまりにも淋しいので、検索窓や問い合わせ先が書いてあるオリジナルのエラーページをウェブページで作ることになりました。

(1)errorフォルダ(/error)を作ります。

(2)ここにウェブページでエラーページを作ります。

特定のフォルダをフィルタリングという記事のとおり、errorフォルダアーカイブは作成されません。
エラーページにはフォルダーアーカイブはいりませんから、errorフォルダにフィルタリングしたわけです。

(3).htaccessファイルに、以下の記述を加えてアップロードして完成です。

ErrorDocument 401 /error/401.html
ErrorDocument 403 /error/403.html
ErrorDocument 404 /error/404.html
ErrorDocument 500 /error/500.html

次の課題

ところがいくつかのサーバーでは、エラーページがrootにいないと出力されませんでした。その場合、rootフォルダーに直接エラーページを作ることにします。また、.htaccessファイルも以下のようになります。

ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html

さらに、サードバーには目次やらなんやらと、エラーページには要らないウイジットがありますが、フォルダーでフィルタリングが出来ないので、カスタムフィールド(名前:目次に表示、ベースネーム:show_list、テンプレートタグpagedata_show_list、種類:チェックボックス)を作ります。エラーページの編集画面で出来たチェックボックスにチェックを入れます。

次にサイドバーのところで、これを利用して2段階のフィルタリングをかけます。

<mt:SetVarBlock name="showlist"><mt:pagedata_show_list></mt:SetVarBlock>
<mt:If name="showlist" eq="1">

でエラーページ以外のウェブページに目次を出力させます。カスタムフィールドの値が1(チエックボックスにチェックした状態)を上記のコードで取得してフルタリングします。

さらに、そのままではウェブページの目次にエラーページも出力されて並んでしまうので、

<mt:Pages field:show_list="1" lastn="10">
<li><a href="<$mt:PagePermalink$>"><$mt:PageTitle encode_html="1"$></a></li>
</mt:Pages>

とMTPagesタグにfield:カスタムフィールドのベースネームを使ったフィルタリングをします。

<mt:If name="page_template">
<mt:SetVarBlock name="showlist"><mt:pagedata_show_list></mt:SetVarBlock>
<mt:If name="showlist" eq="1">
<h2>目次</h2>
<div class="widget-content">
<ul>
<mt:Pages field:show_list="1" lastn="10">
<li><a href="<$mt:PagePermalink$>"><$mt:PageTitle encode_html="1"$></a></li>
</mt:Pages>
</ul>
</div>
<$mt:Include module="sh_ダウンロード"$>
</mt:If>
<mt:ElseIf name="entry_template">
以下続く...

これで、エラーページ以外には目次が出力されます。ポイントはカスタムフィールドのベースネームとテンプレートタグの使い分けです。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちtemplateカテゴリに属しているものが含まれています。

前のカテゴリはpluginsです。

次のカテゴリはupgradeです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.291