加藤です。
前回のエントリー で紹介したブログアプリケーションの Mephisto ですが、簡易CMSとして使えるかどうか検証したかったのと、プラグインの作り方を調べてみたかったので、試しにパンくずリスト用のプラグインを作ってみました。
やりたいことはブログ記事以外のセクションページで、ホームやセクショントップへのリンクをパンくずリスト形式で表示することです。セクションのトップページでは こちらのページのように ホームへのリンクだけを表示し、セクションのサブページでは こちらのページのように ホームとセクショントップへのリンクを表示します。
前回のエントリーでもご紹介したように、Mephistoはネストしたカテゴリ(セクション)をサポートしていないので、パンくずリスト内に表示されるリンクは最高でも2つまでです。
それでは、早速プラグインをつくってみます。まず、MephistoがインストールされたディレクトリでRailsのジェネレータを使ってプラグインのひな形を作成します。
./script/generate plugin MephistoBreadcrumbsPlugin
プラグインのインストール時やアンインストール時の処理は不要なので、それらに必要なファイルは削除します。
rm -f vendor/plugins/mephisto_breadcrumbs_plugin/*install.rb
プラグインのlibディレクトリ内にあるmephisto_breadcrumbs_plugin.rbに"Liguid":http://www.liquidmarkup.org/ フィルター用のヘルパメソッドを記述します。
vendor/plugins/mephisto_breadcrumbs_plugin/lib/mephisto_breadcrumbs_plugin.rb
module MephistoBreadcrumbsPlugin
def breadcrumbs(section, article, delimiter = ' » ')
links = [{:text => 'Home', :path => '/', :title => 'Back to Home'}]
unless section['pages'].empty?
section_top = section['pages'].first
unless section_top['permalink'] == article['permalink']
links << {:text => section_top['title'],
:path => "/#{section['path']}",
:title => "Go to #{section_top['title']}"}
end
end
links.map do |link|
content_tag :a, link[:text], :href => link[:path], :title => link[:title]
end.join(delimiter)
end
end
Railsでビューヘルパーを作成する方法と基本的には同じですが、注意点としては、articleやsectionといったモデルをハッシュオブジェクトで取り扱うことや、link_toなどのRails標準のヘルパメソッドは使えないのでcontent_tagなどで代用しないといけないといったことがあげられます。
余談ですが、これらの制限は少し不便だけどテンプレートの編集権限をユーザーに与えるためには不可欠なのだと思います。ERBをそのまま使うと、<% Article.delete_all %>とかありえなくもないので。
最後にアプリケーションの起動時に作成したモジュールを読み込むよう、init.rbに以下のように記述します。
vendor/plugins/mephisto_breadcrumbs_plugin/init.rb
require 'mephisto_breadcrumbs_plugin'
Liquid::Template.register_filter MephistoBreadcrumbsPlugin
以上でプラグインの作成は終了です。簡単ですね。次回の起動時から作成したパンくずリスト用のヘルパメソッドをページのテンプレート内で使用することができるようになります。例えば、このラボサイトのページ用テンプレートは以下のようになっています。
_page.liquid
<div class="entrytitle">
<h2></h2>
</div>
<div class="entry">
</div>
一目瞭然、2行目が今回作成したパンくずリスト用のタグです。Liquidのタグの記述方法はちょっと取っ付きにくいのですが、パラメータがひとつの場合は以下のようにパラメータが先にきてパイプ( | )につづいてメソッドを記述します。
パラメータが2つの場合はさらにわかりにくくて、パラメータがひとつの場合と同じように記述したあとに、メソッドの後ろへコロンをつけて、スペースをあけて2つ目のパラメータを記述します。
今回、本当はパンくずの区切り文字を指定するために3つ目のパラメータを使いたかったのですが、うまく渡すことができませんでした。Liquidのドキュメントが少ないのでまだちゃんと調べていませんが、もしかしたら2つまでしか渡せないのかもしれません。どなたかご存知でしたら教えてください。
ということで、今回作成したプラグインは簡単なもので配布するのもおこがましいのですが、パンくずリストの使用例も必要だったので"こちら":http://labs.airs.co.jp/projects/mephisto-breadcrumbs-plugin に専用のページを作成してみました。時間ができたら、もう少しちゃんと作りこんで正式にリリースできればと思っています。