プログラミング工房
TOP
Flex基本
開発環境 JavaScript連携 PHP連携1 PHP連携2(AMFPHP) ウィンドウ ボタンスキン 矩形スキン ローカルファイル(テキスト) F5等の対策 ローカルファイル(イメージ) ダウンロード、アップロード 1枚の画像のカラーを変更 時間のかかる計算処理 外部SWFの読込み
Flexで3D
Flexだけで3D Papervision3Dを使ってみる 3Dオブジェクト カメラ、前後判定の工夫しました 自由な形状を作成
Flexでクラス
Class1(白黒ゲームの盤) Class2(白黒ゲームのプレイヤー) Class3(プレイヤーを外部SWF)
PHP
共通関数1
Flexの作品
お問合せの説明 サンプルのソース表示の説明 分子構造の表示(PDBファイル) マンデルブロ集合の画像作成 swf参加型白黒ゲーム(Reversi) ストップウォッチ WEB素材
AIR
AIRを使ってみる ソースファイルのHTML変換を作る
etc.
マンデルブロ集合のギャラリー ジュリア集合のギャラリー wonderflを使ってみました お問合せ

PHP5-共通関数1

■2011.03.08:作成
サンプル サンプルのソース

相対パスからURL付き絶対パスを求める。

 FlexのswfファイルとPHPのファイルが同じディレクトリでない場合、PHPで求めたファイルの
パスが相対パスならば、そのままではFlexのから使用することが出来ない。
 swfとPHPを同じディレクトリに置く事も出来るが、分けたほうが管理しやすい。
またパス指定をURL付きの絶対パスで指定することも出来るが、開発環境(http://localhost)
から本番環境(http://programmingatelier.net)に移すときの修正忘れが怖い。

 PHPで相対パスからURL付き絶対パスを求める関数があればよいのですが、PHPにはその機能が
無いようなので、作成しました。

実行結果は以下の様になります。
 実行PHPは「http://localhost/php5/fnc1/index.php」
  指定相対パスが無くても論理的に求めています。
  例の"../../../test.html"はルートディレクトリの一つ上のディレクトリになるので
     エラー""を返します。
/test.html -> http://localhost/test.html
./test.html -> http://localhost/php5/fnc1/test.html
../test.html -> http://localhost/php5/test.html
../../test.html -> http://localhost/test.html
../../../test.html ->
test.html -> http://localhost/php5/fnc1/test.html

関数fncPath2url($path)の説明
 $strHostにサーバ名「http://localhost」を求める
 $strPhpPasに実行PHPパス「/php5/fnc1」を求める
 相対パスが「/」で始まるときは
  URLのルートにあると判断します。
 相対パスが「./」で始まるときは
  実行PHPと同じディレクトリにあります。
 相対パスが「../」で始まるときは以下の様に求めます
  「../../」を考慮して再起関数「fncRePas2url」で「../」が無くなるまで処理します。
    相対パスの頭の「../」を削除し実行PHPパス「/php5/fnc1」->「/php5」にします。
 相対パスがそれ以外で始まるときは
  実行PHPと同じディレクトリにあります。
//相対パスを絶対パスにする
// $path:相対パス(./test.html)
// 戻り値:絶対パス(http://localhost/php5/fnc1/test.html)
//         (="":エラー)
function fncPath2url($path) {
    $strUrl = "";
    
    // サーバ"http://localhost"
    $strHost = "http://".$_SERVER['HTTP_HOST'];
    // 実行PHPパス/php5/fnc1/index.php->/php5/fnc1
    $strPhpPas = dirname($_SERVER['PHP_SELF']);

    if (strpos($path, "/") === 0) {
        // $path="/test.html"
        // "http://localhost/test.html"
        $strUrl=$strHost.$path;
    }
    elseif(strpos($path, './') === 0) {   
        // $path="./test.html"
        // "http://localhost/php5/fnc1/test.html"
        $strUrl=$strHost.$strPhpPas.substr($path,1);
    }
    elseif(strpos($path, "../") === 0) {
        // $path="../test.html"
        // "http://localhost/php5/test.html"
        $strUrl=fncRePas2url($strPhpPas,$path);
        //$strUrl=""はエラー
        if($strUrl!="") {$strUrl=$strHost.$strUrl;}
    }
    else {
        // $path="test.html"
        // "http://localhost/php5/fnc1/test.html"
        $strUrl=$strHost.$strPhpPas."/".$path;
    }
    return $strUrl;
}
//相対パスを絶対パスにする内部関数(再起関数)
// $InPhpPas:処理中のパス
// $InPath:"../../test.html"の絶対パス
// 戻り値:絶対パス(="":エラー)
function fncRePas2url($InPhpPas, $InPath) {
    $path=substr($InPath,3);    //頭の"../"をとる
    $poin=strrpos($InPhpPas,"/");
    if($poin===false) {
        return "";  //エラー
    }
    if(strpos($path, "../") === 0) {
        if($poin==0) {return "";} //エラー
        return fncRePas2url(substr($InPhpPas,0,$poin), $path);
    }
    return substr($InPhpPas,0,$poin)."/".$path;
}

ディレクトリ構成(XML)を求める

Flexの「Tree」で利用できるようなディレクトリ構成(XML)をPHPで求めます。

「label」は「Tree」に表示用のパスなしのファイル名
「file」はFlexで処理するためのURL付き絶対パス(ディレクトリでは"")
<?xml version="1.0"?>
<root label="root">
  <dir label="fnc1" file="">
    <dir label="fnc1.php" file="http://localhost/php5/fnc1/fnc1.php"/>
    <dir label="index.php" file="http://localhost/php5/fnc1/index.php"/>
  </dir>
</root>

fncDirTrr関数  「root」タグを作ったら再起関数「fncReDir」をコール

fncReDir関数
 指定ディレクトリの直下のディレクトリ、ファイルでループ
  直下のディレクトリに対して以下の処理を行う
    「dir」タグを作ってディレクトリ名をセット
    再起関数「fncReDir」をコール
  直下のファイルに対して以下の処理を行う
    「dir」タグを作ってファイル名をセット
    URL付き絶対パスをセット(fncPath2url関数を使用)
//ディレクトリ構成をXMLで求める
// $path:ディレクトリ構成を求めるパス
// 戻り値:ディレクトリ構成XML
function fncDirTrr($path) {
    $dom = new DomDocument('1.0');
    //add root 
    $eRoot = $dom->appendChild($dom->createElement('root')); 
    $eRoot->setAttribute("label", "root");
    fncReDir($dom,$eRoot,$path);
    return $dom;
}
//ディレクトリ構成をXMLで求める内部関数(再起関数)
// $dom:XML全体
// $elem:サブディレクトリ構成を追加するエレメント
// $path:サブディレクトリ構成を求めるパス
function fncReDir($dom,$elem,$path) {
    //ディレクトリの中身を取得する
    $filelist = scandir($path);
    foreach($filelist as $value) {
        if ($value != "." and $value != "..") {
            if (is_dir($path ."/" . $value)) {
                $eDirRM = $elem->appendChild($dom->createElement('dir'));
                $eDirRM->setAttribute("label", $value);
                $eDirRM->setAttribute("file", "");
                fncReDir($dom,$eDirRM,$path ."/" . $value);
            }
            elseif (is_file($path  ."/" . $value)) {
                $eDirRM = $elem->appendChild($dom->createElement('dir'));
                $eDirRM->setAttribute("label", $value);
                $eDirRM->setAttribute("file", fncPath2url($path ."/" . $value));
            }
        }
    }
}

プログラミング工房