CSS Selector Generator | CSS のセレクタ一覧を一発で自動生成!

12

05月2009年

本文の文字数が多い時にだけ「続きを読む」を挿入する方法-MovableType

nagai 19:24 PM

イメージ

MovableTypeで記事本文のトリム処理をする際に、いろいろやってみたので備忘録としてエントリ。

やりたいコトは以下の通りです。

・アーカイブページで、個別記事本文のアタマから指定文字数分だけを表示させる
・指定文字数を超えていたら「…続きを見る」を表示
・「…続きを見る」にはパーマリンクを張る
・エントリ画面の本文入力フォーマットはリッチテキスト

その1 Javascriptでやってみる

まずはJSで。

<p>
<$MTEntryBody remove_html="0" trim_to="100"$>
<script type="text/javascript">
var charaNum = <$MTEntryBody count_characters="1"$>;
if(charaNum >= 100){
var url = "<a href='…<$MTEntryPermalink$>'>続きを読む</a>";
document.write(url);
}
</p>

ただコレだとJSをoffに設定されていたらダメ。

ページの先頭へ

その2 MTSetVarでなんとかする

それではMTの条件分岐タグで。

<p>
<MTSetVarBlock name="charaNum"><$MTEntryBody count_characters="1"$></MTSetVarBlock>
<$MTEntryBody remove_html="0" trim_to="100"$>
<MTIf name="charaNum" gt="100">…<a href="<$MTEntryPermalink$>">続きを読む</a></MTIf>
</p>

コレでいけます。
個人的にはちょっとコードがスッキリしない気がします(MTだからしょうがないケド…)。

ページの先頭へ

その3 もうpmファイルをいじくる

こうなったらもう調子にのってMTのソースを変更してしまいます。

MTDIR/lib/MT/Template/ContextHandlers.pmの776行目あたり

sub _fltr_trim_to {
my ($str, $val, $ctx) = @_;
return '' if $val <= 0;
$str = substr_text($str, 0, $val) if $val < length_text($str);
$str;
}

↑コレを↓このように変更します。

sub _fltr_trim_to {
my ($str, $val, $ctx) = @_;
my $e = $ctx->stash('entry');
my $url;
$url = $e->permalink;
$str = substr_text($str, 0, $val).'…<a href="'.$url.'">続きを読む</a>' if $val < length_text($str);
$str;
}

この方法だとテンプレート自体はとってもシンプルに。

<p><$MTEntryBody remove_html="0" trim_to="100"$></p>

スッキリです。

C-brains nagai

バシャログスタッフによるWebサイト制作サービス

トラックバック

このエントリーのトラックバックURL
http://c-brains.jp/cgi-bin/mt/###/1878
###はmt-tb.cgiに変更してください。

コメント

はじめまして。つるといいます。
記事通りやってみてとても素晴らしいと思ったのですが、
よくみると画像が表示されないのです。

画像も含めて規定文字数を表示させたいのですが
どうしたらよいですか?
よろしくお願いします。

コメントありがとうございます。

画像も含めるのはちょっと難しいですね。
画像は「続き」エリアに入力するなど、エリアを分けてしまったほうが実装が簡単かと思います。

よろしくお願いします。

とてもわかりやすい説明で参考にさせていただきました。ありがとうございます。
ただいまMT5でブログ作成奮闘中です。

実は、その2の方法でやってみたのですが、本文中の改行タグが反映されずにすべて1行で表示されてしまいます。

remove_html="0" は、HTML タグを除去しないためのアトリビュートだと思うのですが、違うでしょうか?

大変恐縮なのですが、なにか解決のヒントを教えていただけたら幸いです。

>こんぶさん

コメントありがとうございます。
お返事が遅くなってしま、すみません。

改行も反映したいということでしたら、
convert_breaksモディファイアも併用して、以下の記述でいけると思います。

<$MTEntryBody remove_html="0" trim_to="200">

今後ともバシャログ。をよろしくお願いします。

すみません!お返事いただいていたのに気づいていませんでした。
すっかり諦めていたのですが、また挑戦してみます。
ありがとうございました。

コメントを投稿

ページの先頭へ

POPULAR TAGS
  • バシャログスタッフによるWebサイト制作サービス

ARCHIVE

特集

  • ステップアップ!CakePHP
  • 作って学ぶjQuery