pluginoptionクラス
2008年2月9日
プラグインオプションの値は、plugionoptionクラスのオブジェクトに保持させることにした。
pluginクラス内にて、
もしくは、
のように使う。
pluginoptionクラスは、pluginクラスと同じ、plugin.phpファイルに記述してある。これは、プラグインオプションなしでプラグインクラスを使用するケースはほとんど無いと考えられるため。
pluginクラス内にて、
$this->option=new pluginoption($this->id);
もしくは、
public function blogoption($bid){
$obj=new pluginoption($this->id,'blog',$bid);
return $obj;
}のように使う。
pluginoptionクラスは、pluginクラスと同じ、plugin.phpファイルに記述してある。これは、プラグインオプションなしでプラグインクラスを使用するケースはほとんど無いと考えられるため。
final class pluginoption {
static private $data=array();
static private $num=0;
private $_jeans_oids,$_jeans_cid; // option-ids, context-id
public function __construct($pid,$type='global',$cid=0){
$this->_jeans_cid=$cid;
$this->_jeans_oids=$oids=self::_jeans_oid($pid,$type);
foreach($oids as &$row){
$oname=$row['oname'];
$this->$oname=$row['odef']; // Set default value
}
sql::unbuffered_query(
'SELECT oid,ovalue FROM jeans_plugin_option '.
'WHERE ocontextid=<%1%> AND oid IN (<%2:key%>)',
array($cid,$oids));
while($row=sql::fetch_assoc()){
$oname=$oids[$row['oid']]['oname'];
$this->$oname=$row['ovalue']; // Set value from SQL table
$data[$row['oid']][$cid]=$row['ovalue']; // Keep a copy
}
self::$num++;
}
public function __destruct(){
$cid=$this->_jeans_cid;
$oids=$this->_jeans_oids;
foreach($oids as $oid=>&$row){
$oname=$row['oname'];
if (self::$data[$oid][$cid]==$this->$oname) unset(self::$data[$oid][$cid]);
}
if (--self::$num) return;
// Save plugin options here.
sql::query('BEGIN');
foreach(self::$data as $oid=>&$options){
foreach($options as $cid=>&$value){
sql::query(
'DELETE FROM jeans_plugion_option '.
'WHERE oid=<%1%> AND ocontextid=<%2%>',
array($oid,$cid));
sql::query(
'INSERT INTO jeans_plugion_option (oid,ocontextid,ovalue) '.
'VALUES (<%1%>,<%2%>,<%3%>)',
array($oid,$cid,$value));
}
}
sql::query('COMMIT');
}
private static function _jeans_oid($pid,$type){
static $data;
if (!isset($data)) {
sql::unbuffered_query('SELECT oid, opid, oname, ocontext, odef FROM jeans_plugin_option_desc');
while($row=sql::fetch_assoc()) $data[$row['opid']][$row['ocontext']][$row['oid']]=$row;
}
return $data[$pid][$type];
}
}