Nucleus(JP)フォーラム

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

ログインしていません。

#1 2007-05-16 17:56:01

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

Re: 3.3のスペシャルスキンパーツをスキン部品に使うincludespecial

3.3でスペシャル・スキン・パーツができましたが,これをスキン部品としても使えないかと思ってプラグインを作ってみました。使い方はスキン中に

<%includespecial(スペシャル・スキン・パーツの名前)%>

と書くだけです。そのスキンに付属するパーツ以外は呼べません。
試作品なのでバグありありだと思いますが,試していただければと思います。

<?php

class NP_includespecial extends NucleusPlugin {

	function getName() 		{ return 'Include Special'; }
	function getAuthor()  	{ return 'Andy'; }
	function getURL()  		{ return ''; }
	function getVersion() 	{ return '0.1'; }
	function getDescription() { return 'include a special skin part and, parse it';	}

	function supportsFeature($what) {
		switch($what)
		{ case 'SqlTablePrefix':
				return 1;
			default:
				return 0; }
	}

		 
	function doSkinVar($skinType, $partsname) {
		global $skinid;

		$skin = new SKIN($skinid);

		if (!$skin->isValid) {
			return;
		}

		$contents = $skin->getContent($partsname);

		if (!$contents) {
			return;
		}

		$actions = $skin->getAllowedActionsForType($skinType);

		// set IncludeMode properties of parser
		PARSER::setProperty('IncludeMode',$skin->getIncludeMode());
		PARSER::setProperty('IncludePrefix',$skin->getIncludePrefix());

		$handler =& new ACTIONS($type, $skin);
		$parser =& new PARSER($actions, $handler);
		$handler->setParser($parser);
		$handler->setSkin($skin);
		$parser->parse($contents);
	}

}
?>

オフライン

#2 2007-05-16 18:23:40

藤咲
Administrator
From: 広島
登録日: 2003-11-17
投稿: 1,210
ウェブサイト

Re: 3.3のスペシャルスキンパーツをスキン部品に使うincludespecial

Andy さんの発言:

3.3でスペシャル・スキン・パーツができましたが,これをスキン部品としても使えないかと思ってプラグインを作ってみました。

おお、これでExtraSkinJP代替になりそうな感じです?


藤咲
備忘録とかもろもろ
http://fjsk.tk/

オフライン

#3 2007-05-16 18:26:49

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

Re: 3.3のスペシャルスキンパーツをスキン部品に使うincludespecial

ExtraSkinJPでいうと「グローバル」の部品の置き換えは可能です。
「blogのみ」とか「blogとcategory」は,ifと組み合わせて実現してもらうしかないです。

オフライン

#4 2007-05-17 04:48:29

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: 3.3のスペシャルスキンパーツをスキン部品に使うincludespecial

なるほど!面白いですね。これはプラグインというよりも、コアに欲しい機能の様な気がします。*.inc ファイルが多いスキンでは、サーバとして利用するプロバイダによっては大幅にパフォーマンスがアップするかもしれませんね。

早速の要望なのですが、もし該当するスペシャルスキンパーツがない場合に、スキンディレクトリから『*.inc』ファイルを読み込んで自動的にスペシャルスキンパーツとして登録した後に利用するっていう事は出来ますか?

<%if(hasplugin,includespecial)%>
<%includespecial(foo)%>
<%else%>
<%parsedinclude(foo.inc)%>
<%endif%>

という記述で、このプラグインがインストールされていてもいなくても両方に対応出来るようなスキンの記述を考えています。

オフライン

#5 2007-05-17 13:23:48

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

Re: 3.3のスペシャルスキンパーツをスキン部品に使うincludespecial

明示しないのにincを読み込むというのもちょっと気持ち悪いので
<%includespecial(パーツ名|ファイル名)%>
という書き方をしたときにパーツがないとファイルを読みにいくようにしてみました。

このほか無限ループを防ぐためのレベル判定を加えています。

<?php

class NP_includespecial extends NucleusPlugin {

	var $level;
	
	function getName() 		{ return 'Include Special'; }
	function getAuthor()  	{ return 'Andy'; }
	function getURL()  		{ return ''; }
	function getVersion() 	{ return '0.2'; }
	function getDescription() { return 'include a special skin part and, parse it';	}

	function supportsFeature($what) {
		switch($what)
		{ case 'SqlTablePrefix':
				return 1;
			default:
				return 0; }
	}
	
	function init() {
		$this->level = 0;
	}

		 
	function doSkinVar($skinType, $partsname) {
		global $skinid;

		if ($this->level > 3) return;
		
		$skin = new SKIN($skinid);

		if (!$skin->isValid) {
			return;
		}
		
		$parts = explode('|', $partsname, 2);

		$actions = $skin->getAllowedActionsForType($skinType);

		// set IncludeMode properties of parser
		PARSER::setProperty('IncludeMode',$skin->getIncludeMode());
		PARSER::setProperty('IncludePrefix',$skin->getIncludePrefix());
		$handler =& new ACTIONS($type, $skin);
		$parser =& new PARSER($actions, $handler);
		$handler->setParser($parser);
		$handler->setSkin($skin);

		if (($contents = $skin->getContent($parts[0]))) {
			$this->level++;

			$parser->parse($contents);

			$this->level--;
		} else {
			$handler->parse_parsedinclude($parts[1]);
		}

	}

}
?>

ちなみに名前を全部小文字にしたのはコアに入れたときに違和感ないようにというところも狙っています。 wink

オフライン

#6 2007-05-19 03:26:27

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: 3.3のスペシャルスキンパーツをスキン部品に使うincludespecial

Andy さんの発言:

ちなみに名前を全部小文字にしたのはコアに入れたときに違和感ないようにというところも狙っています。 wink

ですね。 smile

$handler->parse_parsedinclude($parts[1]); の後で自動的に、ファイル$parts[1]の内容を$parts[0]という名前でスペシャルスキンパーツに追加してしまうっていうのは、どうでしょうか。

オフライン

#7 2007-05-19 09:51:32

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

Re: 3.3のスペシャルスキンパーツをスキン部品に使うincludespecial

Katsumi さんの発言:

$handler->parse_parsedinclude($parts[1]); の後で自動的に、ファイル$parts[1]の内容を$parts[0]という名前でスペシャルスキンパーツに追加してしまうっていうのは、どうでしょうか。

このあたりも,今後これをコアに入れていくかどうか次第かと思っています。コアに入れるならなるべく余分な機能は付けない方がいいと思います。

オフライン

#8 2007-05-19 10:51:32

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: 3.3のスペシャルスキンパーツをスキン部品に使うincludespecial

Andy さんの発言:

コアに入れるならなるべく余分な機能は付けない方がいいと思います。

そうですね。コアに入るまでの間、このプラグインがインストールされている場合とされていない場合の両方に関して、スキンの側でどういった対応が出来るか、少し考えてみます。

オフライン

#9 2007-12-24 00:36:19

yu
メンバー
From: 神奈川
登録日: 2003-11-15
投稿: 718
ウェブサイト

Re: 3.3のスペシャルスキンパーツをスキン部品に使うincludespecial

使っていてひとつ見つけました。

44行目付近:

$handler =& new ACTIONS($skinType, $skin);

$type → $skinType に修正、で、if(skintype) が正しく効くようになります。


Nucleusだとか
http://nucleus.datoka.jp/

オフライン

#10 2008-10-14 19:07:36

yu
メンバー
From: 神奈川
登録日: 2003-11-15
投稿: 718
ウェブサイト

Re: 3.3のスペシャルスキンパーツをスキン部品に使うincludespecial

「エラー」スキンタイプで$skinidがセットされないことがあったので
その部分を修正してみました。

<?php

class NP_includespecial extends NucleusPlugin {

	var $level;
	
	function getName()       { return 'Include Special'; }
	function getAuthor()     { return 'Andy'; }
	function getURL()        { return ''; }
	function getVersion()    { return '0.3'; }
	function getDescription() { return 'include a special skin part and, parse it';   }

	function supportsFeature($what) {
		switch($what)
		{ case 'SqlTablePrefix':
			return 1;
			default:
			return 0; }
	}
	
	function init() {
		$this->level = 0;
	}

		
	function doSkinVar($skinType, $partsname) {
		global $skinid, $blogid, $CONF, $manager;

		if ($this->level > 3) return;
		
		if (!$skinid) {
			if (!$blogid) $blogid = $CONF['DefaultBlog'];
			$blog =& $manager->getBlog($blogid);
			$skinid = $blog->getDefaultSkin();
		}
		$skin = new SKIN($skinid);

		if (!$skin->isValid) {
			return;
		}
		
		$parts = explode('|', $partsname, 2);

		$actions = $skin->getAllowedActionsForType($skinType);

		// set IncludeMode properties of parser
		PARSER::setProperty('IncludeMode',$skin->getIncludeMode());
		PARSER::setProperty('IncludePrefix',$skin->getIncludePrefix());
		
		$handler =& new ACTIONS($skinType, $skin);
		$parser =& new PARSER($actions, $handler);
		$handler->setParser($parser);
		$handler->setSkin($skin);

		if (($contents = $skin->getContent($parts[0]))) {
			$this->level++;

			$parser->parse($contents);

			$this->level--;
		} else {
			$handler->parse_parsedinclude($parts[1]);
		}

	}

}
?>

Nucleusだとか
http://nucleus.datoka.jp/

オフライン

Board footer