btmup Blog

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

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
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

「CSS Nite in KANSAI, LP1 〜CMS POWER USER’S SUMMIT 2010〜」に参加してきました!

※まだ書き切れてませんが、とりあえずアップします。 2/27(土)に「CSS Nite in KANSAI, LP1 〜CMS POWER USER’S SUMMIT 2010〜」というイ …

no image

CMSについて独り言。

経験則だけど、たぶんものすごく一般論。 いわゆる「Web 担当者」が、文書の作成や編集をするときの基準は MS Office。 そういう人たちの多くは「インターネットは何でもできる」と思っていて、CM …

no image

EC サイト構築 ASP の「MakeShop」で注意する点など(走り書き)。

EC サイトを構築するために「MakeShop」という ASP を使用しているのですが、やっぱり普通にホスティングを借りてガシガシ作るのとは勝手が違います。 色々と分からなかったり詰まったり「あー、こ …

no image

ファーストサーバにWordPressをインストールする方法(というか準備)

マニュアルに載っているような一般的な内容は省略して、「文字化け対策」とその周辺の情報に焦点を絞ってまとめてみます。 »WordPressのインストール方法 諸々のバージョンやら WordP …

no image

国産 CMS のセミナー開催 – CSS Nite。

»国産CMSにフォーカスしたCSS Niteを6月27日に開催 – CSS Nite公式サイト ↑タイトルのまんまですが、国産 CMS に関するセミナーが開かれるようです。 採 …