(2011.01.26:PHP の書き方を変更したコードを追記しました)
「新着情報」などのコンテンツをトップページやアーカイブで表示するとき、記事ごとに任意で設定を変えることがあります。
「重要!」などのアイコンの表示/非表示とか、太字にする/しないとか、リンクを設定する/しないとか。
カテゴリー名を表示するだけならシステム側で自動にできるんですが、これらの設定は人(記事の編集者)が手動で設定することになります。
SOY CMS(ver.1) でそれを実現するには、カスタムフィールドでその設定項目(チェックボックスなど)を追加して、表示させたいページに PHP の if 文を追記します。
その手順などは以下の記事で紹介されているので、カスタムフィールドの設定方法とか PHP 文の細かい意味とか、詳しいことはそちらを参照ください。
»SOY CMSのカスタムフィールドを使った条件分岐(1) | ウェビンブログ | 札幌のWebデザイナー・カスタマイズアドバイザー WebbingStudioのよしなし語り
僕の方では、ちょっとだけ応用の話を書きます。
とりあえず下準備の手順などを簡単に書いておくと、
- SOY CMS の管理画面で「プラグイン」タブを選択し、「カスタムフィールド」プラグインを有効にする
- 「プラグインの詳細設定」で、任意の ID とフィールド名を入力し、プルダウンから「チェックボックス」を選択して、カスタムフィールドを追加する。
(僕は今回、詳細記事へのリンクの切り替えをしたかったので、IDは「to_detail」、フィールド名は「詳細へ」にしました) - 追加したフィールドの「高度な設定」をクリックし、ラベルの関連付けを行う。(ここで関連付けたラベルの記事の編集画面にのみ、設定項目が表示されるようになる)
- 表示させたいページに PHP の if 文を追記する。
という感じ。
カスタムフィールドの追加は特に難しくないと思いますが、問題なのは PHP です。
テキストのみの表示/非表示を切り替える場合
最終的に実現したいのはリンクに関する設定ですが、とりあえずテキストの表示/非表示の切り替えのみを設定して、カスタムフィールドと PHP との関連を確認します。
そのソースは以下。
<!-- block:id="information" -->
<dt><span class="date"><!-- cms:id="create_date" cms:format="Y.m.d" -->日付<!-- /cms:id="create_date" --></span><br />
<span class="title"><!-- cms:id="title_plain" -->記事タイトル<!-- /cms:id="title_plain" --></span>
<?php if(!empty($information[to_detail])){
echo '<span class="to_detail">詳細もあるよ!</span>';
}?>
</dt>
<dd><!-- cms:id="content" -->記事本文<!-- /cms:id="content" --></dd>
<!-- /block:id="information" -->
この例では、記事の編集画面で「詳細へ」をチェックしたとき、ページに「詳細もあるよ!」が表示されます。それだけです。
(他の要素(日付、記事タイトル、記事本文)は、もちろんチェックの有無に関わらず表示されます)
アイコンを表示させるだけなら、これだけでも充分ですね。
上記記事で紹介しているのは、ここまで。
しかし、詳細記事へのリンクを設定しようと思うと、ちょっとばかしややこしくなります。
リンクも含めた表示/非表示を切り替える場合
通常、詳細記事へのリンクを SOY CMS で設定する場合、以下のような記述になります。
<a cms:id="entry_link">»詳細へ</a>
なので、上記のソースにそのまま当てはめると、こうなるわけですが……、
<!-- block:id="information" -->
<dt><span class="date"><!-- cms:id="create_date" cms:format="Y.m.d" -->日付<!-- /cms:id="create_date" --></span><br />
<span class="title"><!-- cms:id="title_plain" -->記事タイトル<!-- /cms:id="title_plain" --></span>
<?php if(!empty($information[to_detail])){
echo '<span class="to_detail"><a cms:id="entry_link">»詳細へ</a></span>';
}?>
</dt>
<dd><!-- cms:id="content" -->記事本文<!-- /cms:id="content" --></dd>
<!-- /block:id="information" -->
この記述ではリンクの設定はできません。
それどころか、PHP のスクリプトがページのソースに含まれてしまいます。
その部分の抜粋が、以下。
<span class="to_detail"><?php if(!isset($information["entry_link_visible"]) || $information["entry_link_visible"]){ ?><a href="<?php echo $information["entry_link_attribute"]["href"]; ?>">»詳細へ</a><?php } ?>
</span>
うわぁ……。どうも「cms:id」関連の処理が途中で止まっちゃってる感じですね……。
PHP 文の中に入れたせいで、その辺りの処理がうまく働かなくなったんだと思われます(←よく分かってない)。
ただ、よく見ると処理自体は複雑なものではなさそうです。
恐らく、「リンクが可能(ブログページで詳細ページ作成にチェックを入れてるとか?)の場合、href 属性にリンク先を設定しなさい」なことではなかろうかと。
ならば、「href 属性に設定されるリンク先」を変数として取り出して、それをこちらで設定してやれば良いんでは?
と考えて修正したのが以下。
<!-- block:id="information" -->
<dt><span class="date"><!-- cms:id="create_date" cms:format="Y.m.d" -->日付<!-- /cms:id="create_date" --></span><br />
<span class="title"><!-- cms:id="title_plain" -->記事タイトル<!-- /cms:id="title_plain" --></span>
<?php if(!empty($information[to_detail])){
$link = $information["entry_link_attribute"]["href"];
echo '<span class="to_detail"><a href="'.$link.'">»詳細へ</a></span>';
}?>
</dt>
<dd><!-- cms:id="content" -->記事本文<!-- /cms:id="content" --></dd>
<!-- /block:id="information" -->
「$link」にリンク先を設定(代入)して、それをそのまま href 属性として設定してます。
これで無事にリンク先を設定できました。
まぁたぶんかなりムリヤリなので、汎用性のある方法ではないんでしょうけど……。
これを読んだ PHP な方、もし他にスマートで確実で安全な方法があれば教えてください。
情報プリーズ。
(以下追記:2011.01.26)
Twitter で @riatw さんからいただいた指摘を受けて、PHP 周りを修正してみました。
すべて引っくるめて HTML を echo で吐き出していた処理の部分を、条件分岐だけ PHP として書くように変更しています。
<!-- block:id="information" -->
<dt><span class="date"><!-- cms:id="create_date" cms:format="Y.m.d" -->日付<!-- /cms:id="create_date" --></span><br />
<span class="title"><!-- cms:id="title_plain" -->記事タイトル<!-- /cms:id="title_plain" --></span>
<?php if(!empty($information[to_detail])) :?>
<span class="to_detail"><a cms:id="entry_link">»詳細へ</a></span>
<?php endif; ?>
</dt>
<dd><!-- cms:id="content" -->記事本文<!-- /cms:id="content" --></dd>
<!-- /block:id="information" -->
結果、「cmd:id」もちゃんと動いてくれました。
こっちの方がシンプルですし、分かりやすくて良いですね。
@riatw さん、ありがとうございました!