スポンサーサイト空のリスト型変数対策(要検証)

記事情報

投稿日時
--------T--:--:--+09:00
カテゴリー
スポンサー広告

記事本文

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

記事情報

投稿日時
2008-01-10T12:51:40+09:00
カテゴリー
FC2BLOG
タグ

記事本文

FC2ブログで使用できる、ほんの少し便利かもしれないテクニックを発見しました。ただ、このテクニックには謎が多いので、まだまだ検証が必要かと思われます。一応、現時点でわかっていることを(主に自分のために)メモしておきます。

説明しやすくするため、FC2ブログ用の独自変数を以下のように(勝手に)分類することにします。

フラグ型変数
条件によって出力/非出力を分岐するタイプの変数。たとえば以下のようなもの。
リスト型変数
内容を繰り返し出力するタイプの変数。たとえば以下のようなもの。
単変数
1つの数値や文字列等を出力する変数。<%hogehoge>という形のもの。

まず、テンプレートの中に以下のようなソースがあるとします。

<dl id="sidebar">
        <dt>カテゴリー</dt>
        <dd>
                <ul>
                        <!--category--><li><a href="<%category_link>" ><%category_name> (<%category_count>)</a></li><!--/category-->
                </ul>
        </dd>

        <dt>最近のコメント</dt>
        <dd>
                <ul>
                        <!--rcomment--><li><a href="<%rcomment_link>" ><%rcomment_name> → <%rcomment_title></a></li><!--/rcomment-->
                </ul>
        </dd>

        <dt>最近のトラックバック</dt>
        <dd>
                <ul>
                        <!--rtrackback--><li><a href="<%rtrackback_url>" ><%rtrackback_title>(<%rtrackback_blog_name>)</a> → <a href="<%rtrackback_link>" ><%rtrackback_etitle></a></li><!--/rtrackback-->
                </ul>
        </dd>
</dl>

まあよくあるサイドバーのようなものです。全体を<dl>で囲み、<dt>に項目名、<dd>内にその内容を<ul><li>で並べています。

こういう場合、カテゴリーは必ず1つは存在しているので問題ありませんが、コメントやトラックバックがまだ1件もないときは、空の<ul></ul>ができてしまうという問題が起こります。空のリストなんて気にする人はほとんどいないと思いますが、そのほかに、コメントやトラックバックがないのに「最近のコメント」「最近のトラックバック」といった項目名が表示されるのも、少し気になったりすると思います。

そこで、以下のようにすると、コメントやトラックバックがない場合に「最近のコメント」「最近のトラックバック」の項目をまるごと消し去ることができます。単に非表示にするだけではなく、ソースから完全に消せます。

<dl id="sidebar">
        <dt>カテゴリー</dt>
        <dd>
                <ul>
                        <!--category--><li><a href="<%category_link>" ><%category_name> (<%category_count>)</a></li><!--/category-->
                </ul>
        </dd>

        <!--rcomment--><!--not_edit_area--><!--/rcomment-->
        <dt>最近のコメント</dt>
        <dd>
                <ul>
                        <!--rcomment--><li><a href="<%rcomment_link>" ><%rcomment_name> → <%rcomment_title></a></li><!--/rcomment-->
                </ul>
        </dd>
        <!--rcomment--><!--/not_edit_area--><!--/rcomment-->

        <!--rtrackback--><!--not_edit_area--><!--/rtrackback-->
        <dt>最近のトラックバック</dt>
        <dd>
                <ul>
                        <!--rtrackback--><li><a href="<%rtrackback_url>" ><%rtrackback_title>(<%rtrackback_blog_name>)</a> → <a href="<%rtrackback_link>" ><%rtrackback_etitle></a></li><!--/rtrackback-->
                </ul>
        </dd>
        <!--rtrackback--><!--/not_edit_area--><!--/rtrackback-->
</dl>

強調部分が追加されました。これだけで完了です。コメントやトラックバックが1件もないときは、強調部分に挟まれた内容がきれいさっぱり消え失せます。コメントやトラックバックがあれば、何の問題もなく通常通り表示されます。

これを一般化すると、以下のようになります。

<!--リスト型変数--><!--フラグ型変数--><!--/リスト型変数-->
(リスト型変数が空のときに消える内容)
<!--リスト型変数--><!--/フラグ型変数--><!--/リスト型変数-->

このとき、リスト型変数はすべて共通のものにする必要があります。しかしフラグ型変数に関しては、共通のものにする必要はありません。たとえば<!--category_area-->~<!--/not_search_area-->のように、前後のタグが対応関係になくても問題ありません。とにかくいずれかのフラグ型変数で開始し、いずれかのフラグ型変数で閉じれば、正常に機能するようです(<!--not_edit_area-->~<!--not_edit_area-->のように閉じなかった場合、エラーでページ自体が表示されません)。また、これはどのページでも関係なく、たとえばトップページ(index_area)において<!--not_index_area-->~<!--/not_index_area-->という組み合わせを使用しても、同様の結果が得られます。

これが、このテクニックの謎の部分です。そもそも、一体どういう仕組みでこのようなテクニックが可能となっているのか……?

たとえば<!--rcomment-->~<!--/rcomment-->は、最近のコメントの数だけその中身を繰り返して表示します。環境設定で最近のコメントの表示件数を5件に設定して、ブログにコメントが5件以上寄せられている状態では、<!--rcomment-->あ<!--/rcomment-->は「あああああ」と表示されます。同様に、3件ならば「あああ」、1件ならば「あ」とだけ表示されます。そして、コメントが1件も寄せられていない状態では、「あ」を0回繰り返して表示、つまり何も表示されません。

同様に考えれば、<!--rcomment--><!--not_edit_area--><!--/rcomment--><!--rcomment--><!--/not_edit_area--><!--/rcomment-->も、コメントが0件のときには何の意味も持たなくなるはずです。ところが、なぜか上記のようなことが起こるのです。しかも、単純に<!--rcomment-->~<!--/rcomment-->の中身が出力されるわけではないようです(もしそうであれば、前述のようにindex_areaにおいて<!--not_index_area-->~<!--/not_index_area-->を使用したり、対応関係にないタグを組み合わせたりはできないはずです)。

さらに、なぜコメントやトラックバックがある場合に問題が生じないのか、という点も謎です。すなわち、最近のコメントが5件あれば、<!--rcomment--><!--not_edit_area--><!--/rcomment-->は一見<!--not_edit_area-->を5回繰り返しそうに思えます。そうであれば、たとえば<!--rcomment--><!--category_area--><!--/rcomment-->~<!--rcomment--><!--/not_search_area--><!--/rcomment-->

<!--category_area--><!--category_area--><!--category_area--><!--category_area--><!--category_area-->
内容
<!--/not_search_area--><!--/not_search_area--><!--/not_search_area--><!--/not_search_area--><!--/not_search_area-->

という具合になり、閉じられるべきものが正しく閉じられていないため、当然ながらエラーでページが表示できなくなるはずです。ところが実際は、このような問題は生じず、通常どおり項目が表示されます。とはいえ、ここで<!--/not_search_area-->を省略するとエラーになるため、このことから、<!--rcomment-->~<!--/rcomment-->内が完全に無視されているわけではないということが推測できます。

……書いていてわけがわからなくなってきたので、謎解きはひとまずこの辺まで。

どういう仕組みかはさておき、これは地味に使えるテクニックではないかと思います。コメントとトラックバックを例にとりましたが、もちろんほかの変数でも同様で、たとえば、

<!--topentry--><!--not_edit_area--><!--/topentry-->
(エントリーが存在しないときに消える内容)
<!--topentry--><!--/not_edit_area--><!--/topentry-->

のようにすれば、エントリーが1つもない場合(ブログ内検索で1件もヒットしなかった場合等)に、エントリーを内包しているブロック自体を消したりできます。工夫次第では、何かもっと面白いことができるかもしれません。

スポンサーサイト

コメント

コメントフォーム (C)
管理者にだけ表示を許可する

(P)

トラックバック

トラックバックURL
http://kofumo.blog28.fc2.com/tb.php/8-b31a5da9

奥付

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。