ラベル "Movable Type" の投稿を表示しています。 すべての投稿を表示
ラベル "Movable Type" の投稿を表示しています。 すべての投稿を表示

2010年7月11日日曜日

検索結果を複数ページに分割する。

エントリーが多くなってくると、それに伴って検索結果も増えてきますよね。
結果が10件くらいならともかく、50件とか、100件とかになっちゃうと、結構大変なことになってきます。

Movable Typeのデフォルトだと、結果は20件まで同じページに表示されますが、21件目以降へのリンクが自動生成されません。
つまり、21件目以降の検索結果が分からない、ということになります。

この『検索結果をページ分割して出力する手順』を以下に書き残す次第。

なぜ思い立ったかと言うと、このブログの検索結果の表示がおかしい事に気が付いたから。
ふつう、自分のブログの記事を自分では検索しませんよね。だから、今まで気が付かなかったのですが、検索結果が複数ヒットした場合でも、最初の1件しか表示されない、という、なんともお粗末な感じになっていたのです。もしかしたら、ご迷惑をおかけしていたかもしれません。ごめんなさい。

特にカスタマイズしなくても、MTのデフォルトだと20件までは表示されるはず。おかしいなぁ、と思って、検索結果テンプレートをチェックしても、特に問題なし。で、よくよく考えてみると、検索テンプレート内に後述するmt:SearchMaxResultsを記述していなかったのでした。チャンチャン。

これでとりあえずすべての検索結果が表示されるようになったのですが、ついでなので、検索結果ページをカスタマイズしてみようかと。完全に行き当たりばったりの思い付きです。

毎度のことですが、すべて自己流なので、詳しい人が見たら無駄なタグとか、間違ったソースを書いているかも知れません。一応は自分の環境での正常動作は確認済みですが、それ以上のテストは行っておりませんので、あしからずご了承ください。
その辺を踏まえた上で、今回は、以下の設定でカスタマイズしていきたいと思います。


  1. デフォルトの20件表示を解除して、1ページに5件の表示で出力する。

  2. 5件以上の検索結果があるときには、ページを分割して出力する。

  3. 分割された各ページへのリンクを出力する。

  4. このリンクは、前後最大5件の表示とする。例えば、20ページ中7ページ目だったら、2から12のみ表示するように出力する。

  5. 検索結果が1ページに収まるときは、このリンクを非表示にする。



といった感じです。


mt-config.cgiの編集



mt-config.cgiの結構下の方に、


# The maximum number of results to return in a search. If this is a straight

# search, the number of results is per-blog--if you set MaxResults to 5,

# for example, that would mean a maximum of 5 results for each blog in your

# system. In a new comment search, this is the maximum number of entries

# with new comments.

#

#MaxResults 5



というところがあるので、
#MaxResults 5
のコメントアウトを解除して、
MaxResults 5
にします。

mt:SearchMaxResultsの挿入



言い訳になりますが、前述したように、MTは不親切なので、mt-config.cgiを編集しただけでは検索結果に反映されません。
検索テンプレートに、



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




を追加してください。

場所は、



<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />




の行の下あたりで。これでやっと1ページの表示件数が反映されます。


検索結果ページを分割して出力する




ページ分割するには、検索結果テンプレートを編集していきます。

直接、検索結果テンプレートに書き足してもいいのですが、あとあとの編集のために、このページ分割出力関係をモジュール化しておくことにします。

検索結果テンプレートの、MTSearchResultsタグを閉じたあたりに、
<$MTInclude module="検索結果ページ分割リンク"$>(仮称。モジュールの名前はお好きにどうぞ)


と記入して、新しいモジュールを作成します。

このモジュールに、必要なタグを書き込んでいきます。

以下に見本ソースを書きましたのでご参考に。
このソースでは、検索結果の総ページ数を出力し、ページが分割出力(今回の設定だと、6件以上ヒットした場合)された場合には、ページ数の数字に各々のページへのリンクが付きます。
そして、直接各ページへ飛ぶリンクの前後に、前後1ページへリンクする『前』というリンクと、『次』というリンクも表示させます。




<div class="content-nav">
<MTPagerBlock>
<MTIfCurrentPage>
<MTVar name="__value__" setvar="page_next" value="5" op="+">
<MTVar name="__value__" setvar="page_prev" value="5" op="-">
</MTIfCurrentPage>
</MTPagerBlock>

<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>
<MTIf name="__value__" le="$page_next"><MTIf name="__value__" ge="$page_prev"><a href="<$mt:PagerLink$>"><$mt:Var name="__value__"$></a></MTIf></MTIf>
</mt:IfCurrentPage>

</mt:PagerBlock>
<mt:IfMoreResults> &nbsp;&nbsp; <a href="<$mt:NextLink$>" rel="next" onclick="return swapContent();">次 &gt;</a>
</mt:IfMoreResults>
</div>





検索結果が1ページで収まる場合の調整




上記のソースでは、分割された最初のページで『前』、最後のページで『次』は表示されないようになるのですが、検索結果が1ページで収まる場合(今回の設定だとヒットしたのが5件以下)に、リンクが付かないページ番号『1』が表示されてしまいます。

『検索結果は1ページしかありませんよ』というメッセージだと理解してもいいのですが、結果が1ページで収まるのであれば、この『1』は必要ないような気がします。
お好みになってしまいますが、この『1』を消すために、mt:unlessタグを使用して、結果が1ページの時には、リンクを出力しないようにします。
mt:unlessを反映させたソースがこちらです。





<div class="content-nav">
<MTPagerBlock>
<mt:getVar name="__value__" setvar="result_number" />
<MTIfCurrentPage>
<MTVar name="__value__" setvar="page_next" value="5" op="+">
<MTVar name="__value__" setvar="page_prev" value="5" op="-">
</MTIfCurrentPage>
</MTPagerBlock>
<mt:unless name="result_number" eq="1">
<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>
<MTIf name="__value__" le="$page_next"><MTIf name="__value__" ge="$page_prev"><a href="<$mt:PagerLink$>"><$mt:Var name="__value__"$></a></MTIf></MTIf>
</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>
</mt:unless>
</div>




一応、このソースが今回設定したカスタマイズの完成形ということになります。


あとは、細かい調整をお好みでカスタマイズすれば完了ですね。
例えば、数字を少し大きく表示させたければテキストサイズを変更してみるとか、センタリングしたければcenterタグなどで整えるとかすればよろしいのかと。



2010年7月4日日曜日

再構築での500エラーを回避する。

Movable Typeをスタティックで構築している場合、何かカスタマイズした後にすべてのエントリーを再構築する場面が多いと思います。

この時、エントリーが多くなってくると再構築時に500エラーが出てしまう事があります。

そしてこの現象の原因として下記が考えられます。


  1. サーバのパフォーマンス低下

  2. サーバのメモリ量不足



大多数の個人ユーザーはレンタルサーバー会社のホスティングサービスを利用しているかと思います。
一つのサーバーを結構な人数でシェアしているわけです。
で、この複数名で共有しているレンタルサーバでは、CPU やメモリ等の事実上のスペックがマシンを占有する人数や使用頻度に反比例して低下していきます。

そのために、サーバーが混んでいるときには再構築の成功率が低下してしまうのです。

この現象を少しでも回避するために、mt-config.cgiの内容を書き換えるのが結構有効な手段です。

mt-config.cgiをエディターで開くと、



# When rebuilding individual archives, Movable Type splits up the rebuilding

# process into segments, where each segment consists of rebuilding N entries.

# The default value for N is 40, so by default, MT will rebuild 40 entries at

# a time, then move on to the next 40, etc. You can change that value globally

# here; for example, if you have a very stable server, you might wish to just

# get it all done with in one batch.

#

# EntriesPerRebuild 40



というところがあります。

どういう事を言っているのかというと、



個々のアーカイブを再構築するとき、Movable Typeはセグメントごとに再構築プロセスを分けます。

このとき、各々のセグメントはN値でエントリを再構築することから成り立っています。

Nのデフォルト値は40なので、デフォルトで、MTはまず最初に40のエントリを再構築し、そして次の40エントリ、さらに次、というプロセスを取ります。

ここの設定でグローバルにN値を変えることができます。

たとえば、非常に安定したサーバーで運営しているのであれば、すべてのエントリを1つのバッチで再構築することもできます。




といった感じの意味の事が書いてあるのです。

つまり、デフォルトではいっぺんに40エントリーずつ再構築する仕様になっているのですが、これではサーバーの負担が大きいために実行できず、500エラーを返されてしまう、という訳です。

これを、10なり、15なり、自分の環境でエラーが出ない値まで下げてやると、結構な確率で500エラーは出なくなります。

上記の

#EntriesPerRebuild 40

のところを

EntriesPerRebuild 10

くらいの値にしてあげるとよいのではないかと。もちろん、20辺りで一度試してみてもいいでしょう。

それにしても、『たとえば、あなたが強力なサーバーを持っているなら、N値を増やしたいと思うでしょう』って言うのは少々・・・な感じもします。


もちろん、これ以外の原因もありますので、絶対500エラーが出なくなる、という訳ではありませんけど、この『N値設定』一度お試しください。



2010年5月23日日曜日

アップグレードの罠。

Movable Typeを5系にアップしたのですが、案の定ハマっております。

困りごと1

いままでブログ自体をRootに書き出していたのですが、どうもこれは出来ない仕様になっているようです。もっとも、この書き出し方は、今までも『推奨』はされていませんでしたが。
Webと称して、Rootには新しいページが作成される模様。

つまり、RootにWebページ、その下層にブログ、という形のみらしい。

3系から4系に上げたときも結構いろいろいじりまくった思い出が。
毎度のことではあるのですが。

困りごと2

Webページとブログページの整合が取れていない!

どういう事かというと、現状で同じスタイルシートを使っていないから。
なぜなら、4系用のテーマをそのまま流用しているので、Web → ブログ 、という構造を想定していないのです。

今のところ、Webページのスタイルは標準仕様でごまかしています。
何とかします。


一応、vicuna CMSの導入は何となくOK。
いろいろ検討したのですが、いい機会なので、リニューアルという名目で、WebとBlogのCSSはあえて違うものを使う事にしました。

2008年11月8日土曜日

MT4.2 画像のポップアップウィンドウのカスタマイズ方法。

ポップアップウィンドウのスクロールやリサイズを有効にする方法として、以前のMT3系ではCMS.pmのポップアップウィンドウ生成部分(3.2 では3600行目あたり、3.3b2 では4700行目辺り)の

scrollbars=no


を

scrollbars=yes(または1)


に変更し、さらに、スクロールバーを表示する設定にした場合、スクロールバーが画像にやや被ってしまうのを回避するために、上記修正場所の少し上の行、

my $link = $thumb  


で始まる行の上に

$width += 17;


を書き足す方法が知られていました。
��詳細は、「小粋空間」さんの、画像のポップアップウィンドウをカスタマイズするhttp://www.koikikukan.com/archives/2006/06/24-015315.phpを参照)


MT4系ではこの方法は使えません。
いくらCMS.pmを検索しても、この部分は見つかりません。

では、どこにあるのかといいますと、
画像ポップアップウィンドウを生成しているファイルは、MT \ lib \ MT \ Asset \ の中にある、Image.pmです。

ということで、ここをいじるとポップアップウィンドウのカスタマイズが可能になります。

Image.pmの310行目付近

q|<a href="%s" onclick="window.open('%s','popup','width=%d,height=%d,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false">%s</a>|,

(アンカータグは全角文字にしてあります)

を

q|<a href="%s" onclick="window.open('%s','popup','width=%d,height=%d,scrollbars=1,resizable=0,toolbar=0,directories=0,location=0,menubar=0,status=0,left=0,top=0'); return false">%s</a>|,

(アンカータグは全角文字にしてあります)

に書き直します。(1=yes、0=noですので、どちらの表記でもかまいません)
上記例だと、スクロールバーのみ表示、リサイズ不可です。

さらに、その少し下の行、


$asset->image_width,
$asset->image_height,


を

$asset->image_width +17,

$asset->image_height +25,


に書き直します。(+数値は適当に変更して調整してください)

これで、MT3系で行ったカスタマイズと同じ状態が作れます。

(自分の環境でしか試してませんので、果たしてこれで正解かどうかは不明です(^_^;) )


もっとも、現在は格好いいプラグインがありますから、あえて標準のポップアップを使わなくてもいいのかもしれませんが。