Web 制作のことを中心に、ちょっとした Tips などを掲載しています。「自分用メモ」が基本スタンス。

btmup Blog

CMS PHP

SOY CMS で PHP を使って記事ごとに設定を任意で変えられるようにしているときに「cms:id」などが含まれている場合の対処法。

投稿日:

(2011.01.26:PHP の書き方を変更したコードを追記しました)

「新着情報」などのコンテンツをトップページやアーカイブで表示するとき、記事ごとに任意で設定を変えることがあります。
「重要!」などのアイコンの表示/非表示とか、太字にする/しないとか、リンクを設定する/しないとか。
カテゴリー名を表示するだけならシステム側で自動にできるんですが、これらの設定は人(記事の編集者)が手動で設定することになります。

SOY CMS(ver.1) でそれを実現するには、カスタムフィールドでその設定項目(チェックボックスなど)を追加して、表示させたいページに PHP の if 文を追記します。
その手順などは以下の記事で紹介されているので、カスタムフィールドの設定方法とか PHP 文の細かい意味とか、詳しいことはそちらを参照ください。
»SOY CMSのカスタムフィールドを使った条件分岐(1) | ウェビンブログ | 札幌のWebデザイナー・カスタマイズアドバイザー WebbingStudioのよしなし語り

僕の方では、ちょっとだけ応用の話を書きます。

とりあえず下準備の手順などを簡単に書いておくと、

  1. SOY CMS の管理画面で「プラグイン」タブを選択し、「カスタムフィールド」プラグインを有効にする
  2. 「プラグインの詳細設定」で、任意の ID とフィールド名を入力し、プルダウンから「チェックボックス」を選択して、カスタムフィールドを追加する。
    (僕は今回、詳細記事へのリンクの切り替えをしたかったので、IDは「to_detail」、フィールド名は「詳細へ」にしました)
  3. 追加したフィールドの「高度な設定」をクリックし、ラベルの関連付けを行う。(ここで関連付けたラベルの記事の編集画面にのみ、設定項目が表示されるようになる)
  4. 表示させたいページに 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">&raquo;詳細へ</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"]; ?>">&raquo;詳細へ</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.'">&raquo;詳細へ</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">&raquo;詳細へ</a></span>
<?php endif; ?>
</dt>
<dd><!-- cms:id="content" -->記事本文<!-- /cms:id="content" --></dd>
<!-- /block:id="information" -->

結果、「cmd:id」もちゃんと動いてくれました。
こっちの方がシンプルですし、分かりやすくて良いですね。
@riatw さん、ありがとうございました!




-CMS, PHP
-, ,

Copyright© btmup Blog , 2024 All Rights Reserved Powered by AFFINGER5.