Top > Movable Type > カスタマイズ > 検索 [全て開く]
2011年11月28日

Movable Type 5.1の検索で「blog_idパラメータが不正です。」となる不具合の対処

Movable Type 5.1の検索で検索結果テンプレートを指定する方法」で紹介した方法で不具合が発生するケースがあるので、その対処方法を紹介します。

1.問題点

次のような検索フォーム(blog_idおよびIncludeBlogsのinput要素を指定しない)で検索を実行します。

<form method="get" action="<$mt:CGIPath$><$MTSearchScript$>">
    <input type="text" id="search" name="search" value="<$mt:SearchString$>" />
    <input type="submit" value="GO" />
</form>

この場合、次の「blog_idパラメータが不正です。」というエラーが発生します。

検索時のエラー

そもそも、blog_idおよびIncludeBlogsを指定しない検索フォームが適切かどうかという点ですが、2011年11月現在の公式ドキュメントに次の記載があり、適切であるように読み取れます。

Movable Type 5 ドキュメント - 検索ページのカスタマイズ

管理しているブログ全てを検索の対象にしたい場合は、検索フォームの IncludeBlogsを削除し、検索対象の絞り込みをしないようにします。

<form method="get" action="<$mt:CGIPath$><$MTSearchScript$>">
    <input type="text" id="search" name="search" value="<$mt:SearchString$>" />
    <input type="submit" value="GO" />
</form>

ソースコードをトレースしたところ、MT5.0はドキュメント通りの動作になるようですが、MT5.1では検索時のパラメータチェック処理が変更されており、冒頭のエラーが発生するようです。

2.対処方法

MT5.1(ここではMT5.12)での対処方法は、lib/MT/App/Search.pmの以下の赤色で示した2行を、削除またはコメントアウト(行頭に「#」を付与)します。

変更前

…前略…
sub init_request {
    my $app = shift;
    $app->SUPER::init_request(@_);
    …中略…
 
    # invalid request if they are given Zero as blog_id
    return $app->errtrans( 'Invalid [_1] parameter.', 'blog_id' )
        unless ( $blog_id > 0 );
 
    my $params = $app->registry( $app->mode, 'params' );
    …中略…
}
…後略…

変更後

…前略…
sub init_request {
    my $app = shift;
    $app->SUPER::init_request(@_);
    …中略…
 
    # invalid request if they are given Zero as blog_id
#    return $app->errtrans( 'Invalid [_1] parameter.', 'blog_id' )
#        unless ( $blog_id > 0 );
 
    my $params = $app->registry( $app->mode, 'params' );
    …中略…
}
…後略…

本対処はMT5.0で存在していなかったチェック処理を削除しただけです。

これで冒頭のエラーは発生しなくなりますが、処理を削除することで他の問題が発生する可能性がありますので、自己責任でご利用ください。

Comments [0] | Trackbacks [0]
2011年11月27日

Movable Type 5.1の検索で検索結果テンプレートを指定する方法

November 27,2011 12:33 AM
Tag:[, ]
Permalink

Movable Type 5.1の検索で検索結果テンプレートを指定する方法を紹介します。ここで紹介する方法は5.12で動作確認しています。

1.基本動作

検索結果テンプレートの基本的な動作は次のようになります(公式ドキュメントより抜粋)。

Movable Type 5 ドキュメント - 検索ページのカスタマイズ

IncludeBlogsで最初に指定したブログのテンプレートを利用します。

IncludeBlogsは検索対象を指定するパラメータで、フォームに次の赤色のように記述します。

<form method="get" action="<$mt:CGIPath$><$MTSearchScript$>">
    <input type="text" id="search" name="search" value="<$mt:SearchString$>" />
    <input type="hidden" name="IncludeBlogs" value="1,2,3,4,5" />
    <input type="submit" value="GO" />
</form>

ブログIDを1つしか指定しなければそのブログIDの検索結果テンプレートを利用します。上記の設定ではブログID「1」の検索結果テンプレートを利用します。

2.特定のブログの検索結果テンプレートを指定する

検索フォームに赤色のinput要素を追加します。value属性には、検索結果テンプレートを使用したいブログのブログIDを指定します。

<form method="get" action="<$mt:CGIPath$><$MTSearchScript$>">
    <input type="text" id="search" name="search" value="<$mt:SearchString$>" />
    <input type="hidden" name="IncludeBlogs" value="1,2,3,4,5" />
    <input type="hidden" name="blog_id" value="2" />
    <input type="submit" value="GO" />
</form>

この場合はブログID「2」の検索結果テンプレートを利用します。

3.代替テンプレートを使って検索結果を表示する

「代替テンプレート」とは、どのブログにも属さないテンプレートを指します。検索フォームにname属性「Template」のinput要素を追加することで、検索結果用の代替テンプレートを指定します。

代替テンプレートを使った検索結果のサンプル
代替テンプレートによる検索結果

検索結果用の代替テンプレートは、MTのインストールディレクトリにあるsearch_templatesディレクトリに配置します。そのディレクトリにはdefault.tmplがサンプルとして置かれているので、それをリネームして利用すると良いでしょう。なお正式な代替テンプレートファイル名として「default.tmpl」は利用できないので注意してください。

代替テンプレートを使って検索結果を表示するには、mt-config.cgiに次の内容を追加します。ここでは代替テンプレートのファイル名を「altsearch.tmpl」とします。

SearchAltTemplate altsearch altsearch.tmpl

検索フォームに次のinput要素を追加します。value属性には、SearchAltTemplateで設定した2つめの文字列(=利用したい代替テンプレートの拡張子を除いた名称)を設定してください。

<input type="hidden" name="Template" value="altsearch" />

代替テンプレートを利用するときに、すべてのブログを検索対象にしたい場合は、name属性がblog_idおよびIncludeBlogsのinput要素を指定しないでください。ただしこの設定を行った場合には不具合が発生するため、対処方法は別途エントリーします。

blog_idのinput要素を指定した場合、代替テンプレートで利用するテンプレートタグについて、指定したブログIDの情報が適用されることがあります。例えばMTLinkタグがそうです。

IncludeBlogsのinput要素でブログIDを指定すれば、指定したブログを検索対象にして代替テンプレートで検索結果を表示することができますが、先頭に設定したブログIDの情報が適用されることがあります。適用されることで何か不都合が生じる場合はblog_idと併用することを推奨します。

4.参考情報

Comments [0] | Trackbacks [0]
2009年10月14日

Movabel Type の検索結果フィードを利用する

October 14,2009 1:55 AM
Tag:[, ]
Permalink

当サイトのブログ検索(またはタグ検索)結果画面に、検索結果フィードのリンクを追加しました。

検索結果フィードのリンク

このリンクの利用方法は次の通りです。

  1. ブログの検索フォームから検索、またはタグ検索
  2. 検索結果の右上に表示された「<検索文字列>の検索結果を購読する」のリンクをコピー
  3. コピーしたリンクをフィードに登録

上記の設定を行なうことで、そのブログで検索文字列に関連した記事が投稿されると、フィードからその記事だけを購読することができるようになります(下は設定後の購読例)。特定の話題に関する記事だけを読みたいときに大変便利です。

検索結果フィードのリンク

検索結果フィードのリンクはデフォルトテンプレートで用意されているので改めて設定する必要はないと思いますが、当サイトの公開テンプレートでは提供していないので、以下に掲載しておきます。

<mt:If name="search_results">
  <mt:If tag="SearchString">
<div class="side">
  <img src="<$mt:StaticWebPath$>images/status_icons/feed.gif" alt="購読する" width="9" height="9" /> <a href="<$mt:CGIPath$><$mt:SearchScript$>?<mt:IfTagSearch>tag<mt:else>search</mt:IfTagSearch>=<$mt:SearchString encode_url="1"$>&amp;Template=feed&amp;IncludeBlogs=<$mt:SearchIncludeBlogs$>&amp;limit=<$mt:SearchMaxResults$>" title="<mt:IfTagSearch>「<$mt:SearchString$>」の検索結果を購読<mt:Else>タグ「<$mt:SearchString$>」を購読</mt:IfTagSearch>"><mt:IfTagSearch>タグ「<$mt:SearchString$>」の検索結果を購読する<mt:Else>「<$mt:SearchString$>」の検索結果を購読する</mt:IfTagSearch></a>
</div>
  </mt:If>
</mt:If>
Comments [0] | Trackbacks [0]
2009年3月12日

検索結果のブログ記事タイトルからアーカイブページへリンクする

March 12,2009 1:55 AM
Tag:[, , ]
Permalink

検索結果のブログ記事タイトルからカテゴリーアーカイブページへリンクするカスタマイズです。ご質問を頂きましたので、本エントリーにて情報展開します。

1.カスタマイズ

「ブログ記事の概要」テンプレートの下記の青色部分を追加します。

<$mt:EntryTrackbackData$>
<div id="entry-<$mt:EntryID$>" class="entry-asset asset hentry">
    <div class="asset-header">
<mt:if name="search_results">
        <h2 class="asset-name entry-title"><a href="<$mt:EntryLink archive_type="Category"$>#entry-<$mt:entryID$>" rel="bookmark"><$mt:EntryTitle$></a></h2>
<mt:else>
        <h2 class="asset-name entry-title"><a href="<$mt:EntryPermalink$>" rel="bookmark"><$mt:EntryTitle$></a></h2>
</mt:if>
        <$mt:Include module="ブログ記事のメタデータ"$>
...後略...

2.注意事項

すべてのブログ記事がカテゴリーに登録されている必要があります。MTIf タグを組み合わせればカテゴリーに未登録なブログ記事はブログ記事にとばせると思いますが、ここでは割愛します。

Comments [0] | Trackbacks [0]
2009年2月 6日

Movable Type で複数ブログを検索する

February 6,2009 1:55 AM
Tag:[, ]
Permalink

Movable Type で複数ブログを作成している場合、複数のブログをまとめて検索することができます。

1.すべてのブログを検索する

デフォルトテンプレートを例にすると、「ウィジェットテンプレート」にある「検索」の中の、次の1行(赤色部分)を削除します。

<div class="widget-search widget">
    <h3 class="widget-header">検索</h3>
    <div class="widget-content">
        <form method="get" action="<$mt:CGIPath$><$mt:SearchScript$>">
            <input type="text" id="search" class="ti" name="search" value="<$mt:SearchString$>" />
<mt:If name="search_results">
            <input type="hidden" name="IncludeBlogs" value="<$mt:SearchIncludeBlogs$>" />
            <mt:Ignore>
            <!-- use these options only with MT::App::Search::Legacy -->
            <ul class="search-options">
                <li><input type="checkbox" name="CaseSearch" /> 大文字/小文字を区別する</li>
                <li><input type="checkbox" name="RegexSearch" /> 正規表現</li>
            </ul>
            </mt:Ignore>
<mt:Else>
            <input type="hidden" name="IncludeBlogs" value="<$mt:BlogID$>" />
</mt:If>
            <input type="hidden" name="limit" value="<$mt:SearchMaxResults$>" />
            <input type="submit" accesskey="4" value="検索" />
        </form>
    </div>
</div>
...後略...

2.指定したブログを検索する

2番目のブログと3番目のブログを検索する場合、1項で削除した行を復活させ、value属性にブログIDをカンマ区切りで記述します。

<input type="hidden" name="IncludeBlogs" value="2,3" />

すべてのブログIDを指定すれば、1項と同じ効果があります。

3.注意事項

1項の方法では、検索結果テンプレートが使われず、アプリケーションディレクトリの search_templates ディレクトリにある、default.tmpl が読み込まれます(下)。

default.tmpl

このテンプレートの代替テンプレートを、環境変数 SearchAltTemplate で設定することもできます。

2項の方法であれば本来のテンプレートが使われますが、検索結果テンプレートからインクルードするテンプレートが、検索対象のブログですべて揃っていないと、テンプレートが見つからない旨のエラーが発生します。

細かい部分まで動作を確認できていないので、いろいろ試してみてください。

Comments [2] | Trackbacks [1]
2009年1月22日

タグ検索を絞り込む(その2:カスタマイズ)

January 22,2009 1:55 AM
Tag:[, , , ]
Permalink

タグ検索を絞り込む(その1)」の続きで、Movable Type 4 でのカスタマイズ方法です。

1.タグの絞り込み検索の仕組み

タグ検索は CGI(mt-search.cgi)を実行します。実行したURLのクエリー文字列の「tag=」の部分に、検索するタグ名を与えることでタグ検索が行なわれます。

例えば、タグ「Movable Type」による初回のタグ検索は次のようなURLを実行します。

http://user-domain/mt/mt-search.cgi?blog_id=1&amp;tag=MovableType&amp;limit=20&amp;IncludeBlogs=1

このクエリー文字列「tag=」の右辺に、「 AND (ANDの前後に半角スペース)」を与えれば、複数のタグによる検索が可能になります。

例えば、タグ「Movable Type」と「Customize」で検索を行なうには、次のURLを実行します。

http://user-domain/mt/mt-search.cgi?blog_id=1&amp;tag=MovableType%20AND%20Customize&amp;limit=20&amp;IncludeBlogs=1

「 AND 」はいくらでも連結できます。検索文字列と「AND」の間の「%20」は、半角スペースをURLエンコードしたものです。

つまり、前回のタグ検索文字列と今回のタグ検索文字列を「 AND 」で連結するサブテンプレートを作れば、この絞り込み検索の仕組みが実現できる訳です。

2.カスタマイズ

このカスタマイズでは Split プラグインを事前にインストールしてください。

その後、2.1~2.3に該当するいずれかの設定を行なってください。該当しない場合は、それらしき部分に追加してください。

なお、デザインはすべて確認できておりませんので、不具合がありましたらご連絡ください。

2.1 4.2 以降の「既定のブログ」の場合

次のサブテンプレート(青色)を、テンプレートモジュールの「ブログ記事の概要」に追加してください。

<mt:If name="entry_archive">
    <mt:EntryIfTagged>
        <div class="entry-tags">
            <h4>タグ<span class="delimiter">:</span></h4>
            <ul>
                <li><mt:EntryTags glue='<span class="delimiter">,</span></li> <li>'><a href="javascript:void(0)" onclick="location.href='<$mt:TagSearchLink encode_js="1"$>';return false;" rel="tag"><$mt:TagName$></a></mt:EntryTags></li>
            </ul>
<mt:searchString setvar="tag_name" />
<mt:if name="tag_name" like=" AND ">
  <mt:getVar name="tag_name" split=" AND " setvar="tag_list">
<mt:else>
  <mt:setVarBlock name="tag_list[0]"><mt:getVar name="tag_name"></mt:setVarBlock>
</mt:if>
 
<mt:setVar name="tag_data" value="" />
<mt:entryTags>
  <mt:setVar name="tag_flag" value="0" />
  <mt:loop name="tag_list">
    <mt:if tag="TagName" eq="$__value__">
      <mt:setVar name="tag_flag" value="1" />
    </mt:if>
  </mt:loop>
  <mt:unless name="tag_flag">
    <mt:setVarBlock name="tag_data" append="1"><a href="<mt:searchScript />?blog_id=<mt:blogID />&amp;tag=<mt:searchString>%20AND%20<mt:tagName />&amp;limit=20&amp;IncludeBlogs=<mt:blogID />" rel="tag" title="<mt:searchString />と<mt:tagName />のタグ一覧へ"><mt:tagName /></a>,</mt:setVarBlock>
  </mt:unless>
</mt:entryTags>
 
<h4>絞り込みタグ<span class="delimiter">:</span></h4>
<ul>
  <li><mt:getVar name="tag_data" regex_replace="/(.*),$/","$1" /></li>
</ul>
        </div>
    </mt:EntryIfTagged>
</mt:If>

2.2 4.0 ~ 4.1 の場合

次のサブテンプレート(青色)を、テンプレートモジュールの「タグ」に追加してください。

<MTEntryIfTagged>
<div class="entry-tags">
    <h4 class="entry-tags-header">タグ<span class="delimiter">:</span></h4>
    <ul class="entry-tags-list">
        <li class="entry-tag"><MTEntryTags glue='<span class="delimiter">,</span></li> <li class="entry-tag">'><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTBlogID$>" rel="tag"><$MTTagName$></a></MTEntryTags></li>
    </ul>
<mt:searchString setvar="tag_name" />
<mt:if name="tag_name" like=" AND ">
  <mt:getVar name="tag_name" split=" AND " setvar="tag_list">
<mt:else>
  <mt:setVarBlock name="tag_list[0]"><mt:getVar name="tag_name"></mt:setVarBlock>
</mt:if>
 
<mt:setVar name="tag_data" value="" />
<mt:entryTags>
  <mt:setVar name="tag_flag" value="0" />
  <mt:loop name="tag_list">
    <mt:if tag="TagName" eq="$__value__">
      <mt:setVar name="tag_flag" value="1" />
    </mt:if>
  </mt:loop>
  <mt:unless name="tag_flag">
    <mt:setVarBlock name="tag_data" append="1"><a href="<mt:searchScript />?blog_id=<mt:blogID />&amp;tag=<mt:searchString>%20AND%20<mt:tagName />&amp;limit=20&amp;IncludeBlogs=<mt:blogID />" rel="tag" title="<mt:searchString />と<mt:tagName />のタグ一覧へ"><mt:tagName /></a>,</mt:setVarBlock>
  </mt:unless>
</mt:entryTags>
 
<h4 class="entry-tags-header">絞り込みタグ:<span class="delimiter">:</span></h4>
<ul class="entry-tags-list">
  <li class="entry-tag"><mt:getVar name="tag_data" regex_replace="/(.*),$/","$1" /></li>
</ul>
</div>
</MTEntryIfTagged>

2.3 小粋空間テンプレートの場合

次のサブテンプレート(青色)を、テンプレートモジュールの「タグ」に追加してください。

<mt:entryIfTagged>
<div class="entry-tags">
   <h3 class="entry-tags-header">タグ:</h3>
   <ul class="entry-tags-list">
   <mt:entryTags>
      <li class="entry-tag"><a href="<mt:tagSearchLink />&amp;IncludeBlogs=<mt:blogID />" rel="tag"><mt:tagName /></a></li>
   </mt:entryTags>
   </ul>
<mt:searchString setvar="tag_name" />
<mt:if name="tag_name" like=" AND ">
  <mt:getVar name="tag_name" split=" AND " setvar="tag_list">
<mt:else>
  <mt:setVarBlock name="tag_list[0]"><mt:getVar name="tag_name"></mt:setVarBlock>
</mt:if>
 
<mt:setVar name="tag_data" value="" />
<mt:entryTags>
  <mt:setVar name="tag_flag" value="0" />
  <mt:loop name="tag_list">
    <mt:if tag="TagName" eq="$__value__">
      <mt:setVar name="tag_flag" value="1" />
    </mt:if>
  </mt:loop>
  <mt:unless name="tag_flag">
    <mt:setVarBlock name="tag_data" append="1"><a href="<mt:searchScript />?blog_id=<mt:blogID />&amp;tag=<mt:searchString>%20AND%20<mt:tagName />&amp;limit=20&amp;IncludeBlogs=<mt:blogID />" rel="tag" title="<mt:searchString />と<mt:tagName />のタグ一覧へ"><mt:tagName /></a>,</mt:setVarBlock>
  </mt:unless>
</mt:entryTags>
 
<h3 class="entry-tags-header">絞り込みタグ:<span class="delimiter">:</span></h3>
<ul class="entry-tags-list">
  <li class="entry-tag"><mt:getVar name="tag_data" regex_replace="/(.*),$/","$1" /></li>
</ul>
</div>
</mt:entryIfTagged>

3.サブテンプレート解説

2項のサブテンプレートの機能は、検索結果に表示されているブログ記事のタグから、現在の検索結果ページの検索タグを除外して表示します。そして、CGI(mt-search.cgi)のURLに、今回までの検索タグを「tag=」のクエリーに与えます。

このサブテンプレートを、いくつかのブロックに分けて解説します。

3.1 検索タグを分割して配列変数に設定

<mt:searchString setvar="tag_name" />
<mt:if name="tag_name" like=" AND ">
  <mt:getVar name="tag_name" split=" AND " setvar="tag_list">
<mt:else>
  <mt:setVarBlock name="tag_list[0]"><mt:getVar name="tag_name"></mt:setVarBlock>
</mt:if>

最初の MTSearchString タグで、今回表示されているタグ検索結果を変数 tag_name に保存します。変数 tag_name に「 AND 」が含まれていたら、split モディファイアを利用して、配列変数tag_listに、これまでのすべての検索タグを保存します。「 AND 」が含まれていない場合は、後続の処理で MTLoop タグを利用できるように、配列変数 tag_list の先頭に入れなおします。

3.2 ブログ記事に含まれるタグ一覧から、配列変数に設定されたタグを除外

<mt:setVar name="tag_data" value="" />
<mt:entryTags>
  <mt:setVar name="tag_flag" value="0" />
  <mt:loop name="tag_list">
    <mt:if tag="TagName" eq="$__value__">
      <mt:setVar name="tag_flag" value="1" />
    </mt:if>
  </mt:loop>
  <mt:unless name="tag_flag">
 ...中略...
  </mt:unless>
</mt:entryTags>

変数 tag_data を初期化し、MTEntryTag タグで、タグ検索でヒットしたブログ記事に含まれる、タグの一覧を処理します。変数 tag_flag は、これまでに使われた検索タグを出力から除外するためのフラグです。

フラグを設定する処理は、MTLoop タグを使って配列変数 tag_list をサーチすることで実現しており、これまでに使われた検索タグをみつけたら、変数 flag に 1 を設定します。

変数 tag_flag に 1 が設定されたら、次の MTUnless タグブロック内は実行せず、まだ検索タグとして登場していないタグだけを MTUnless タグブロック内で出力します。

3.3 ブログ記事に含まれるタグ一覧を変数に設定

<mt:unless name="tag_flag">
  <mt:setVarBlock name="tag_data" append="1"><a href="<mt:searchScript />?blog_id=<mt:blogID />&amp;tag=<mt:searchString>%20AND%20<mt:tagName />&amp;limit=20&amp;IncludeBlogs=<mt:blogID />" rel="tag" title="<mt:searchString />と<mt:tagName />のタグ一覧へ"><mt:tagName /></a>,</mt:setVarBlock>
</mt:unless>

MTUnless タグ内部では、タグ検索用のリンクを出力します。href 属性の値に、前回までの検索タグを MTSearchString タグ、そして今回の検索タグを MTTagNameタグ で与え、その間を「%20AND%20」で区切ります。リンクは直接出力せず、MTSetVarBlock タグを使って、変数 tag_data に一旦保存します。理由はあとで説明します。

3.4 ブログ記事に含まれるタグ一覧を出力

絞り込みタグ:<mt:getVar name="tag_data" regex_replace="/(.*),$/","$1" />

すべての処理が終わったら、変数 tag_data を出力します。

出力するタグの区切り文字をカンマ「,」にしているのですが、一番最後の「,」を、MTUnless タグブロック内の処理で出力しない制御がかなり面倒(=出力するタグが繰り返しの最後であることを判定するのが面倒)だったので、出力結果を一旦変数に保持し、変数を出力するときに regex_replace モディファイアで最後の1文字、つまりカンマを除去しています。

今回のタグ検索で使ったタグは、次のタグ検索結果ページの MTSearchString タグで取得できるので、再帰的な検索が行なえます。

Comments [8] | Trackbacks [1]
2009年1月21日

タグ検索を絞り込む(その1)

January 21,2009 1:55 AM
Tag:[, , , ]
Permalink

タグ検索を絞り込む方法を紹介します。

1.「タグの絞込み」という考えについて

「タグ」という新しい分類方法が登場して以来、

  「タグによる検索を絞り込むことができれば、ものすごく便利では?」

という考えをずっと持っていました。

主旨は大体お分かりと思いますが、タグを絞り込む例を図に示します。ブログに、「tag-A」「tag-B」「tag-C」という3つのタグをつけたエントリーが複数あると仮定します。

最初に「tag-A」というタグ名で検索すると、左上の円に属するエントリーが検索でヒットします。

tag-Aによる検索

「tag-A」をつけたエントリーの中には、「tag-B」がついているものもあります。両方のタグをつけたエントリーを検索できる方法があれば、下図のように検索範囲を絞り込むことができます。

tag-Aとtag-Bによる検索

同様に、「tag-A」「tag-B」をつけたエントリーの中に、「tag-C」をつけたものもあり、最終的に、3つのタグをつけたエントリーを検索できる方法があれば、さらに絞り込むことができます。

tag-Aとtag-Bとtag-Cによる検索

単に、「tag-A」「tag-B」「tag-C」という3つのタグを別々に検索を行なっても、3つの円が交わった部分を見つけるのは困難ですが、タグの絞込み検索を行なうことができれば、サイトを訪れたユーザーが目的のページに素早くアクセスできる可能性が高くなります。

もう少し具体例を挙げると、次のようなタグがついているエントリーがある、うちのようなサイトで、閲覧ユーザーが

  「Movable Type で、プラグインを使ったカスタマイズの記事を読みたい(緑色の部分)」

というケースの場合、大変有効である考えます。

タグ検索

2.実際のタグの絞込み検索

そういうわけで、当ブログでは、タグ検索の絞込みができるリンクを公開しています。エントリーのタグをクリックした次の検索結果のページに、絞込み候補のタグがあれば「Tagを絞り込む」という欄に表示します。

タグの絞り込み検索

試しに、エントリータイトルの右下にある任意のタグをクリックしてください。ここではリストをツリー表示するライブラリ「dTree」のタグをクリックしたと仮定します。

dTreeのタグをクリック

検索結果には「dTree」関連の記事が9件ヒットします。

dTreeタグが9件ヒット

この検索結果には、WordPress の記事と Movalbe TYpe の記事が混在しています。そこで、Movalbe TYpe の記事の「Tagを絞り込む」にある「Movable Type」をクリックします。

「Movable Type」でタグの絞り込み検索

検索結果に「「dTree AND MovableType」の検索結果」が表示され、絞り込み検索が行なわれたことが分かります。これで「dTree」かつ「Movable Type」の記事を4件に絞り込むことができました。

タグ検索

「エントリーに適切なタグをつけてください」というツッコミはなしで(笑)。

Movable Type 4 でのカスタマイズ方法については別途解説します。

Comments [2] | Trackbacks [0]
2008年12月19日

当ブログの検索フォームへの検索文字列設定方法について(その後)

December 19,2008 12:55 AM
Tag:[, , ]
Permalink

先日エントリーした「当ブログの検索フォームへの検索文字列設定方法について」で、「検索スパム」と騒いでしまいましたが、原因は検索エンジンの bot からのものでした。
ということで、誤解を招く表現であったことをお詫び致します(動作的にはスパムのようなものですが...)。

下記のトラックバックで勘違いであることが分かりました。ありがとうございました。

trial and error - Movable Type の "検索" ログ大量発生...

で、上記の記事に書かれている対処(robots.txt の設定)を行ったところ、正常な検索も含め、250件/日ほどにおさまってます。robots.txt の設定は次の通りです。

User-Agent: *
Disallow: /[ドキュメントルートからアプリケーションディレクトリまでのパス]/mt-search.cgi
Allow: /

robots.txt はドメインに対応するパス(ドキュメントルート)に配置してください。Disallow に設定する [ドキュメントルートからアプリケーションディレクトリまでのパス] は、当ブログの場合であれば、http://www.koikikukan.com/ に対応するパスなので、

Disallow: /cgi-bin/koikikukan/mt-search.cgi

としています。

同様の記事は他にも結構ありました。

robots.txt mt-search.cgi - Google 検索

そういう訳で、ブログ検索方法も元に戻しました。

Comments [0] | Trackbacks [0]
2008年12月 3日

Movable Type 検索の全角スペースを半角スペースと同じ振る舞いにする(MT4版)

December 3,2008 12:33 AM
Tag:[, , ]
Permalink

Movable Type の検索フォームで検索文字列を複数入力して、区切り文字に全角スペース(空白)を使用すると、全角スペースは検索文字として認識され、期待しない結果(おそらく検索結果として何もヒットしない)になってしまいます。
この全角スペースを半角スペースと同じ扱いにするためのカスタマイズを紹介します。

このカスタマイズは、Movable Type 3.x でエントリーした「Movable Type 検索の全角スペースを半角スペースと同じ振る舞いにする」を、Movable Type 4 用に調べなおしたものです。ただし、4.22 が最新版の記事のため、4.3 以降では適用されない可能性があります。

1.Search.pm の修正

Movable Type 4 では、~4.1x と 4.2x で修正方法が異なります。ご利用のバージョンを確認して1.1項または1.2項のいずれかを適用してください。

1.1 MT4.0x/MT4.1x の場合

まず、lib/MT/App/Search.pm に下記のパッチを適用してください。

--- lib/MT/App/Search.pm.bak    Tue Dec 02 23:56:46 2008
+++ lib/MT/App/Search.pm        Tue Dec 02 23:59:17 2008
@@ -149,6 +149,10 @@
         || ( $app->{searchparam}{Type} eq 'tag' ) ) {
         if ($q->param('search')) {
             $app->{search_string} = $q->param('search');
+            if (($app->{searchparam}{Type} eq 'straight')) {
+                my $delimiter = $app->translate("delimiter");
+                $app->{search_string} =~ s/$delimiter/ /g;
+            }
             $app->{search_string_decoded} = MT::I18N::decode(
                 $app->config->PublishCharset,
                 $app->{search_string}

パッチが分からない方は lib/MT/App/Search.pm を任意のエディタで開き、下記の青色の4行を追加してください。

...前略...
sub init_request{
    my $app = shift;
    $app->SUPER::init_request(@_);
...中略...
    ## Set search_string (for display only)
    if ( ( $app->{searchparam}{Type} eq 'straight' )
        || ( $app->{searchparam}{Type} eq 'tag' ) ) {
        if ($q->param('search')) {
            $app->{search_string} = $q->param('search');
            if (($app->{searchparam}{Type} eq 'straight')) {
                my $delimiter = $app->translate("delimiter");
                $app->{search_string} =~ s/$delimiter/ /g;
            }
            $app->{search_string_decoded} = MT::I18N::decode(
                $app->config->PublishCharset,
                $app->{search_string}
            );
        } else {
            $app->{search_string} = $app->{search_string_decoded} = q();
        }
    }
...後略...

1.2 MT4.2x の場合

まず、lib/MT/App/Search.pm に下記のパッチを適用してください。

--- lib/MT/App/Search.pm.bak    Tue Dec 02 23:51:51 2008
+++ lib/MT/App/Search.pm        Tue Dec 02 23:52:23 2008
@@ -347,6 +347,8 @@
     my $search_string = $q->param('searchTerms') || $q->param('search')
         or return $app->errtrans('No search term was specified.');
     $app->{search_string} = $search_string;
+    my $delimiter = $app->translate("delimiter");
+    $app->{search_string} =~ s/$delimiter/ /g;
     my $offset = $q->param('startIndex') || $q->param('offset') || 0;
     return $app->errtrans( 'Invalid value: [_1]', encode_html($offset) )
         if $offset && $offset !~ /^\d+$/;

パッチが分からない方は lib/MT/App/Search.pm を任意のエディタで開き、下記の青色の2行を追加してください。

...前略...
sub search_terms {
    my $app = shift;
    my $q   = $app->param;
 
    my $search_string = $q->param('searchTerms') || $q->param('search')
        or return $app->errtrans('No search term was specified.');
    $app->{search_string} = $search_string;
    my $delimiter = $app->translate("delimiter");
    $app->{search_string} =~ s/$delimiter/ /g;
    my $offset = $q->param('startIndex') || $q->param('offset') || 0;
...後略...

2.ja.pm の修正

lib/MT/L10N/ja.pm を任意のエディタで開き、下記の1行を追加してください。

'delimiter' => ' ',

追加する場所は、似たような記述の近辺であればどこでも構いませんが、とりあえず下から4行目にいれましょう。

...前略...
    'Invalid blog_id' => '不正なブログID',
    'Clone Blog' => 'ブログの複製',
    'delimiter' => ' ',
);
 
1;

お分かりの通り、検索フォームのクエリーから全角文字を半角文字に直しているだけです。もう少しエレガントな方法がありましたら情報お待ちしております。

2009.10.03
ファイルのパスが誤っていたので修正しました。

Comments [7] | Trackbacks [0]
2008年11月 4日

Movable Type 4.2 検索結果ページのカスタマイズ:ページナビゲーションをプルダウンメニューにする

Movable Type 4.2 の検索結果ページのカスタマイズで、5回目は「ページナビゲーションをプルダウンメニューにする」を紹介します。

その5:ページナビゲーションをプルダウンメニューにする

デフォルトテンプレートや配布テンプレートでは、ページナビゲーションがテキストで表示されます。

分割されたページが少ないと良いのですが、こんなに多くなると見栄えがよくありません。

分割ページが多い例

カスタマイズ後はページナビゲーションを次のようなプルダウンメニューにし、ナビゲーションのデザインをすっきりさせます。プルダウンメニューには表示中のページ番号を表示し、全体のページ数も表示します。

ページナビゲーションをプルダウンメニューにするには、次の変更を行ってください。修正内容はデフォルトテンプレート、配布テンプレート共通です。デフォルトテンプレートではナビゲーションのサブテンプレートが1行にまとめられているので、見やすいように適宜改行を入れています。

変更前:赤色を削除

<div class="content-nav">
  <mt:IfPreviousResults>
    <a href="<$mt:PreviousLink$>" rel="prev" onclick="return swapContent(-1);">&lt; 前</a>&nbsp;&nbsp;
  </mt:IfPreviousResults>
  <mt:PagerBlock>
    <mt:IfCurrentPage>
      <$mt:Var name="__value__"$>
    <mt:Else>
      <a href="<$mt:PagerLink$>"><$mt:Var name="__value__"$></a>
    </mt:IfCurrentPage>
    <mt:Unless name="__last__">&nbsp;</mt:Unless>
  </mt:PagerBlock>
  <mt:IfMoreResults>&nbsp;&nbsp;
    <a href="<$mt:NextLink$>" rel="next" onclick="return swapContent();">次 &gt;</a>
  </mt:IfMoreResults>
</div>

変更後:青色を追加

<script type="text/javascript">
//<![CDATA[
function selectUrl(sel){
    if(sel.options[sel.selectedIndex].value){
        location.href = sel.options[sel.selectedIndex].value;
    }
}
//]]>
</script>
<div class="content-nav">
  <mt:ifPreviousResults>
    <a href="<mt:previousLink />" rel="prev" onclick="return swapContent(-1);">&lt; 前</a>&nbsp;&nbsp;
  </mt:ifPreviousResults>
<form action="javascript:void()" style="display:inline">
<select name="select" onChange="selectUrl(this.form.select)">
<mt:pagerBlock>
  <mt:ifCurrentPage>
    <option value="<mt:pagerLink>" selected="selected"><mt:getVar name="__value__" /></option>
  <mt:else>
    <option value="<mt:pagerLink>"><mt:getVar name="__value__" /></option>
  </mt:ifCurrentPage>
<mt:unless name="__last__">&nbsp;</mt:unless>
</mt:pagerBlock>
</select> 
</form>/<mt:totalPages />ページ
  <mt:ifMoreResults>&nbsp;&nbsp;
    <a href="<mt:nextLink />" rel="next" onclick="return swapContent();">次 &gt;</a>
  </mt:ifMoreResults>
</div>

関連記事

Comments [0] | Trackbacks [0]
2008年10月27日

Movable Type 4.2 検索結果ページのカスタマイズ:ナビゲーションを検索結果の上下に表示する

Movable Type 4.2 の検索結果ページのカスタマイズで、4回目は「ナビゲーションを検索結果の上下に表示する」を紹介します。

その4:ナビゲーションを検索結果の上下に表示する

デフォルトテンプレートでは、ナビゲーションがページの下にしか表示されません。

カスタマイズ後はこのようにページ上部に表示します。ナビゲーションを上部に表示しておけば、ページ送りをスクロールせずに行えるようになります。

上部に表示するには、既存と同じナビゲーションのサブテンプレートを追加します。

デフォルトテンプレートの場合

<h1 id="page-title" class="search-results-header">
  <mt:IfStraightSearch>
   「<$mt:SearchString$>」と一致するもの
  </mt:IfStraightSearch>
  <mt:IfTagSearch>
    タグ「<$mt:SearchString$>」が付けられているもの
  </mt:IfTagSearch>
</h1>
<div class="content-nav">
    <mt:IfPreviousResults><a href="<$mt:PreviousLink$>" rel="prev" onclick="return swapContent(-1);">&lt; 前</a>&nbsp;&nbsp;</mt:IfPreviousResults><mt:PagerBlock><mt:IfCurrentPage><$mt:Var name="__value__"$><mt:Else><a href="<$mt:PagerLink$>"><$mt:Var name="__value__"$></a></mt:IfCurrentPage><mt:Unless name="__last__">&nbsp;</mt:Unless></mt:PagerBlock><mt:IfMoreResults>&nbsp;&nbsp;<a href="<$mt:NextLink$>" rel="next" onclick="return swapContent();">次 &gt;</a></mt:IfMoreResults>
</div>
<div class="search-results-container autopagerize_page_element">

配布テンプレートの場合(設定済み)

<div id="search-results">
    <span id="current-page" style="display:none"><mt:currentPage /></span>
        <h2 class="search-results-header">
        <mt:ifStraightSearch>
          「<mt:searchString />」
        </mt:ifStraightSearch>
        <mt:ifTagSearch>
          タグ「<mt:searchString />」
        </mt:ifTagSearch>
の検索結果(<mt:currentPage>/<mt:totalPages />)
        </h2>
 
<mt:pagerBlock>
  <mt:getVar name="__value__" setvar="result_number" />
</mt:pagerBlock>
 
<mt:unless name="result_number" eq="1">
    <div class="content-nav">
<mt:ifPreviousResults>
  <a href="<mt:previousLink />" rel="prev" onclick="return swapContent(-1);">&lt; 前</a>&nbsp;&nbsp;
</mt:ifPreviousResults>
<mt:pagerBlock>
  <mt:ifCurrentPage>
    <mt:getVar name="__value__" />
  <mt:else>
    <a href="<mt:pagerLink />"><mt:getVar name="__value__" /></a>
  </mt:ifCurrentPage>
  <mt:unless name="__last__">&nbsp;</mt:Unless>
</mt:pagerBlock>
<mt:ifMoreResults>
  &nbsp;&nbsp;<a href="<mt:nextLink />" rel="next" onclick="return swapContent();">次 &gt;</a>
</mt:ifMoreResults>
    </div>
</mt:unless>
 
    </mt:searchResultsHeader>

関連記事

Comments [0] | Trackbacks [0]
2008年10月22日

Movable Type 4.2 検索結果ページのカスタマイズ:検索結果が1ページだけのときに「1」という表示をなくす

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

Movable Type 4.2 の検索結果ページのカスタマイズで、3回目は「検索結果が1ページだけのときに「1」という表示をなくす」を紹介します。

その3:検索結果が1ページだけのときに「1」という表示をなくす

デフォルトテンプレートでは、ページ分割を行わない場合、ページ下のナビゲーション部分に「1」という数字が表示されます。

カスタマイズ後はこのように非表示にすることができます。

非表示にするには、次のようなサブテンプレートを MTSearchResults タグブロック内に追加します。

デフォルトテンプレートの場合

<mt:pagerBlock>
  <mt:getVar name="__value__" setvar="result_number" />
</mt:pagerBlock>
 
<mt:unless name="result_number" eq="1">
  <div class="content-nav">
    <mt:IfPreviousResults><a href="<$mt:PreviousLink$>" rel="prev" onclick="return swapContent(-1);">&lt; 前</a>&nbsp;&nbsp;</mt:IfPreviousResults><mt:PagerBlock><mt:IfCurrentPage><$mt:Var name="__value__"$><mt:Else><a href="<$mt:PagerLink$>"><$mt:Var name="__value__"$></a></mt:IfCurrentPage><mt:Unless name="__last__">&nbsp;</mt:Unless></mt:PagerBlock><mt:IfMoreResults>&nbsp;&nbsp;<a href="<$mt:NextLink$>" rel="next" onclick="return swapContent();">次 &gt;</a></mt:IfMoreResults>
  </div>
</mt:unless>

配布テンプレートの場合(設定済み)

<mt:pagerBlock>
  <mt:getVar name="__value__" setvar="result_number" />
</mt:pagerBlock>
 
<mt:unless name="result_number" eq="1">
    <div class="content-nav">
<mt:ifPreviousResults>
  <a href="<mt:previousLink />" rel="prev" onclick="return swapContent(-1);">&lt; 前</a>&nbsp;&nbsp;
</mt:ifPreviousResults>
<mt:pagerBlock>
  <mt:ifCurrentPage>
    <mt:getVar name="__value__" />
  <mt:else>
    <a href="<mt:pagerLink />"><mt:getVar name="__value__" /></a>
  </mt:ifCurrentPage>
  <mt:unless name="__last__">&nbsp;</mt:Unless>
</mt:pagerBlock>
<mt:ifMoreResults>
  &nbsp;&nbsp;<a href="<mt:nextLink />" rel="next" onclick="return swapContent();">次 &gt;</a>
</mt:ifMoreResults>
    </div>
</mt:unless>

関連記事

Comments [2] | Trackbacks [0]
2008年10月14日

Movable Type 4.2 検索結果ページのカスタマイズ:検索結果の見出しに(現在のページ/総ページ数)を表示する

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

Movable Type 4.2 の検索結果ページのカスタマイズで、2回目は「検索結果の見出しに(現在のページ/総ページ数)を表示する」を紹介します。

その2:検索結果の見出しに「現在のページ/総ページ数」を表示する

デフォルトテンプレートでは検索結果がページ分割された場合、「現在のページ/全体のページ数」が表示されないので、現在表示しているページが何ページ目かがちょっと分かりにくいです。

現在表示しているページ(変更前)

カスタマイズ後はこのように「現在のページ/全体のページ数」を表示します。

現在表示しているページ(変更後)

表示するには、次のようなサブテンプレートを MTSearchResults タグブロック内の MTSearchResultsHeader タグにある見出し用要素に追加します。

デフォルトテンプレートの場合

<div id="search-results">
  <span id="current-page" class="hidden"><$mt:CurrentPage$></span>
  <h1 id="page-title" class="search-results-header">
  <mt:IfStraightSearch>
   「<$mt:SearchString$>」と一致するもの
  </mt:IfStraightSearch>
  <mt:IfTagSearch>
    タグ「<$mt:SearchString$>」が付けられているもの
  </mt:IfTagSearch>
(<mt:currentPage>/<mt:totalPages />)
  </h1>

配布テンプレートの場合(設定済み)

<h2 class="search-results-header">
    <mt:ifStraightSearch>
          「<mt:searchString />」
    </mt:ifStraightSearch>
    <mt:ifTagSearch>
          タグ「<mt:searchString />」
    </mt:ifTagSearch>
の検索結果(<mt:currentPage>/<mt:totalPages />)
</h2>

補足ですが、検索結果テンプレートは、ブログ検索・タグ検索で共通なので、見出し要素の内容は、ブログ検索・タグ検索のいずれかで出力内容を振り分けています。したがって、「現在のページ/総ページ数」を表示するタグは、ブログ検索・タグ検索の振り分けに依存しないよう、見出し要素の終了タグの直前に設定しています。

ページ分割しないときは表示しない

上記の設定では、検索結果でページ分割しないときも、次のように(1/1)という表示が出力されてしまいます。

検索結果でページ分割しないとき

ページ分割がないときに「現在のページ/全体のページ数」を表示したくない場合は、追加したタグを MTIf タグで括ると良いでしょう。

<h2 class="search-results-header">
    <mt:ifStraightSearch>
          「<mt:searchString />」
    </mt:ifStraightSearch>
    <mt:ifTagSearch>
          タグ「<mt:searchString />」
    </mt:ifTagSearch>
の検索結果<mt:if tag="totalPages" ne="1">(<mt:currentPage>/<mt:totalPages />)</mt:if>
</h2>

関連記事

Comments [0] | Trackbacks [1]
2008年10月10日

Movable Type 4.2 検索結果ページのカスタマイズ:1ページに表示する件数を変更する

Movable Type 4.2 では検索結果ページをページ分割する機能が追加されました。

ということで、Movable Type 4.2 の検索結果ページのカスタマイズについて何回かに分けて紹介したいと思います。

今のところ、以下のようなカスタマイズを予定しています。思いついたら随時追加します。

  • 1ページに表示数する件数を変更する
  • 検索結果の見出しに「現在のページ/総ページ数」という表示を設定する
  • 検索結果が1ページだけのときに「1」という表示をなくす
  • ナビゲーションを検索結果の上下に表示する
  • ページ遷移をプルダウンメニューにする
  • ナビゲーションで表示する前後ページを制限する

その1:1ページに表示数する件数を変更する

サンプルとして、test というキーワードで検索した結果、次の5件がヒットしたとします。

MaxResults変更前

これを、1ページに表示する件数を3件に変更して、4件目以降はページ分割するというカスタマイズが可能です。

MaxResults変更後

ちなみに、デフォルト状態では1ページに20件まで表示し、検索結果が20件を超えるとページ分割を行います。

1ページに表示数する件数を変更するには、mt-config.cgi に環境変数 SearchMaxResults を追加します。例えば、1ページに表示する件数を10件にする場合は次のように記述します。

SearchMaxResults 10

この追加を行った後、再構築を行うと、検索フォームにある次の MTSearchMaxResults タグに値が反映されます。

<input type="hidden" name="limit" value="<$mt:SearchMaxResults$>" />

言い換えると、環境変数の変更を行っただけでは検索フォームに設定が反映されないので注意が必要です。

類似した環境変数で MaxResults がありますが、これは 4.15 以前で使用する環境変数です(4.2 で設定しても SearchMaxResults と同じ動作にはなるようです)。

環境変数 SearchMaxResults は「Movable Type 4.2 パーフェクトガイド」の 347 ページに掲載しています。

Movable Type 4.2 パーフェクトガイドMovable Type 4.2 パーフェクトガイド
荒木 勇次郎

毎日コミュニケーションズ 2008-07-31
売り上げランキング : 2552

Amazonで詳しく見る
by G-Tools
Comments [2] | Trackbacks [0]
2008年9月24日

システムテンプレートとその他のテンプレートを振り分ける

September 24,2008 1:23 AM
Tag:[, , ]
Permalink

Movable Type 4.1 以降で、システムテンプレート(コメントプレビュー/コメント完了/検索結果)とその他のテンプレートで処理を振り分けるカスタマイズです。

「Google Adsense の広告を検索結果ページだけに表示しない方法」ということで、以前にご質問を頂いたものを情報展開しておきます。

なお、このカスタマイズは、システムテンプレートの「ダイナミックパブリッシングエラー」や「ポップアップ画面」を利用していないことを前提にしていますので予めご了承ください。

1.システムテンプレートとその他のテンプレートで処理を振り分ける

システムテンプレートでは、変数 system_template に 1 が設定されるので、これを利用してシステムテンプレートとその他のテンプレートを振り分けます。

<mt:unless name="system_template">
システムテンプレート以外で表示
<mt:else>
システムテンプレートで表示
</mt:unless>

2.システムテンプレートをさらに振り分ける

冒頭に記した、「Google Adsense の広告を検索結果ページだけに表示しない方法」です。

システムテンプレートのコメントプレビュー/コメント完了ページと検索結果を振り分ける場合は、次のように変数 body_class を利用します。コメント関連のシステムテンプレートは変数 body_class に mt-comment -xxxxx という値が設定されます。

<mt:unless name="system_template">
システムではないページで表示
<mt:elseIf name="body_class" like="mt-comment">
コメントプレビュー・コメント完了ページで表示
<mt:else>
検索結果で表示
</mt:unless>

Adsensen のコードを最後の MTElse タグブロックに含めなければ、検索結果ページだけ非表示になります。

上記以外にも色々な振り分け方法があると思いますので、試してみてください。
また検索結果テンプレートだけに何らかのユーザ変数を設定しておけば、「ダイナミックパブリッシングエラー」や「ポップアップ画面」を含め、検索結果テンプレートだけを振り分けることが可能です。検索結果テンプレートを判定するには、変数 search_results で判定できます。

Movable Type 4.2 パーフェクトガイド」をお持ちの方は、213ページ~214ページに関連する変数を掲載しています。

Movable Type 4.2 パーフェクトガイドMovable Type 4.2 パーフェクトガイド
荒木 勇次郎

毎日コミュニケーションズ 2008-07-31
売り上げランキング : 9985

Amazonで詳しく見る
by G-Tools

2008.10.10
検索結果テンプレートの判定に関する記述を変更しました。

Comments [0] | Trackbacks [0]
2008年6月20日

Movable Type 4.2 の Ajax 検索機能

June 20,2008 12:55 PM
Tag:[, , ]
Permalink

Movable Type 4.2 の検索機能ではページ分割が導入されました。

検索結果のページ分割

検索結果が複数のページに跨る場合(=ページ分割された場合)は、Google マップのスクロールのように、次の検索結果ページを Ajax で事前に取得します。
その結果、分割ページに移動するときは、ストレスのないページ送りができるようになっています。瞬時に前後ページに移動できるので、かなり快適です。
ただし、初回の検索は Ajax ではありません。

本エントリーでは、検索結果ページで使われている JavaScript をかなり簡単に紹介します。

1.getResults

MTIfMoreResultsタグで、検索結果がページ分割されている場合にこのコードがページに展開され、現在の検索結果の表示中にバックグラウンドで Ajax を起動し、次のページの検索結果を取得・保持します。

<MTIgnore>Below Javascript adds ajax search capability</MTIgnore>
<script type="text/javascript">
/* <![CDATA[ */
<MTIfMoreResults>
function getResults(page) {
    page = parseInt(page);
    if (timer) window.clearTimeout(timer);
    var xh = mtGetXmlHttp();
    if (!xh) return false;
    var res = results[page];
    if (!res) return;
    var url = res['next_url'];
    if (!url) return;
 
    xh.open('GET', url + '&format=js', true);
    xh.onreadystatechange = function() {
        if ( xh.readyState == 4 ) {
            if ( xh.status && ( xh.status != 200 ) ) {
                // error - ignore
            } else {
                try {
                    var page_results = eval("(" + xh.responseText + ")");
                    if ( page_results['error'] == null )
                        results[page + 1] = page_results['result'];
                } catch (e) {
                }
            }
        }
    };
    xh.send(null);
}
...中略...
</MTIfMoreResults>
/* ]]> */
</script>

この関数は、検索結果ページに埋め込まれた次のスクリプトで実行されます。

<MTIgnore><!-- Used with the ajax search capability of the new search class --></MTIgnore>
<MTIfMoreResults>
<script type="text/javascript">
<!--
var div = document.getElementById('search-results');
var results = {
    '<MTCurrentPage>': {
        'content': div.innerHTML,
        'next_url': '<MTNextLink>'
    }
};
var timer = window.setTimeout("getResults(" + <MTCurrentPage> + ")", 1*1000);
//-->
</script>
</MTIfMoreResults>

次のページのURLは、getResults の内部処理で JSON 型の変数 results の next_url にアクセスし、MTNextLinkタグで展開された URL を取得します。

getResults は、周期処理を行うための window.setTimeout で起動され、getResults の内部処理の window.clearTimeout で周期処理を停止します。つまり1回しか起動されません。また、1秒周期で実行するため、検索結果が表示されてからすぐにリンクをクリックすると、Ajax による次のページ取得が完了していない場合があります。

2.swapContent

検索結果本文を、保持している前後の検索結果と置き換えます。

<script type="text/javascript">
/* <![CDATA[ */
<MTIfMoreResults>
...中略...
function swapContent(direction) {
    if ( direction == undefined ) direction = 1;
    var page_span = document.getElementById('current-page');
    if (!page_span) return true;
    var next_page = direction + parseInt(page_span.innerHTML);
    var res = results[next_page];
    if (!res) return true;
    var content = res['content'];
    if (!content) return true;
    var div = document.getElementById('search-results');
    if (!div) return true;
    div.innerHTML = content;
    timer = window.setTimeout("getResults(" + next_page + ")", 1*1000);
    window.scroll(0, 0);
    return false;
}
<MTElse><MTIfPreviousResults>
function swapContent(direction) {
    return true;
}</MTIfPreviousResults>
</MTIfMoreResults>
/* ]]> */
</script>

この関数は、検索結果ページに埋め込まれたページ移動用のナビゲーションの「前」「次」のリンクから実行されます。

<MTIgnore><!-- Used with the ajax search capability of the new search class --></MTIgnore>
<div class="content-nav">
<MTIfPreviousResults>
  <a href="<MTPreviousLink>" rel="prev" onclick="return swapContent(-1);">&lt; 前</a>&nbsp;&nbsp;
</MTIfPreviousResults>
<MTPagerBlock>
  <MTIfCurrentPage>
    <MTVar name="__value__">
  <MTElse>
    <a href="<MTPagerLink>"><MTVar name="__value__"></a>
  </MTIfCurrentPage>
  <mt:unless name="__last__">&nbsp;</mt:unless>
</MTPagerBlock>
<MTIfMoreResults>&nbsp;&nbsp;<a href="<MTNextLink>" rel="next" onclick="return swapContent();">次 &gt;</a>
</MTIfMoreResults>

なお、Ajax によるページ移動は「前」「次」のリンクを使った場合のみ有効で、ページ番号のリンクをクリックしたときは通常のCGI起動になります。

3.注意事項

ページ分割時の Ajax を有効に活用するには、次の青色の1行が必要です。

...前略...
<MTSearchResults>
  <MTSearchResultsHeader>
    <div id="search-results">
      <span id="current-page" class="hidden"><MTCurrentPage></span>
      <h1 id="page-title" class="search-results-header">
...後略...

関数 swapContent の内部処理で、現在のページ番号をここから取得しています。

Comments [4] | Trackbacks [0]
2007年12月17日

テンプレートのタグを探す方法

December 17,2007 2:02 AM
Tag:[, , ]
Permalink

最近、「このタグ(例えば body 等)はどのテンプレートありますか?」という質問を時々頂きます。

Movable Type 4 になってから、テンプレートモジュールがデフォルトで利用されるようになったため、バージョン3の時のようにひとつのテンプレートでいわゆるウェブページ全体のマークアップを俯瞰できなくなってしまいました。

保守性は向上した反面、テンプレートの構造に慣れるのが大変かと思われますが、このエントリーでは(X)HTMLやテンプレートタグを探す便利な方法をお伝えします。

1.検索を利用する

あまり知られていないようですが、一番手っ取り早いのはこの方法です。

ブログ管理画面の一番下にある「検索」のリンクをクリック。

「検索」をクリック

検索文字列入力フィールド上にある「テンプレート」をクリック。

「テンプレート」をクリック

検索したいタグ名等(例では body 要素)を入力して「検索」をクリック。

検索文字列入力

これで該当するテンプレートが表示されます。
タグや class 属性等をどこに書いたのか調べる時に、テンプレート編集画面を開いて探し回る必要はありません。

検索結果

上記は body 要素の検索例ですが、単に「body」で検索すると、テンプレートタグの MTEntryBody や MTCommentBody 等が大量にヒットしてしまう(下)ので注意しましょう。

「body」で検索

また、検索フォーム下の「項目を指定する」をチェックすれば、検索範囲を、

  • 出力ファイル名
  • 本文
  • テンプレート名
  • リンクされたファイル名

から選択することができます。

2.TemplateHammer プラグインでひとつのテンプレートにまとめる

TemplateHammer プラグインを導入すれば、あるテンプレートに記述されている MTInclude 先のテンプレートモジュールの内容を、MTInclude 元に展開してくれます。

インストール方法は下記の記事を参考にしてください。

使用方法は、テンプレート一覧より展開したいテンプレートをチェックして、セレクトボックスの「Smash Template」を選択して「Go」をクリック。

下は「Smash Template」実行前の「メインページ」の冒頭部分です。

下は「Smash Template」を実行後の「メインページ」の冒頭部分です。<$MTInclude module="ヘッダー"$> の部分が展開されているのが分かります。

これでテンプレートモジュールによってバラバラになっているテンプレートをひとつのテンプレートで俯瞰することができます。ただし、MTInclude 先の内容は複数のテンプレートに読み込まれることを前提に振り分け処理が多く含まれているので、読みやすくなるかどうかは分かりません(テンプレートを渡り歩く手間はなくなります)。

Comments [0] | Trackbacks [0]
2007年7月10日

検索結果画面のカラムレイアウトを変更する

July 10,2007 1:45 AM
Tag:[, , ]
Permalink

当サイトの Movable Type 配布テンプレートで検索結果画面のカラムレイアウト変更方法についてご質問を頂きましたので紹介します。

サンプルとして、検索結果画面の2カラム固定レイアウト(右サイドバー)から3カラムレイアウトに変更します。

1.カラムレイアウト指定

検索結果画面にある body 要素の class 属性値(赤色部分)

<body class="<MTNoSearch>layout-one-column<MTElse>layout-two-column-right</MTElse></MTNoSearch>">

を下記のように変更します。

<body class="<MTNoSearch>layout-three-column<MTElse>layout-three-column</MTElse></MTNoSearch>">

上記はMTNoSearchタグとMTElseタグのいずれの場合も3カラムにしていますので、どのような検索結果でも3カラムで表示されます。

というか、振り分ける必要がなければ

<body class="layout-three-column">

でなんら問題はありません。

2.左サイドバー追加

下記に示す位置に左サイドバーを追加します。

  :
<div id="header">
<h1 id="blog-name"><a href="<$MTBlogURL$>" accesskey="1"><$MTBlogName encode_html="1"$></a></h1>
<MTIfNonEmpty tag="BlogDescription"><p class="blog-description"><$MTBlogDescription encode_html="1"$></p></MTIfNonEmpty>
</div>
 
[ここに左サイドバーの(X)HTMLを追加]
 
<div id="content">
<div class="blog">
  :

「追加」という部分には、左サイドバー自体(id 属性値が links-left-box の div要素と id 属性値が links-left の div要素または dl 要素)を設定してから、各種リストを追加してください。

3.右サイドバー変更

右サイドバーの内容を変更したい場合は、下記に示す部分を適宜修正してください。

  :
<!-- 右カラム開始 -->
<div id="links-right-box">
<div id="links-right">
 
[ここに右サイドバーの(X)HTMLを追加または修正]
 
</div><!-- links-right -->
</div><!-- /links-right-box -->
  :

4.検索関連タグについて

検索結果画面はかなりごちゃごちゃしていて分かりにくいので、指標となるタグを説明しておきます。

<MTSearchResults>~</MTSearchResults>
検索がヒットした場合にこのタグで括られた内容が実行される
<MTNoSearchResults>~</MTNoSearchResults>
検索がヒットしなかった場合にこのタグで括られた内容が実行される
<MTNoSearch>~</MTNoSearch>
検索文字列が入力されなかった場合にこのタグで括られた内容が実行される
<MTIfStraightSearch>~</MTIfStraightSearch>
サイト検索時にこのタグで括られた内容が実行される
<MTIfTagSearch>~</MTIfTagSearch>
タグ検索時にこのタグで括られた内容が実行される
<MTBlogResultHeader>~</MTBlogResultHeader>
検索結果画面のヘッダ
<MTBlogResultFooter>~</MTBlogResultFooter>
検索結果画面のフッタ
<MTIgnore>~</MTIgnore>
このタグで括られた内容は無視される
<MTSetVar>~</MTSetVar>
変数の設定
<MTSetVarBlock>~</MTSetVarBlock>
変数の設定
<MTGetVar>~</MTGetVar>
変数の取得

MTSetVar/MTSetVarBlock/MTGetVar については「Movable Type 4 のテンプレート構造」を参照ください。

検索結果画面のカスタマイズについては、下記の雑誌に寄稿したものもあります(宣伝)。

Web Designing (ウェブデザイニング) 2007年 05月号 [雑誌]Web Designing (ウェブデザイニング) 2007年 05月号 [雑誌]

毎日コミュニケーションズ 2007-04-18
売り上げランキング :

Amazonで詳しく見る
by G-Tools
Comments [0] | Trackbacks [1]
2007年5月31日

検索結果のページ分割(3.3x 版)

MTPaginate プラグインを利用することで、テキスト検索・タグ検索のページ分割が可能ですが、Movable Type 3.3x ではメインページや他のアーカイブと同じような設定では、例えばデフォルトテンプレートでは 2カラム表示が崩れるという問題が発覚しました。*1

ということで、3.3x 版の検索結果のページ分割方法について改めて説明致します。

なお、テンプレートの修正内容が複雑なため、今回は理由を説明しながらタグの設定を行っていきます。作業をスキップしたい方は1項、2項を実施した後、5項のタグをそのまま検索結果ページの該当部分と置き換えてください。

1.プラグインファイルのダウンロード

プラグイン配布サイト

MT ExtensionsMTPaginate

よりプラグインをダウンロードします(ページ上方にある「Download」をクリック)。

2.プラグインファイルのアップロード

ダウンロードしたファイルを解凍し、その中の MTPaginate ディレクトリを下記のディレクトリ構成になるように plugins ディレクトリに丸ごとアップロードします。

plugins/MTPaginate/lib/MTPaginate.pm
plugins/MTPaginate/MTPaginate.pl

3.ページ分割用タグを挿入

検索結果テンプレートを修正していきます。
最初に、ページ分割用のタグ

  • MTPaginate
  • MTPaginateContent
  • MTPaginateSectionBreak

と、ナビゲーション表示の

  • MTPaginateIfMultiplePages
  • MTPaginateIfPreviousPage_
  • MTPaginateNavigator
  • MTPaginateIfNextPage_

を追加します(青色部分)。挿入位置は他の既存タグを参考にしてください。基本的には

  • <MTSearchResults> の前
  • </MTSearchResults> の前後

の辺りです。

    :
<MTIgnore>
    ##########  検索結果表示
</MTIgnore>
 
<MTPaginate mode="cgi">
    <MTPaginateIfMultiplePages>
        <div class="paginate">
            <MTPaginateIfPreviousPage_>
                <a href="<$MTPaginatePreviousPageLink$>" title="previous page link">&#65308;</a>
            </MTPaginateIfPreviousPage_>
            <$MTPaginateNavigator format_all="All Pages" place_all="after"$>
            <MTPaginateIfNextPage_>
                <a href="<$MTPaginateNextPageLink$>" title="next page link">&#65310;</a>
            </MTPaginateIfNextPage_>
        </div>
    </MTPaginateIfMultiplePages>
    <MTPaginateContent max_sections="3">
 
        <MTSearchResults>
            <MTBlogResultHeader>
                <h3 class="search-results-header">
                <MTIfStraightSearch>
                    ブログ: <$MTBlogName$> での検索結果
                </MTIfStraightSearch>
                <MTIfTagSearch>
                    <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
                    </MTIfTagSearch>
                </h3>
                <div class="search-results-container">
            </MTBlogResultHeader>
        
                <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
                <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
                <MTIfTagSearch>
                    <div class="entry-tags">
                        <h4 class="entry-tags-header">タグ:</h4> 
                        <ul class="entry-tags-list">
                            <MTEntryTags>
                                <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                            </MTEntryTags>
                        </ul>
                    </div>
                </MTIfTagSearch>
        
                <p class="entry-footer">
                    <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
                </p>
        
            <MTBlogResultFooter>
                </div>
            </MTBlogResultFooter>
 
            <$MTPaginateSectionBreak$>
 
        </MTSearchResults>
 
    </MTPaginateContent>
</MTPaginate>
 
<MTIgnore>
  ##########  検索結果がないときのメッセージ
</MTIgnore>
    :

MTPaginateContentmax_sections 属性(赤色部分)の「3」が1ページの表示件数です。この部分はお好みの値に変更してください。

ナビゲーションを後方に表示したい場合は、<MTPaginateIfMultiplePages>~</MTPaginateIfMultiplePages></MTPaginate> の直前に追加してください。

4.検索結果ヘッダおよび検索結果フッタ用タグを削除

MTSearchResults の中に記述された検索結果ヘッダおよび検索結果フッタ用タグ

  • MTBlogResultHeader
  • MTBlogResultFooter

を削除します(赤色部分)。タグで括られた内容は後で利用しますので、メモ帳にでもペーストしておいてください。

    :
<MTIgnore>
    ##########  検索結果表示
</MTIgnore>
 
<MTPaginate mode="cgi">
    <MTPaginateIfMultiplePages>
        <div class="paginate">
            <MTPaginateIfPreviousPage_>
                <a href="<$MTPaginatePreviousPageLink$>" title="previous page link">&#65308;</a>
            </MTPaginateIfPreviousPage_>
            <$MTPaginateNavigator format_all="All Pages" place_all="after"$>
            <MTPaginateIfNextPage_>
                <a href="<$MTPaginateNextPageLink$>" title="next page link">&#65310;</a>
            </MTPaginateIfNextPage_>
        </div>
    </MTPaginateIfMultiplePages>
    <MTPaginateContent max_sections="3">
 
        <MTSearchResults>
            <MTBlogResultHeader>
                <h3 class="search-results-header">
                <MTIfStraightSearch>
                    ブログ: <$MTBlogName$> での検索結果
                </MTIfStraightSearch>
                <MTIfTagSearch>
                    <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
                    </MTIfTagSearch>
                </h3>
                <div class="search-results-container">
            </MTBlogResultHeader>
        
                <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
                <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
                <MTIfTagSearch>
                    <div class="entry-tags">
                        <h4 class="entry-tags-header">タグ:</h4> 
                        <ul class="entry-tags-list">
                            <MTEntryTags>
                                <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                            </MTEntryTags>
                        </ul>
                    </div>
                </MTIfTagSearch>
        
                <p class="entry-footer">
                    <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
                </p>
        
            <MTBlogResultFooter>
                </div>
            </MTBlogResultFooter>
 
            <$MTPaginateSectionBreak$>
 
        </MTSearchResults>
 
    </MTPaginateContent>
</MTPaginate>
 
<MTIgnore>
  ##########  検索結果がないときのメッセージ
</MTIgnore>
    :

この2つのタグは、検索結果全体の最初と最後に1度しか実行されません。ページ分割処理に含めると、1ページ目の最初と最後のページの最後にしか適用されないため、削除します。

5.検索結果ヘッダと検索結果フッタを移動

4項で削除した検索結果ヘッダと検索結果フッタの内容を MTPaginateContent の外側に設定します(青色部分)。注:</MTPaginateContent> の下にもあります。

    :
<MTIgnore>
    ##########  検索結果表示
</MTIgnore>
 
<MTPaginate mode="cgi">
    <MTPaginateIfMultiplePages>
        <div class="paginate">
            <MTPaginateIfPreviousPage_>
                <a href="<$MTPaginatePreviousPageLink$>" title="previous page link">&#65308;</a>
            </MTPaginateIfPreviousPage_>
            <$MTPaginateNavigator format_all="All Pages" place_all="after"$>
            <MTPaginateIfNextPage_>
                <a href="<$MTPaginateNextPageLink$>" title="next page link">&#65310;</a>
            </MTPaginateIfNextPage_>
        </div>
    </MTPaginateIfMultiplePages>
 
    <h3 class="search-results-header">
    <MTIfStraightSearch>
        ブログ: <$MTBlogName$> での検索結果
    </MTIfStraightSearch>
    <MTIfTagSearch>
        <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
        </MTIfTagSearch>
    </h3>
    <div class="search-results-container">
 
    <MTPaginateContent max_sections="3">
 
        <MTSearchResults>
        
                <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
                <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
                <MTIfTagSearch>
                    <div class="entry-tags">
                        <h4 class="entry-tags-header">タグ:</h4> 
                        <ul class="entry-tags-list">
                            <MTEntryTags>
                                <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                            </MTEntryTags>
                        </ul>
                    </div>
                </MTIfTagSearch>
        
                <p class="entry-footer">
                    <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
                </p>
        
            <$MTPaginateSectionBreak$>
 
        </MTSearchResults>
 
    </MTPaginateContent>
 
    </div>
 
</MTPaginate>
 
<MTIgnore>
  ##########  検索結果がないときのメッセージ
</MTIgnore>
    :

MTPaginateContent の外側に設定することで、検索結果ヘッダと検索結果フッタがページ分割に依存せず常に表示されるようになります。

6.検索結果ヘッダと検索結果フッタに MTSearchResults を適用

5項で設定した検索結果ヘッダと検索結果フッタを MTSearchResults で括ります。

    :
<MTIgnore>
    ##########  検索結果表示
</MTIgnore>
 
<MTPaginate mode="cgi">
    <MTPaginateIfMultiplePages>
        <div class="paginate">
            <MTPaginateIfPreviousPage_>
                <a href="<$MTPaginatePreviousPageLink$>" title="previous page link">&#65308;</a>
            </MTPaginateIfPreviousPage_>
            <$MTPaginateNavigator format_all="All Pages" place_all="after"$>
            <MTPaginateIfNextPage_>
                <a href="<$MTPaginateNextPageLink$>" title="next page link">&#65310;</a>
            </MTPaginateIfNextPage_>
        </div>
    </MTPaginateIfMultiplePages>
 
    <MTSearchResults>
        <h3 class="search-results-header">
        <MTIfStraightSearch>
            ブログ: <$MTBlogName$> での検索結果
        </MTIfStraightSearch>
        <MTIfTagSearch>
            <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
            </MTIfTagSearch>
        </h3>
        <div class="search-results-container">
    </MTSearchResults>
 
    <MTPaginateContent max_sections="3">
 
        <MTSearchResults>
        
                <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
                <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
                <MTIfTagSearch>
                    <div class="entry-tags">
                        <h4 class="entry-tags-header">タグ:</h4> 
                        <ul class="entry-tags-list">
                            <MTEntryTags>
                                <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                            </MTEntryTags>
                        </ul>
                    </div>
                </MTIfTagSearch>
        
                <p class="entry-footer">
                    <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
                </p>
        
            <$MTPaginateSectionBreak$>
 
        </MTSearchResults>
 
    </MTPaginateContent>
 
    <MTSearchResults>
        </div>
    </MTSearchResults>
 
</MTPaginate>
 
<MTIgnore>
  ##########  検索結果がないときのメッセージ
</MTIgnore>
    :

MTSearchResults で括らないと、検索文字列がヒットしなかった場合や、検索文字列が設定されていない場合にも検索結果ヘッダと検索結果フッタが表示されてしまうためです。

7.検索結果ヘッダと検索結果フッタに Counter プラグインを適用

6項で設定した検索結果ヘッダと検索結果フッタを、さらに Counter プラグインのタグを追加します(青色部分)。

    :
<MTIgnore>
    ##########  検索結果表示
</MTIgnore>
 
<MTPaginate mode="cgi">
    <MTPaginateIfMultiplePages>
        <div class="paginate">
            <MTPaginateIfPreviousPage_>
                <a href="<$MTPaginatePreviousPageLink$>" title="previous page link">&#65308;</a>
            </MTPaginateIfPreviousPage_>
            <$MTPaginateNavigator format_all="All Pages" place_all="after"$>
            <MTPaginateIfNextPage_>
                <a href="<$MTPaginateNextPageLink$>" title="next page link">&#65310;</a>
            </MTPaginateIfNextPage_>
        </div>
    </MTPaginateIfMultiplePages>
 
    <MTCounter>
    <MTSearchResults>
        <$MTCounterPlus$>
        <MTCounterIfEqual value="1">
            <h3 class="search-results-header">
            <MTIfStraightSearch>
                ブログ: <$MTBlogName$> での検索結果
            </MTIfStraightSearch>
            <MTIfTagSearch>
                <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
                </MTIfTagSearch>
            </h3>
            <div class="search-results-container">
        </MTCounterIfEqual>
    </MTSearchResults>
    </MTCounter>
 
    <MTPaginateContent max_sections="3">
 
        <MTSearchResults>
        
                <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
                <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
                <MTIfTagSearch>
                    <div class="entry-tags">
                        <h4 class="entry-tags-header">タグ:</h4> 
                        <ul class="entry-tags-list">
                            <MTEntryTags>
                                <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                            </MTEntryTags>
                        </ul>
                    </div>
                </MTIfTagSearch>
        
                <p class="entry-footer">
                    <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
                </p>
        
            <$MTPaginateSectionBreak$>
 
        </MTSearchResults>
 
    </MTPaginateContent>
 
    <MTCounter>
    <MTSearchResults>
        <$MTCounterPlus$>
        <MTCounterIfEqual value="1">
            </div>
        </MTCounterIfEqual>
    </MTSearchResults>
    </MTCounter>
 
</MTPaginate>
 
<MTIgnore>
  ##########  検索結果がないときのメッセージ
</MTIgnore>
    :

MTSearchResults はループ処理用のタグで、上記までの設定ではヒットした回数分タグの内容が繰り返して表示されるためです。

Counter プラグインについては「Counter プラグイン」を参照してインストールまで行ってください。
カウンタ系のプラグインは他にも出回ってますので、そちらを利用しても構いません。

これでページ分割の設定は完了です。

8.その他

  • ナビゲーションを後方に設定した場合は下マージンが若干少ないので適宜追加してください。
  • 検索で「現在検索中です。検索が終わるまでお待ちください。」というメッセージが表示されて困る方は「Movable Type の検索でエラーになる問題について」を参照願います。

*1:以前の検索結果ページは 1カラムであったため、たまたま正常に動作しているようにみえていただけかもしれません。

Comments [0] | Trackbacks [1]
2007年5月27日

検索結果画面のページ分割が正常に動作しない不具合を解消する

Movable Type では MTPaginate を利用して、各アーカイブをページ分割することが可能ですが、MTPaginate は検索結果画面のページ分割も可能です。

ですが、デフォルトテンプレートの検索結果画面にある検索フォームから検索を実行した場合、その後のページ分割機能が有効にならない、というご質問を頂きました。ご本人は既にお分かりのようでしたが、折角なので情報展開しておきます。

1.問題

下記のような検索結果画面の状態から、ページ送りのリンク(赤枠部分)をクリックすると、

下のように、検索文字列が何も設定されていない状態で検索した結果画面になります。

2.対処方法

検索結果テンプレートの form の method 属性、

<form method="post" action="<$MTCGIPath$><$MTSearchScript$>" id="search-form">

<form method="get" action="<$MTCGIPath$><$MTSearchScript$>" id="search-form">

に変更するだけです。これで正常にページ送りができるようになります。

なおメインページの検索フォームは get になっていますので、修正の必要はありません。

3.原因

フォームの method 属性が get の場合は、フォームデータを URL の後ろにクエリー(URLエンコードしたデータ)として送信します。つまり post になっていたため、ページ送り時に検索文字列やブログID等、必要な情報が全て欠落していた、というのがこの問題の原因です。

GET と POST については下記のページが参考になるでしょう。

4.その他

ということで、GET メソッドを用いれば問題は解消しますが、フォームデータを URL として表示させたくない場合は post にしてください(ページ分割が機能しないとう制約が残りますが)。

また、Movable Type の検索はどちらの method 属性も対応しているということが分かりました。

Comments [0] | Trackbacks [0]
2007年4月 9日

Fast Search でカテゴリーの絞込み検索をする

April 9,2007 12:55 AM
Tag:[, , , ]
Permalink

Fast Search でカテゴリーの絞込み検索先週紹介した「Movable Type で高速検索を実現する Fast Search プラグイン」ではオプションとしてカテゴリーの絞込み検索を行うことができます。

このエントリーでは Fast Search の検索フォームにカテゴリー選択のプルダウンメニューを追加する方法をご紹介します。

プラグイン配布元ではカテゴリーで絞込みを行う場合は、検索フォームに、

<input type="hidden" name="category" value="5" />

というような input 属性を追加する説明がありますが、カテゴリー ID はプルダウンメニューから設定できるようにします。

1.デフォルトテンプレートの場合

リストの青色部分が Fast Search の検索フォームに追加した箇所です。

<div class="module-search module">
   <h2 class="module-header">検索</h2>
   <div class="module-content">
      <form method="get" action="<$MTBlogURL$><$MTFastSearchScript>">
         <input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
         <label for="search" accesskey="4">ブログを検索: </label><br />
         <input id="query" name="query" size="20" />
         <select name="category">
            <option value="0">全カテゴリーを検索</option>
            <MTCategories>
            <option value="<$MTCategoryID$>"><MTParentCategories glue=" &gt; "><$MTCategoryLabel$></MTParentCategories></option>
            </MTCategories>
         </select>
         <input type="submit" value="検索" />
      </form>
   </div>
</div>

2.公開テンプレートの場合

<div class="side">
<form method="get" action="<$MTBlogURL$><$MTFastSearchScript>">
<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
<label for="search" accesskey="4">ブログを検索: </label><br />
<input id="query" tabindex="5"  accesskey="t" name="query" size="20" value="" /><br />
<select name="category">
<option value="0">全カテゴリーを検索</option>
<MTCategories>
<option value="<$MTCategoryID$>"><MTParentCategories glue=" &gt; "><$MTCategoryLabel$></MTParentCategories></option>
</MTCategories>
</select>
<input type="submit" tabindex="6" accesskey="s" value="Search" />
</form>
</div>

3.注意事項

サンプルで追加したプルダウンメニューは、サブカテゴリーの左側に、">" をセパレータとして親カテゴリーを表示していますが、現実的にはカテゴリー名全体が横に長くなる場合が少なくないと思われます。横に長くなり過ぎると、プルダウンメニューがサイドメニューからはみ出す可能性があります。

カテゴリー名がはみ出さないようにするには、サブカテゴリーのみ表示するように、

<option value="<$MTCategoryID$>"><MTParentCategories glue=" &gt; "><$MTCategoryLabel$></MTParentCategories></option>

の部分を

<option value="<$MTCategoryID$>"><$MTCategoryLabel$></option>

に変更してください。

Comments [0] | Trackbacks [0]
2007年4月 6日

Movable Type で高速検索を実現する Fast Search プラグイン

ダイナミック・パブリッシングを利用して Movable Type の高速検索を実現する Fast Search プラグインを紹介します。

このプラグインは、3.2x および 3.3x の検索結果テンプレートで利用している MT タグを php で利用可能にしたもので、テキスト検索、3.3x ではタグ検索も可能になっています。実験した感想としては検索レスポンスが数倍向上します。
なおプラグイン適用条件として、下記を満たしている必要があります。

  • Movable Type 3.2 or 3.3
  • MySQL 4.0.1 以上

1.プラグインのダウンロード

下記のサイトにある「Dowmload Now」のリンクをクリックして、プラグインをダウンロード。非商用サイトは無償で寄付を受け付けています。商用サイトは $97.00 です。

MT-HACKSFast Search - PHP Fulltext Search Plugin

2.プラグインのアップロード

まず解凍した時のディレクトリ構造は下の通りです。

/FastSearch
  /php
    /plugins
      block.MTBlogResultFooter.php
            :
      modifier.google_highlight.php
  /plugins
    /FastSearch
      /tmpl
        fast_search.tmpl
        widget_fast_search.tmpl
      FastSearch.pl
    /PluginNetwork
      PluginNetwork.pl

これを次の通りにアップロードします。

  • FastSearch/php/plugins 配下のファイルをインストールディレクトリの mt-dir/php/plugins に全てアップロード
  • FastSearch/plugins をインストールディレクトリの mt-dir/plugins にフォルダごと全てアップロード。mt/plugins の下に FastSearch および PluginNetwork ディレクトリが配置されるようにしてください。

3.アップグレード

プラグインをアップロード後、管理ページにログインするとアップグレード画面が表示されます。

FastSearch 設定画面

驚かずに粛々と作業を進めてください。

FastSearch 設定画面

アップグレード完了後、管理ページに再度ログインします。

4.ダイナミックパブリッシングの設定

Fast Search プラグインを利用にするために、ダイナミックパブリッシングの設定を行います。ダイナミックパブリッシングをご利用でない(各ページをスタティックに出力している場合)、メインページや他のアーカイブページをダイナミックパブリッシングに変更する必要はありません。

ブログ別管理画面の[設定] - [公開]を選択し、「再構築オプション」を「テンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択します」を選択します。これで「変更を保存」をクリックします。
この時、メインページのあるディレクトリにダイナミックパブリッシングを有効にするための .htaccess および templates_c ディレクトリが自動生成されます。

5.Fast Search 設定1(初期設定)

ブログ別管理画面の[設定] - [プラグイン]を選択し、一覧に表示されている「Fast Search」の右側にある「設定を表示」をクリックします。これで設定画面(下)が開きます。

FastSearch 設定画面

まず「Enable Fast Search」をチェックしてプラグインを有効にしてください。

Enable Fast Search

「Search Results Per Page」および「Enable Logging」の設定もこの時に同時に設定することができます。
設定後、「変更を保存」をクリックします。

6.Fast Search 設定2(検索結果表示用テンプレート生成)

再度、 プラグイン一覧に表示されている「Fast Search」の右側にある「設定を表示」をクリックします。そして「Click here to install the default Fast Search Template.」のリンクをクリックしてください。

Click here to install the default Fast Search Template.

これで Fast Search 検索結果表示用の特殊なインデックステンプレートが生成され、その画面に遷移します(すでに保存されているので「保存」をクリックする必要はありません)。

Fast Search 検索結果表示用インデックステンプレート

また前段の作業でダイナミックパブリッシングの設定をしているので、再構築オプション自動的に「このテンプレートをダイナミック・ページにする」にチェックがつきます。もし後からダイナミックパブリッシングの設定を行なった場合は、このテンプレートに対しダイナミックパブリッシングで動作する設定(=チェックボックスのチェック)を行なってください。

これがプラグインで用意されている検索結果画面テンプレートですが、3.3x の検索結果画面デフォルトテンプレート、あるいは当サイトで配布している検索結果画面テンプレートに丸ごと入れ替えても正常に動作します。

7.Fast Search 設定3(検索フォーム)

Fast Search 用のフォームは、既存の

<form method="post" action="<$MTCGIPath$><$MTSearchScript$>"

<form method="post" action="<$MTBlogURL><$MTFastSearchScript>"

に変更すればOKです。

またはプラグインから Widget を生成することもできます。その場合は先のプラグイン設定画面にある、「Click here to install the Fast Search Widget.」のリンクをクリックします。これでテンプレートモジュールとしての検索フォーム「Widget: Fast Search」が生成されます。

Widget

このテンプレートモジュールを Widget ではなく、MTInclude タグで引き込むこともできます。その場合は検索フォームを表示させたいテンプレートのサイドバー部分に下記の1行を追加します。

<$MTInclude module="Widget: Fast Search"$>

8.Fast Search 設定4(FastSearch Method)

プラグインの設定画面で、もうひとつ「FastSearch Method」というプルダウンメニューの選択による設定項目があり、それぞれ下記のような意味があります。

  • FullText:MySQLに標準搭載されている全文検索インデックス
  • Non-FullText:上記以外
  • Fallback:FullText を試行し、NGであれば Non-FullText で実行

FastSearch Method

FullText が一番良さそうなのですが、環境によってはエラーが発生します(実験サイトで試したところ、正常に動作する時とそうでない時がありました)。

FullText エラー

調べてみたところ、FullText での日本語の全文検索については制約があるようです(詳細は9項の関連記事参照)。また Fallback では FullText を試みますが、失敗した場合は FullText のエラーが画面に表示されてしまうので、FullText を選択してエラーが解消しない場合は Non-FullText を選択するのが無難でしょう(FullText の適切な設定方法があればご教示ください)。

これで Fast Search の検索フォームより検索を実行し、検索結果が正常に表示されれば完了です。

9.ダイナミック・パブリッシングのチューニング

これで検索処理は高速になりますが、Movable Type デフォルトの検索機能の「連続実行抑止時間」の設定はありません。その結果サーバへの負荷拡大が予想されます。モジュール版PHPであればまだ良いのですがCGI版PHPの場合はプログラム実行とみなされます(参考:PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例)。

したがって、「Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その2:設定方法)」の3項で解説しているように、ページレベルのキャッシングや条件付きGETの設定し、サーバの負荷を少しでも軽減することをお勧めします。
なおタグ検索は有効と思われますが、テキスト検索では検索文字列が不定なため、どれほどの効果があるかは分かりません。

10.関連記事

Comments [4] | Trackbacks [0]
2007年3月22日

Movable Type 検索の全角スペースを半角スペースと同じ振る舞いにする

March 22,2007 1:13 AM
Tag:[, , ]
Permalink

Movable Type の検索フォームで検索文字列を複数入力して、区切り文字に全角スペース(空白)を使用すると、全角スペースは検索文字として認識され、期待しない結果(おそらく検索結果として何もヒットしない)になってしまいます。
この全角スペースを半角スペースと同じ扱いにするためのカスタマイズを紹介します。

1.IME で全角入力中に半角スペースを入力する

本題からそれますが、Windows の MS-IME で全角文字入力中に半角スペースを挿入したい場合は、「Shift キー + Space キー」で半角スペースを入力することができます。また、IME のプロパティを下記のように変更することで、全角文字入力中に常に半角スペースを入力することができます。

IMEプロパティ画面

2.カスタマイズ

2.1 Search.pm の修正

まず、lib/MT/Search.pm に下記のパッチを適用してください。

--- lib/MT/Search.pm.bak        Mon Jan 15 15:46:31 2007
+++ lib/MT/Search.pm    Wed Mar 21 22:55:15 2007
@@ -116,6 +116,8 @@
     ## Set search_string (for display only)
     if ($app->{searchparam}{Type} eq 'straight') {
         $app->{search_string} = $q->param('search') || '';
+        my $delimiter = $app->translate("delimiter");
+        $app->{search_string} =~ s/$delimiter/ /g;
     } elsif ($app->{searchparam}{Type} eq 'tag') {
         $app->{search_string} = $q->param('search') || '';
     }

パッチが分からない方は MT/App/Search.pm を任意のエディタで開き、下記の青色の2行を追加してください。

    :
   (略)
    :
sub init_request{
    my $app = shift;
    $app->SUPER::init_request(@_);
 
    foreach (qw(searchparam templates search_string results
                user __have_throttle)) {
        delete $app->{$_} if exists $app->{$_}
    }
    :
   (略)
    :
    ## Set search_string (for display only)
    if ($app->{searchparam}{Type} eq 'straight') {
        $app->{search_string} = $q->param('search') || '';
        my $delimiter = $app->translate("delimiter");
        $app->{search_string} =~ s/$delimiter/ /g;
    } elsif ($app->{searchparam}{Type} eq 'tag') {
        $app->{search_string} = $q->param('search') || '';
    }
 
    ## Get login information if user is logged in (via cookie).
    ## If no login cookie, this fails silently, and that's fine.
    ($app->{user}) = $app->login;
}
    :
   (略)
    :

2.2 ja.pm の修正

次に、lib/MT/L10N/ja.pm を任意のエディタで開き、下記の1行を追加してください。

'delimiter' => ' ',

追加する場所は、似たような記述の近辺であればどこでも構いませんが、とりあえず下から3行目にいれましょう。

    :
   (略)
    :
    'scheduled' => '指定日',
    'No entries could be found.' => 'エントリーは見つかりません。',
    'delimiter' => ' ',
);
1;

お分かりの通り、検索フォームのクエリーから全角文字を半角文字に直しているだけです。もう少しエレガントな方法がありましたら情報お待ちしております。

Comments [2] | Trackbacks [0]
2006年12月26日

タグ検索でエントリーの画像を表示する

Movable Type のタグ検索機能で、エントリータイトル・概要の代わりに、エントリーに含まれる画像を検索結果画面に表示するカスタマイズです。

下のスクリーンショットは、デフォルトテンプレートで、"image" というタグを与えた3つのエントリーにそれぞれ異なる画像を表示させ、"image" タグで検索した検索結果画面のサンプルです。

タグ検索でエントリーの画像を表示する

デザインが大雑把で申し訳ありませんが、以前このカスタマイズについてのご質問を頂いていてからかなり時間が経ってしまいましたので、取り急ぎの公開です。

試してみたところ、Collect プラグインを利用すれば、タグ検索による画像表示が行えることが判明しました。

1.プラグインのダウンロード

下記のサイトにある「Download」のリンクをクリックして、Collect Plugin をダウンロード

staggernation.comCollect Plugin for Movable Type

解凍した中にある Collect.plplugins フォルダ直下にアップロード。

2.検索結果テンプレートの修正

ここでは、デフォルトテンプレートを例にして <MTSearchResults>~</MTSearchResults> の修正箇所を示します。

リスト1 のように、赤色を削除して青色を追加します。

リスト1 検索結果テンプレート修正箇所

<MTSearchResults>
    <MTBlogResultHeader>
        <h3 class="search-results-header">
        <MTIfStraightSearch>
            ブログ: <$MTBlogName$> での検索結果
        </MTIfStraightSearch>
        <MTIfTagSearch>
            <$MTBlogName$>でタグ <$MTSearchString$> が指定されているエントリー
        </MTIfTagSearch>
        </h3>
        <div class="search-results-container">
        <MTIfTagSearch>
<ul>
        </MTIfTagSearch>
    </MTBlogResultHeader>
 
    <MTIfStraightSearch>
        <h3><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h3>
        <p><$MTEntryExcerpt$> <$MTEntryEditLink$></p>
    </MTIfStraightSearch>
        <MTIfTagSearch>
            <div class="entry-tags">
                <h4 class="entry-tags-header">タグ:</h4> 
                <ul class="entry-tags-list">
                    <MTEntryTags>
                        <li class="entry-tag"><a href="<$MTTagSearchLink$>&amp;IncludeBlogs=<$MTSearchIncludeBlogs$>" rel="tag"><$MTTagName$></a></li>
                    </MTEntryTags>
                </ul>
            </div>
            <MTCollect tags="img">
                <MTCollectThis show="0">
                    <$MTEntryBody$>
                </MTCollectThis>
                <MTIfCollected tags="img">
                    <MTCollected tags="img" lastn="1">
<li style="display:inline"><a href="<$MTEntryPermalink$>"><img src="<$MTCollectedAttr attr="src"$>" /></a></li>
                    </MTCollected>
                </MTIfCollected>
            </MTCollect>
        </MTIfTagSearch>
 
        <MTIfStraightSearch>
        <p class="entry-footer">
            <span class="post-footers"><MTIfNonEmpty tag="EntryAuthorDisplayName">投稿者: <$MTEntryAuthorDisplayName$>  </MTIfNonEmpty>日時: <$MTEntryDate$></span>
        </p>
        </MTIfStraightSearch>
 
    <MTBlogResultFooter>
        <MTIfTagSearch>
</ul>
        </MTIfTagSearch>
        </div>
    </MTBlogResultFooter>
</MTSearchResults>

ここで行っている修正は主に下記の通りです。

  • タグ表示部分に Collect プラグインの MT タグを挿入
  • タグ検索は順序なしリスト(ul - li)で表示
  • タグ検索結果の ul 要素の開始タグは MTBlogResultHeader に、終了タグは MTBlogResultFooter に埋め込み(ここに埋め込まないと、検出されたエントリー数分表示されるため)
  • エントリータイトルおよび投稿者情報部分は通常検索時のみ表示されるよう、<MTIfStraightSearch>~<MTIfStraightSearch> で括る

修正方法は他にも色々ありますので、お試しになってください

3.エントリーに含まれる画像の表示数を変更する

エントリーに含まれる画像の件数を設定しているリスト2 の赤色部分を変更します。

リスト2 画像表示数変更方法

<MTCollected tags="img" lastn="1">

なお、エントリー表示数を制御することはできません(検索されたエントリー数分を全て表示)。

Comments [0] | Trackbacks [0]
2006年7月20日

Movable Type の検索でエラーになる問題について

July 20,2006 12:23 AM
Tag:[, ]
Permalink

Movable Type で検索を行っていると、下記のようなメッセージが表示されるケースがあります。

現在検索中です。検索が終わるまでお待ちください。

これは Movable Type の仕様で、連続した検索実行を抑止しているためです。3.31 の場合、デフォルトの抑止時間は20秒で設定されていますので、検索してから20秒以内に再検索を実行すると上記のメッセージに出会うことになります。3.2 では 60秒に設定されています。

とはいっても、Movable Type に精通されていない方は検索を何回も繰り返すでしょうし、このままではサイト運営者は「検索機能がおかしいですよ」というコメントを頂くことになりかねません。下記の変更を行い、サイトを訪問された方が戸惑わないようにすることを推奨します。

1.連続実行抑止時間を短縮する

1.1 Movable Type 3.3? の場合

mt-config.cgi に

ThrottleSeconds 10

という ThrottleSeconds を追加することで、連続実行抑止時間を変更でき、エラーメッセージが表示される確率を下げることができます。数字の単位は「秒」で、上記の例は10秒(=検索してから10秒以内に再検索されたらエラーにする)を設定しています。

ThrottleSeconds

Movable TypeはIPベースのコメント帯域制御の設定を使い、コメントを溢れさせる攻撃(1つのエントリーに多量のコメントを送り付けること)に対処しています。 ThrottleSecondsはサイトの閲覧者がコメントを投稿した後に、再投稿できない時間を秒数で指定します。 たとえば、アリスがある時刻にコメントを投稿したと仮定します。すると彼女は、その時刻からこの設定に指定されている秒数の間、同じIPアドレスから別のコメントを投稿することができなくなります。 あなたのブログに対しコメントを投稿する人が多くなければ、この設定を上げることができます。

ただしこの設定項目はコメントやトラックバックについても適用されますので、値を下げ過ぎると同一投稿者からのコメント重複投稿やスパム攻撃が増加する可能性があります。またサーバにも負荷がかかりますので注意しましょう。

1.2 Movable Type 3.2 の場合

3.31 では設定ファイルで値の変更が可能ですが、3.2 はプログラムを修正する必要があります。

lib/MT/App/Search.pm

をダウンロードし、下記のパッチをあてます。

--- lib/MT/App/Search.pm.bak    Thu Sep 22 13:00:26 2005
+++ lib/MT/App/Search.pm        Mon Jul 17 18:49:37 2006
@@ -36,7 +36,7 @@
         if ($DB) {
             my $ip = $app->remote_ip;
             if (my $time = $db{$ip}) {
-                if ($time > time - 60) {   ## Within the last minute.
+                if ($time > time - 10) {   ## Within the last minute.
                     return $app->error($app->translate(
                         "You are currently performing a search. Please wait until your search is completed."));
                 }

パッチが利用できない場合は下記の赤色部分 *1 を変更してください。

sub init {
    my $app = shift;
       :
      (略)
       :
    ## Check whether IP address has searched in the last
    ## minute which is still progressing. If so, block it.
    if (eval { require DB_File; 1 }) {
        my $file = File::Spec->catfile($cfg->TempDir, 'mt-throttle.db');
        my $DB = tie my %db, 'DB_File', $file;
        if ($DB) {
            my $ip = $app->remote_ip;
            if (my $time = $db{$ip}) {
                if ($time > time - 60) {   ## Within the last minute.
                    return $app->error($app->translate(
                        "You are currently performing a search. Please wait until your search is completed."));
                }
            }
       :
      (略)
       :

元の「60」は60秒のようです。これより少ない値に変更すればエラーに遭遇する確率が下がります。修正案は10秒にしていますが、必要に応じて値は適宜修正してください。
修正が終わったら元のディレクトリにアップロードしてください。

2.エラーメッセージを改善

冒頭のエラーメッセージを変更し、ユーザに対し再検索で待ち時間が必要であることを促します。
メッセージの修正方法は、Movable Type をインストールしたディレクトリから

lib/MT/L10N/ja.pm

をダウンロードし、任意のエディタで開いて下記の赤色部分を修正します。

       :
## lib/MT/App/Search.pm
'You are currently performing a search. Please wait until your search is completed.' => '現在検索中です。検索が終わるまでお待ちください。',
       :

例えば下記のように修正します。

'You are currently performing a search. Please wait until your search is completed.' => '再検索する時は×秒以上待ってから行ってください。',

修正したら元のディレクトリにアップロードして上書きしてください。1項の修正と併用しても良いでしょう。


*1:色覚障害等で色が識別できない場合は、サイト右上の「Styles」メニューにある Gray Scale をクリックしてください。IEではグレースケール表示され、青色部分が下線表示、赤色部分が二重下線で表示されます。Firefox/Opera ではカラー表示のままですが下線表示に切り替わります。なお設定の都合上、リンクとテキスト表示が判断できなくなりますので予めご容赦ください。

Comments [4] | Trackbacks [5]
2006年4月30日

検索結果画面の表示文字数を変更する

April 30,2006 1:06 AM
Tag:[, , ]
Permalink

Movable Type で検索結果画面でヒットしたエントリー本文の表示文字数(デフォルト40文字)を変更するカスタマイズです。

変更方法は簡単で、mt-config.cgi の ExcerptWords を有効にします。例えば40文字から20文字に変更する場合は、mt-config.cgi をダウンロードして任意のエディタで開き、

          :
# The number of words in the excerpt displayed when you use the
# <$MTEntryExcerpt$> tag inside of your search results. This setting is
# distinct from the "Number of words in excerpt" setting in your blog
# configuration, because this setting is just used for excerpts in your
# search results. The default is 40 words.
#
# ExcerptWords 100

の赤色部分を、青色のように変更します。

          :
# The number of words in the excerpt displayed when you use the
# <$MTEntryExcerpt$> tag inside of your search results. This setting is
# distinct from the "Number of words in excerpt" setting in your blog
# configuration, because this setting is just used for excerpts in your
# search results. The default is 40 words.
#
ExcerptWords 20

行頭の # と半角空白を削除して、数字を変更してください。数字は文字数を指しています。
変更後、mt-config.cgi を元のディレクトリにアップロードすれば完了です。

なお上記の変更は検索結果画面のみに有効です。管理画面の「設定」→「基本」の中に「概要に入れる文字数」がありますが、こちらとは無関係です。概要はトラックバックやRSSフィード等で使われていますが、これは官吏画面で設定した文字数が有効になります(と上の英文で書かれています)。

また、デフォルトの検索結果画面に挿入されている MTEntryExcerpt を MTEntryBody に変更すれば全文表示も可能です。

Comments [10] | Trackbacks [0]
2006年3月12日

検索結果画面の日本語を変更する

検索結果画面の日本語を変更するMovable Type の検索結果画面で表示される日本語を変更するカスタマイズです。
カスタマイズのひとつとして紹介するのは、検索結果画面が他のテンプレートのように直接テンプレートに日本語を記述することができないためです。

左のスクリーンショットは公開テンプレートを例に「サイトを検索:」という文字列を「検索文字列を入力してください:」に変更した完成例ですが、デフォルトテンプレートでも同様の変更が可能です。

1.概要

Movable Type 3.2 のデフォルトテンプレートや公開テンプレートの検索結果画面では日本語が表示されるようになておりますが、そのテンプレートである

search_templates/default.tmpl

には表示する日本語は含まれていません。またこのテンプレートに直接日本語を記述して検索を実行すると、「??????????」という文字しか表示されません。

検索結果画面で日本語を表示させるには MT_TRANS タグを使用します。まずこのタグを利用した日本語表示の仕組みを説明します。

2.日本語が表示される仕組み

例えば、デフォルトテンプレートで表示される検索結果画面の「サイトを検索:」という文字は default.tmpl にある青色部分の MT_TRANS タグが該当します。

      :
<form method="post" action="<$MTCGIPath$><$MTSearchScript$>">
 
<h3><MT_TRANS phrase="Search this site:"></h3>
      :

Movable Type のプログラムは、この MT_TRANS タグ

<MT_TRANS phrase="Search this site:">

に記述された phrase 属性の値 "Search this site:" と同じ文字列を、

lib/MT/L10N/ja.pm

から検索します。

このファイル ja.pm の中には、"Search this site:" にマッチする文字列(青色部分)が含まれた行

      :
'Search Results from' => '検索結果',
'Search this blog:' => 'ブログを検索: ',
'Search this site:' => 'サイトを検索: ',
'Search:' => '検索: ',
'Search: new comment search' => 'コメントの検索',
      :

がありますので、そこから右側に書かれた文字列「検索結果(赤色部分)」を取得して検索結果画面に表示します。

3.日本語を変更する

スクリーンショットのように「サイトを検索」という文字列を「検索文字列を入力してください」に変更したい場合、ja.pm にある下記の行

'Search this site:' => 'サイトを検索: ',

'Search this site:' => '検索文字列を入力してください: ',

にすればOKです。

4.日本語を新しく挿入する

この phrase 属性の値はご自身で新しく作ることができます。テンプレートに新しい日本語を挿入したい場合、表示させたい位置に、

<MT_TRANS phrase="hogehoge">

を記述します。そして日本語変換用ファイル ja.pm に

'hogehoge' => 'ほげほげ',

を追加します。

5.注意事項

ja.pm へ新しく行を追加場合、追加位置は概ねどこでも大丈夫ですが、下記に示す部分に挿入してください。

## The following is the translation table.
 
%Lexicon = (
    :
 (ここへ追加)
    :
);
 
1;

既存の行は先頭にTAB文字が含まれていますが、新しく追加する行にTAB文字を含めなくても正常に動作します。

また phrase 属性の値については他に同じ文字列か存在しないか検索して調べてから追加しましょう。同じ文字列が存在する場合は後に書かれたものが有効になります。

6.マッチする行が存在しない場合

phrase 属性の値に該当する行が ja.pm に存在しない場合、phrase 属性値がそのまま表示されます。最初の例であれば「Search this site:」が表示されます。したがって phrase 属性値についてはそれなりに意味のある言葉(英単語)を付与するようにしましょう。

Comments [3] | Trackbacks [1]
2005年11月 6日

検索オプションをつける

November 6,2005 11:51 PM
Tag:[, , ]
Permalink

検索ページにある「エントリー」「コメント」等のオプション指定方法についてご質問を頂きましたので、本エントリーでご紹介します。

この元ネタは Movable Type に付属している検索機能の、検索結果画面の設定

search_templates/default.tmpl

を利用しています。

まず「エントリー/コメント/両方」をオプション指定するには、検索フォームに下記のリストのように青色部分を追加します。

<form method="get" action="<$MTCGIPath$><$MTSearchScript$>">
<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
<p><input name="search" class="search" size="31" value="" /> <input class="searchButton" type="submit" value="Search" /></p>
<p><input type="radio" name="SearchElement" value="entries" checked="checked" />エントリー
<input type="radio" name="SearchElement" value="comments" />コメント
<input type="radio" name="SearchElement" value="both" />両方</p>
</form>

下記のように label 要素を付与すれば文字の部分をクリックしても選択状態になるので、ユーザビリティが向上します(推奨)。

<form method="get" action="<$MTCGIPath$><$MTSearchScript$>">
<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
<p><input name="search" class="search" size="31" value="" /> <input class="searchButton" type="submit" value="Search" /></p>
<p><input type="radio" id="entries" name="SearchElement" value="entries" checked="checked" /><label for="entries">エントリー</label>
<input type="radio" id="comments" name="SearchElement" value="comments" /><label for="comments">コメント</label>
<input type="radio" id="both" name="SearchElement" value="both" /><label for="both">両方</label></p>
</form>

サイドメニューの検索フォームに追加する場合は、幅を考慮して下記のようなプルダウンメニューにすると良いでしょう。とりあえず当サイトにもつけてみました(タグ・CSSは若干変更しています)。

<form method="get" action="<$MTCGIPath$><$MTSearchScript$>">
<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
<p><input name="search" class="search" size="31" value="" /> <input class="searchButton" type="submit" value="Search" /></p>
<p><select name="SearchElement">
<option value="entries" selected="selected">エントリー</option>
<option value="comments">コメント</option>
<option value="both">両方</option>
</select></p>
</form>

CSS は select に対して下記のように設定します。

select {
    font-size: 10px;
}

検索結果画面と同じように「大文字/小文字を区別」や「正規表現で検索」を設定する場合は、さらに下記のチェックボックスをフォーム内に追加します。

<input type="checkbox" name="CaseSearch" /> 大文字/小文字を区別 <input type="checkbox" name="RegexSearch" /> 正規表現で検索

以上です。
なお、本来の検索結果画面での日本語部分は

<MT_TRANS phrase='xxxxx'>

というフォーマットになっていますが、Movable Type のCGIスクリプトを通さないのであれば、上記サンプルリストのように日本語を直接記述しましょう。

Comments [14] | Trackbacks [3]
Now loading...
Introduction
List of "検索"
Recent Entries
Recent Comments
Recent Trackbacks
QRcode

現在停止中です
携帯電話からこのQRcodeを撮影することで携帯用URLを取得することができます

URI for cellular phones
ギターに入った猫
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site
loading ...
Categories
Monthly Archives
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
クリエイティブ・コモンズ・ライセンス
Powered by
Movable Type 5.12