Nucleus(JP)フォーラム

NucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。

ログインしていません。

#1 2005-03-09 04:31:42

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: アイテムによってテンプレートを分けることってできるでしょうか?

あるカテゴリーのアイテムを表示するときだけ,別のテンプレートを使いたいと思っています。
カテゴリー表示のときに分けるのではなく,「メインの目次」などで一覧で出ているときに,
そのカテゴリーのアイテムのときだけ違う処理にしたいのです。

テンプレートでは<%if%>も使えないし,タカさんのWritePHPxsもテンプレート変数が記述できないし,で
行き詰っています。

オフライン

#2 2005-03-09 08:44:00

nakahara21
メンバー
From: 尼崎
登録日: 2003-11-14
投稿: 1,298
ウェブサイト

Re: アイテムによってテンプレートを分けることってできるでしょうか?

私も同じ事考えてます。
現状では実現できるプラグインはなさそうだなーと思ってます。
例えばShowBlogsなんかだと自分で書いたプラグインなのですぐに改変して対応することができるのですが.....
今のコーディングのままだと、記事1個ずつクエリ発行となるので、負荷がかかるなぁ、と思って作ってません。

実際php+mysqlだからそんなに遅くなることはないのかも、とも思うんですけどね。
(サムネイルの動的生成なんかに比べたら全然マシなのかもしれないけど)

だから負荷を回避するために、ShowUsingQueryを使い回すのではなく、コピペしてちょっと手直しした別functionを用意するべきだなーで半年ストップしてます :cry:

実際、これができると、most visitorに興味なさげなカテゴリの記事はタイトルのみ表示とかできて、すっごく欲しい機能なんですよね wink


nakahara21
http://nakahara21.com/
(ただいま調整中です)

オフライン

#3 2005-03-09 09:00:43

kalm
メンバー
登録日: 2004-11-13
投稿: 7
ウェブサイト

Re: アイテムによってテンプレートを分けることってできるでしょうか?

はじめまして, dj krist です.

Andy さんの発言:

カテゴリー表示のときに分けるのではなく,「メインの目次」などで一覧で出ているときに,
そのカテゴリーのアイテムのときだけ違う処理にしたいのです。

どの程度テンプレートの内容を変えるのかにもよりますが, ひとつのテンプレート内で NP_WritePHPxs を使って 部分的 に出力を制御する方法も取れると思います. NP_WritePHPxs は 「テンプレート内では、テンプレート変数を使用しなければ使えます」 となっていますので, テンプレート内で例えば

<%WritePHPxs(
global $catid;
if ($catid == 3) {
  echo '<h2 class="special_category">';
}
else {
  echo '<h2 class="item">';
}
)%>
<%title%>
</h2>

のように, プラグインの呼び出しと変数の呼び出しを完全に分離して書くこともできると思います. ただ, こう条件分岐ばかりではサーバへの負荷もその分高まりますし, あまり実用的とは言えません. これは NP_WritePHPxs だけでそれを実現するためのアイデア程度です. sad

他には, テンプレートの <%if%> 変数でカテゴリ ID を呼び出せるようにコアを編集, または <%blog%> 変数で特定のカテゴリのテンプレートを変えられるようにコアを編集するという 2 点が頭に浮かんだのですが. nakahara21 さんも仰っているように今のところこういった機能に対応したプラグインは無いようですので, 少なくともコアの編集は必要ではないでしょうか.

nakahara21 さんの発言:

だから負荷を回避するために、ShowUsingQueryを使い回すのではなく、コピペしてちょっと手直しした別functionを用意するべきだなーで半年ストップしてます :cry:

nakahara21 さん, 先日は NP_ShowBlogsEx の件, ありがとうございました. ところでこの機能についてですが, NP_ShowBlogsEx のほうで検討してみてもよろしいでしょうか :?:

オフライン

#4 2005-03-09 11:49:07

nakahara21
メンバー
From: 尼崎
登録日: 2003-11-14
投稿: 1,298
ウェブサイト

Re: アイテムによってテンプレートを分けることってできるでしょうか?

なんだかよくわかってないですが、私の作った物ベースのことなら何でもご自由にどうぞ。

単純に、テンプレート名にcatidくっつけてクエリ発行させればいい、とか思ってるんですけど(^^ゞ
テンプレートを変化させたい特定のカテゴリについては、「grey/short_5」とかテンプレートを準備しておく。
存在しない、「grey/short_6」を呼び出そうとするときは事前に検知して、「grey/short」を呼び出す。
みたいなかんじで。

さぼりすぎですけど。


nakahara21
http://nakahara21.com/
(ただいま調整中です)

オフライン

#5 2005-03-09 13:18:46

jun
メンバー
登録日: 2004-02-07
投稿: 345

Re: アイテムによってテンプレートを分けることってできるでしょうか?

Andyさん さんの発言:

カテゴリー表示のときに分けるのではなく,「メインの目次」などで一覧で出ているときに,
そのカテゴリーのアイテムのときだけ違う処理にしたいのです。

カテゴリー表示のときに分けるんだったら、NP_MultiBlogsを少しカスタマイズすれば実現可能ですが、nakahara21さんが言及しているようにShowUsingQueryを使っているプラグインなので無理ですね。

別トピの話で恐縮ですが、ついでなのでNP_MultiBlogs絡みということで書いておきます。
テンプレートのコメント部分への記述ですが、おそらく下記コードをNP_MultiBlogsの「function doTemplateVar」の上あたりに追加すればOKかと思われます。

	function doTemplateCommentsVar(&$item, &$comment, $mode = '') {
		if(!$mode || $mode == 'i') $this -> doTemplateVar(&$item, $mode);
	}

オフライン

#6 2005-03-09 18:16:12

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: アイテムによってテンプレートを分けることってできるでしょうか?

ShowBlogsやMultiBlogsを大きく改造すれば,できないことはないのは分かるのですが,ブログ表示系のプラグインは好みがあるので,できればそれに依存しないでできないかなあと。

とすると,考えられるのはWritePHPxsを改造してテンプレート変数をパースできるようにすること。
やってみたら,一応動くようになりました。追加した部分だけ掲載しておきます。At your own riskでお願いします。

    function doTemplateVar() {
        $params = func_get_args();
        $item = $params[0];
        array_shift($params); //remove 'item'
        $code = implode(',',$params);
        
        ob_start();
        $this->parse_code($code,$skinType);
        $content = ob_get_contents();
        ob_end_clean();
        
        $this->_doTemplateParse($content, $item);
    }

	function _doTemplateParse($content,&$item) {
		global $blogid, $currentTemplateName;
	
		$template = TEMPLATE::read($currentTemplateName);
		
		// create parser object & action handler
		
		$blog = new BLOG($blogid);
		$actions = new ITEMACTIONS($blog);
		$parser = new PARSER($actions->getDefinedActions(),$actions);
		$actions->setTemplate($template);
		$actions->setParser($parser);
		$item->timestamp = strtotime($item->itime);
		$actions->setCurrentItem($item);
        $content = preg_replace(array('/<:/','/:>/'), array('<%','%>'), $content);
		$parser->parse($content);
	}			

この修正に伴って,doSkinVar内でskintypeがtemplateの場合を考慮しなくてよくなるので,そっちはだいぶシンプルになります。

jun さんの発言:

別トピの話で恐縮ですが、ついでなのでNP_MultiBlogs絡みということで書いておきます。
テンプレートのコメント部分への記述ですが、おそらく下記コードをNP_MultiBlogsの「function doTemplateVar」の上あたりに追加すればOKかと思われます。

	function doTemplateCommentsVar(&$item, &$comment, $mode = '') {
		if(!$mode || $mode == 'i') $this -> doTemplateVar(&$item, $mode);
	}

ありがとうございます。 big_smile

オフライン

#7 2005-03-09 19:02:04

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: アイテムによってテンプレートを分けることってできるでしょうか?

あー,でもこれだけだとやっぱりやりたいことはできないんだなあと気付いて鬱 sad

オフライン

#8 2005-03-09 19:54:24

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: アイテムによってテンプレートを分けることってできるでしょうか?

一人芝居ですみません。
さっきのだとindexページのアイテムのテンプレートのところでカテゴリーで処理を分けることができません($catidがセットされないので)。
そこで,自前で持つようにしたら望みどおりの動作になりました。 wink

改造は,
1. クラス変数で$catid, $itemidを宣言
2.  クラス変数へのアクセス用に

    function catid() { return $this->catid; }
    function itemid() { return $this->itemid; }

を新設。
3. 先ほどのdoTemplateVarを

    function doTemplateVar() {
        global $itemid, $catid;
        $params = func_get_args();
        $item = $params[0];
        array_shift($params); //remove 'item'
        $code = implode(',',$params);
        $this->itemid = $item->itemid;
        $this->catid = $item->catid;

        ob_start();
        $this->parse_code($code,$skinType);
        $content = ob_get_contents();
        ob_end_clean();
        
        $this->_doTemplateParse($content, $item);
    }

に修正,です。
テンプレートからは

<%WritePHPxs(
   global $catid;
   if (NP_WritePHPxs::catid() == カテゴリーID){
       特別な処理
} else {
       普通の処理
}
)%>

みたいに利用できます。 lol

オフライン

Board footer