2008年07月14日(月) コメント:0 トラックバック:0
FC2ブログに「親子カテゴリ」機能が追加されました。
親子カテゴリはやや複雑な条件分岐を必要とするので、 テンプレート変数がどのように変換されるのか考えてみました。
2008年7月13日の時点で公式プラグインからダウンロードできる「親子カテゴリ」のHTMLは以下のようになっています。
<ul class="main_menu">
<!--category-->
<!--category_sub_begin-->
<ul class="sub_menu">
<!--/category_sub_begin-->
<!--category_nosub-->
<li class="main_list" &align>
<!--/category_nosub-->
<!--category_parent-->
<li class="main_list" &align>
<!--/category_parent-->
<!--category_sub_hasnext-->
<li class="sub_list" &align>
<!--/category_sub_hasnext-->
<!--category_sub_end-->
<li class="sub_list_end" &align>
<!--/category_sub_end-->
<a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a>
<!--category_nosub-->
</li>
<!--/category_nosub-->
<!--category_sub_hasnext-->
</li>
<!--/category_sub_hasnext-->
<!--category_sub_end-->
</li>
</ul>
</li>
<!--/category_sub_end-->
<!--/category-->
</ul>
各変数の意味はテンプレート用 変数一覧に記載されています。
さて、ブログのカテゴリが以下のように設定されているとします。
親1 親2 子2-1 子2-2 子2-3 親3 子3-1
変換のさいには各カテゴリごとに<!--category-->
~<!--/category-->
内の条件分岐を判定します。
- 親1は
子カテゴリを持たない
カテゴリなので<!--category_nosub-->
~<!--/category_nosub-->
内が出力され、ほかは無視されます。 すなわち、<li class="main_list" &align> <a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a> </li>
- 親2は
親カテゴリ(子カテゴリがある)
カテゴリなので、<!--category_parent-->
~<!--/category_parent-->
内が出力され、ほかは無視されます。 すなわち、
この時点ではli要素タグの終了タグが不足しています。<li class="main_list" &align> <a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a>
- 子2-1は
各親カテゴリ下にある、先頭の子カテゴリ
かつ最後尾の子カテゴリ以外
のカテゴリなので<!--category_sub_begin-->
~<!--/category_sub_begin-->
内と<!--category_sub_hasnext-->
~<!--/category_sub_hasnext-->
内が出力され、ほかは無視されます。 すなわち、
この時点ではul要素タグの終了タグが不足しています。<ul class="sub_menu"> <li class="sub_list" &align> <a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a> </li>
- 子2-2は
各親カテゴリ下にある、最後尾の子カテゴリ以外
のカテゴリなので、<!--category_sub_hasnext-->
~<!--/category_sub_hasnext-->
内が出力され、ほかは無視されます。 すなわち、<li class="sub_list" &align> <a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a> </li>
- 子2-3は
各親カテゴリ下にある、最後尾の子カテゴリ
なので、<!--category_sub_end-->
~<!--/category_sub_end-->
内が出力され、ほかは無視されます。 すなわち、
子2-1の<li class="sub_list_end" &align> <a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a> </li> </ul> </li>
<ul class="sub_menu">
に対応する</ul>
と 親2の<li class="main_list" &align>
に対応する</li>
がここで現れます。 - 親3は親2とまったく同様で
<li class="main_list" &align> <a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a>
- 子3-1は
各親カテゴリ下にある、先頭の子カテゴリ
かつ各親カテゴリ下にある、最後尾の子カテゴリ
なので、<!--category_sub_begin-->
~<!--/category_sub_begin-->
内と<!--category_sub_end-->
~<!--/category_sub_end-->
内が出力され、ほかは無視されます。 すなわち、<ul class="sub_menu"> <li class="sub_list_end" &align> <a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a> </li> </ul> </li>
結局、以下のように整形式のHTMLが出力されます。
<ul class="main_menu">
<li class="main_list" &align>
<a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a>
</li>
<li class="main_list" &align>
<a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a>
<ul class="sub_menu">
<li class="sub_list" &align>
<a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a>
</li>
<li class="sub_list" &align>
<a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a>
</li>
<li class="sub_list_end" &align>
<a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a>
</li>
</ul>
</li>
<li class="main_list" &align>
<a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a>
<ul class="sub_menu">
<li class="sub_list_end" &align>
<a href="<%category_link>" title="<%category_name>"><%category_name>(<%category_count>)</a>
</li>
</ul>
</li>
</ul>
子カテゴリが存在しない場合でも従来どおりに出力され、各カテゴリページのURLに変更もないので、 プラグイン非対応の共有テンプレートにも親子カテゴリを実装できそうです。 なかなかうまくできた仕様ではないでしょうか。
ところで、Chakoさんのところで紹介されているHTMLは公式プラグインのものとは異なりますが、出力される結果は同じになります。 こちらのほうがわかりやすい。
コメント(0件)