8月 2010 のブログ記事

先日のオープンソースカンファレンス名古屋2010(以下OSC)でキックオフとなった、
seezoo cms
 
OSCで担当の方とちょっとだけ意気投合したので、
帰宅後触ってみたらconcreat5っぽいのでいいなぁと思ったので、
ぜひ、開発(主にEC用のプラグインになるかと思いますが)に参加したい!
と思ったら、
私が普段メインで使っているクララオンラインの専用サーバーのPHPは
Ver5.1.6なので、要件をみたしてない(T_T)
 
とTwtterで嘆いたところ、公式アカウント
json_encode()だけどうにかできれば、5.1でも使えるとのこと!
ありがたい事に、公式ブログでも対応方法を書いていただけた。
ただ、私はマルチバイトを簡単に扱えて、なおかつ、staticでも使えるJsphonのが好きなので、
こちらで対応した(後述)。
 


というわけで、クララオンラインのサーバーにインストールする手順。
 
1)seezoo公式からシステムDL

2)json_encode()を擬似的に作成

3)インストーラーがPHPのバージョンチェックをしているので、これをスキップ

4) 通常通りインストール
 


 
こちらの記事によると、
CodeIgniterのヘルパー関数に擬似的なjson_encode()を作りましょう!
ってなってるんですが、恥ずかしながらCodeIgniterは名前は知ってたものの、使ったことがない!!
 
というわけで、お手軽実装のほうで。
 
まず、JSONエンコードするライブラリ「Jsphon」をこちらからダウンロードして、
解凍してできた
・Jsphon.php
・Jsphonディレクトリ
をsystem/application/libraries/に置きます。
 
次に、system/application/helpers/seezoo_helper.phpを開いて、一番下に
 

if ( ! function_exists('json_encode') ){

    require_once(APPPATH . 'libraries/Jsphon.php');
    function json_encode($data){
        return Jsphon::encode($data);
    }
}

 
を追記。
これで擬似的にjson_encode関数を作れます。
 
upgrade.phpというものもあります。
こっちを使えば、インクルードするだけで使えそうです。(マルチバイトはどうかな…。未確認)
 


次に、インストーラーのバージョンチェックをスキップします。
 
system/application/controllers/install.phpを開いて
 

$viewdata['php_version'] = version_compare(PHP_VERSION, '5.2.0', '>');

 
とされているところを
 

$viewdata['php_version'] = version_compare(PHP_VERSION, '5.1.0', '>');

 
に変更。

ここまでやったら、あとは、普通にインストーラーを走らせれば、
インストールできました。
 
今日はここまで!
これから使ってみながら、開発にも入り込んでいきます!

Pleskで運用しているドメインについて、
各ドメインの設定画面で、
 

 
↑この赤枠のチェックを外せば、PHPのsafe modeをオフにできますが、
Pleskでsafe modeをオフにしても、open_basedirの設定は残ったままです。
 
PEAR MEDB2では、この設定だけではエラーが発生するケースが考えられます。
  
MDB2.phpのfileExists()内を見ると、
拡張機能や各DBへのドライバファイルの存在をチェックするのに、
safe modeがオフのときは is_readable()でファイルをチェックし、
そうでないときは、fopen()でチェックしているようです。
 
MDB2ではsafe modeオフのときのみ、is_readable()が使えないという前提で設計されていますが、
実際はそれだけでは不十分で、is_readable()はopen_basedirの制約もうけますから、
MDB2.phpのインストール場所などによっては、
safe modeはオフであるけれど、open_basedirの設定が残るPlesk環境下では、エラーが発生してしまいます。
 
解決方法は、2つ。
 
1)vhost.confでopen_basedirをno_valueにする。
クララオンラインサイトに説明がありますので、御覧ください。
http://support.clara.jp/clarafaq/index.php?action=artikel&id=45&artlang=ja
 
2)MDB2.phpを改変してしまう。
MDB2.phpの

    function fileExists($file)
    {
        // safe_mode does notwork with is_readable()
        if (!@ini_get('safe_mode')) {
             $dirs = explode(PATH_SEPARATOR, ini_get('include_path'));
             foreach ($dirs as $dir) {
                 if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) {
                     return true;
                 }
            }
        } else {
            $fp = @fopen($file, 'r', true);
            if (is_resource($fp)) {
                @fclose($fp);
                return true;
            }
        }
        return false;
    }

    function fileExists($file)
    {
        // safe_mode does notwork with is_readable()
        if( false ){
             $dirs = explode(PATH_SEPARATOR, ini_get('include_path'));
             foreach ($dirs as $dir) {
                 if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) {
                     return true;
                 }
            }
        } else {
            $fp = @fopen($file, 'r', true);
            if (is_resource($fp)) {
                @fclose($fp);
                return true;
            }
        }
        return false;
    }

に変更する。
 
2のがお手軽かなー。でも、fopenな上に@でエラー制御してるので、パフォーマンスは落ちます。ご注意を。
 
ま、あれですけど、open_basedirとかの制約を受けてる状態で、積極的にPEARを利用しようとするほうが、技術者としては間違っているかもしれませんが(^-^;

【訂正】
罫線から下の内容間違っていました。
チェックボックスを動的制御するメソッド、見つけました。
 
TreeNodeUIオブジェクト内に「toggleCheck()」というメソッドがあって、これを利用することで、状態変更できます。
 

//ノードの取得
var node = tree.getNodeById('ノードのID');
//ノードUIの取得
var ui = node.getUI();
//チェックする
ui.toggleCheck( true );

toggleCheck()に渡す値をfalseにすればチェックが外れます。
 
TreeNodeUIのリファレンスまでちゃんと読んでいなかった僕のミスでした。。。
すみません。


 
 
Ext.JSのTreePanelにはチェックボックスを付けることができる。(チェックツリーというらしい)

Ext.JS本家のサンプルはこんな感じ→http://www.sencha.com/deploy/dev/examples/tree/check-tree.html
 
で、諸事情から、ここについているチェックボックスのチェックをJSで動的に着け外ししたい。
 
チェックが付いているノード(各要素)を取得できるメソッドは用意されているのに、
チェックを付けるメソッドが標準でない(T_T)
 
仕方ないので、Ext.JSを解析。(これが約1時間の作業。泣)
ノードはtreeNodeオブジェクトとtreeNodeUIオブジェクトから成立していることが分かった。
 
treePanelからtreeNodeを取得するには、getNodeById()を使えば良い。
そしてtreeNodeからtreeNodeUIを取得するには、getUI()を使う。
チェックボックスはtreeNodeUIのcheckboxというメンバで保存されている。
こいつのcheckedプロパティをtrueにしてやれば、できた。
ところが、当たり前だけど、checkboxのプロパティを変更するだけでは、
treeNodeUIのcheckedプロパティは変更されないので、
こちらも合わせて動的変更する必要がある。
 
というわけで、次のように書いた。
 

//ノードの取得
var node = tree.getNodeById('ノードのID');
//ノードUIの取得
var ui = node.getUI();
//チェックボックスにチェックをつける
ui.checkbox.checked = true;
//ノードのcheckedプロパティを変更
node.checked = true;

 
大体こんな感じ。
 
回りくどい。
出来る人はExt.JS自体を改変した方がいいですよー。
(多分PGなら、ここまで分かれば、あとはどこを改変すればいいかわかると思うので割愛)