General

pluginoptionクラス

2008年2月9日

プラグインオプションの値は、plugionoptionクラスのオブジェクトに保持させることにした。

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];
    }
}

コメント

コメントはありません

コメント送信