PHP

  • OpenPNEでは、ページのデザインと,ロジックのコーディングを分離する目的で、SmartyというPHPプログラムのテンプレートエンジンを使用しています。
    Smartyを使用していることにより、アプリケーションのロジックが分からない人でも、ある程度のHTMLの知識があれば、OpenPNEのレイアウトを変更(カスタマイズ)することができます。

    具体例を示しながら、実際に進めていく手順を説明

    レイアウトを修正したいページを表示させるURLが以下の場合
    http://iphone-sns.com/?m=pc&a=page_fh_diary&target_c_diary_id=2

    レイアウトテンプレートの場所は
    (config.phpがあるディレクトリ名)/webapp/modules/pc/templates/
    ディレクトリ内にある、
    fh_diary.tpl
    となる。
    これに習えば、修正・レイアウト変更・カスタマイズしたいページの引数の文字を見れば、他のテンプレート名が分かる。

    さて、一番簡単なのは、このテンプレートファイルをFTP等でダウンロードし、エディターで修正し、再びアップロードすれば良いのだが、修正に失敗したりした場合や、元に戻したい時に問題がある。

    OpenPNEは、その点も良く考えられており、
    ・webapp
    ・webapp_ext
    という二つのディレクトリが用意されている。

    先ほどダウンロードしたテンプレートファイルはwebappにあったものだが、修正したテンプレートファイルをアップする場所を元の場所では無く、webapp_ext内にあるtemplatesの中にアップする。
    OpenPNEは、webapp_extに同ディレクトリ同名のファイルが存在した場合、webapp_ext内にあるファイルの方が処理される。

    このことにより、元のテンプレートファイルをそのままにして、レイアウトの修正・カスタマイズが可能となる。
    修正に失敗したり、レイアウトが崩れてしまったりしたら、webapp_ext内のテンプレートファイルを削除してしまえば、デフォルトのテンプレートファイルを読み込み表示される。

    なお、このwebapp_extの機能を使いたい場合は、config.phpを開き

    ///
    // webapp_ext ディレクトリ使用設定
    ///

    define(‘USE_EXT_DIR’, false);

    define(‘USE_EXT_DIR’, true);

    falseをtrueにする。

    これをしないと、webapp_extを使用しないので注意。

  • OpnePNEをiPhone対応にする方法

    ·

    OpenPNEは今のところiPhoneからのアクセスには配慮されていないため、iPhoneでOpenPNEを使ったSNSを利用するのはとても不便です。

    ■iPhoneからからOpenPNEを利用した場合の問題点

    1.OpenPNEへのログインページを含めページが縮小されていて見難い(拡大する必要がある)
    2.携帯版のOpenPNEの利用しようとした場合、キャリア制限で携帯版ページは表示されない。
    3.OpnePNEではiPhoneの固有メールアドレス@i.softbank.jpはOpenPNEにおいては携帯として登録できない。
    4.日記に画像がアップできない。
    5.プロフに画像がアップできない。
    6.コミュニティに画像がアップできない。

    他にも「不便」といった部分を含めると数多くあります。

    そこで、OpenPNEを使ったSNSでiPhoneユーザーを考えた場合にいくつかの方法が考えられます。

    ■OpnePNEをiPhone対応にする方法

    1.iPhone専用のSNSにする
    2.PC版のレイアウトをiPhone対応にする
    3.携帯版のレイアウトをiPhone対応にする

    1.のiPhone専用のSNSにする場合はCSS(スタイルシート)のカスタマイズ、及びsmarty用tpl(テンプレートファイル)のカスタマイズをすることで快適なレイアウトにすることが可能となります。
    デジタルゲートが運営する『iPhoneStyle』(http://iphone-sns.com/)はiPhoneオーナー専用SNSという特化したSNSであるためこの方法で構築しています。

    2.OpenPNEのPC版のレイアウトをiPhone対応にする場合、ユーザーエージェントを取得して(Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5A345 Safari/525.20)といった文字列からiPhoneであることを識別し、専用のCSSで表示させます。
    この場合、PCと共存させるためtpl(テンプレートファイル)のカスタマイズはしない方が楽です。
    この方法は携帯ユーザーは何も変わらないため、導入しやすい方法とも言えます。

    3.PC版は標準のままOpenPNEの携帯版をiPhone対応にする
    この方法は一般携帯からのユーザーが不便になるだけでなく、構築方法によっては通常のPCユーザーからのメールによる日記投稿が不可能に場合があるため、デメリットの方が多いと思われます。

    さて、表示(閲覧)には上記方法で対応できますが、「1.iPhone専用のSNSにする」および「2.OpenPNEのPC版のレイアウトをiPhone対応にする」どちらにも共通する問題としてiPhoneからフォームを使った画像のアップロードはできないということがあります。
    これは現行のiPhoneの仕様としてローカルファイルへのアクセスが出来ないこと、フォームの利用を制限していることなので、iPhoneの仕様が変わるまで解決しません。
    また、同じく仕様により、iPhoneではPCのメールソフトや携帯のメーラーでは普通に存在する「画像の貼付」が存在しません。
    そのため唯一の方法として「写真」アプリから画像付きのメールを作成できることを利用してOpenPNEにiPhoneから画像付きの日記を投稿すること、プロフィール用画像をiPhoneから設定する方法が考えられます。
    ただし、OpenPNE標準ではメールでの画像アップは「携帯」と決まっているので、別途のスクリプト(プログラム)を用意する必要があります。
    プログラムに必要なのはユーザー情報の取得からユーザー認証、日記のデータベースへの書き込み
    処理となります。現行のiPhoneではコピー&ペーストができないため、送信アドレスにも配慮する必要があります。『iPhoneStyle』(http://iphone-sns.com/)では、iPhoneからメールで画像をアップする専用のプログラムを組み込み、iPhone本体から直接メールでの日記の投稿、iPhone本体から直接メールでのプロフ画像の設定・変更を可能としています。

    以上、いずれiPhoneユーザーが増え市場のニーズが高まればOpenPNEもiPhone対応していく可能性がありますが、それまでは運営側の工夫が不可欠です。

  • 処理をしていて発生する、一時ファイル(キャッシュやtempなど)の中で
    定期的に削除が必要なもの、古いユーザーデータやログファイル等を
    削除するためのサンプルスクリプト。

    下記のサンプルスクリプトをファイルとして保存し、1日1回cronで回してやるといい。
    必要に応じて対象のディレクトリ名や削除日数は変更して使用してもらいたい。
    $debug = 1;
    にするとデバッグモードになるから、事前にテストすることをお薦めする。

    なお、このスクリプトはファイルを削除するものであり、設定ミスやバグにより
    大事なファイルを削除してしまうこともありうる。使用は自己責任で。

    【サンプル】

    <?php

    #——————————————————

    $now = time();

    #——————————————————

    $cache_dir = “../cache/”;
    $day = 7;
    $debug = 0;

    $num = clear_cache_file($cache_dir,$day,$debug);
    echo “$num ファイル削除しました。”;

    #——————————————————

    function clear_cache_file($cache_dir,$day,$debug){
        global $now;
        
        $count = 0;
        if(!($dir = @opendir($cache_dir))){die(“$cache_dir が開けません。”);}
        while($file = readdir($dir)){
            if(!is_dir($file)){
                $name = $cache_dir . $file;
                $mtime = filemtime($name);
                if(($now – $mtime) >= $day*60*60*24){
                    if(file_exists($name)){
                        if($debug){
                            $mtime_ymd = date(“Y-m-d H:i:s”, $mtime);
                            echo “$name ($mtime_ymd)を削除します。<br />”;
                        }else{
                            unlink($name);
                        }
                        $count++;
                    }
                }
            }
        }
        closedir($dir);
       
        return $count;
    }

    #——————————————————

    ?>
     

  • GoogleやYahoo!で文字の検索をした時、URLのエリアに意味の分からない暗号のような文字列が表示されます。これは入力された文字列をURLエンコードしたものが含まれているからです。ここではURLエンコードされた文字列に何が書いてあるのか、どんな意味かを調べたい人のために、 Web上でURLデコードやURLエンコードが簡単にできるサービスを提供しています。

    URLエンコード・URLデコード変換サービス

    http://decode.digital-gate.com/

  • ちょっとした仲間内での写真公開やポートフォリオにも使えるAutoGeneratingGallery。
    使い方は簡単で、FTPでimagesフォルダーに画像を放り込んであげるだけでいい。

    用意するのは、通常サイズとサムネール用の小さなサイズの画像。
    名前のルールは、
    IMG_0813-thumb.jpg
    IMG_0813.jpg
    といった感じ。

    CSSで簡単にデザインの変更も可能だから、PHPは苦手だけれど、デザインにはこだわりたいという人にもお薦め。

    AutoGeneratingGallery

  • 以前、Mail_Queueを使ってメールを送る時、本文内の特定の文字から文字化けすることがあると書いたが、同様にメールのタイトル(Subject)が文字化けすることがある。

    本文同様、きちんとコード変換して渡しているのに文字化けする場合、Mail_Queue のBody.phpが原因になっていることがある。

    具体的には、Mail/Queue/Body.phpの284行目あたりにある(前回のちょっと上)
    function getHeaders()
    ここのstripslashesを外す。

    $tmp_headers[$key] = stripslashes($value);

    となっている行を

    $tmp_headers[$key] = $value;

    としてやるだけでいい。

    タイトルの文字化けで悩んだ時はお試しを。

  • Mail_Queueで文字化けするとき

    ·

    Mail_Queueを使ってメールを送る時、特定の文字から文字化けすることがある。

    きちんとコード変換して渡しているのに文字化けする場合、Mail_Queue のBody.phpが原因になっていることがある。

    具体的には、Mail/Queue/Body.phpの300行目あたりにある
    function getBody()
    ここのstripslashesを外す。

    return stripslashes($this->body);

    となっている行を

    return $this->body;

    としてやるだけでいい。

    文字化けで悩んだ時はお試しを。

  • qolplus.gif

    Digital Gateで運営している、車椅子やバギー、福祉製品を選ぶためのクチコミ情報&製品比較サイト『QOL+(Quality of Life Plus)』では「快適性」「耐久性」「価格」「操作性」「デザイン」の5つの項目のクチコミ評価をグラフで表示させている。

    使用しているライブラリは以前紹介した『PHP/SWF Charts』

    設定は折れ線グラフや棒グラフと同様

    $chart[‘chart_type’] = “polar”;

    としてやるだけでいい。

  • データセットの方法

    $Dataset =& Image_Graph::factory('random', array(31, 0, 10, false));

    ランダム発生

    $img_text = mb_convert_encoding('とあるサイト',"UTF-8","euc");
    $Dataset->setName($img_text);

    凡例

    $Line =& Image_Graph::factory('Image_Graph_Line_Solid', "red");

    線グラフの線オブジェクトを生成(赤い実線)

    Line->setThickness(1);

    線の太さ1ピクセル

    $Marker =& Image_Graph::factory('Image_Graph_Marker_Array');

    マーカーオブジェクト(線上の印)

    $BoxMarker =& Image_Graph::factory('Image_Graph_Marker_Box');

    マーカー生成

    $BoxMarker->setSize(3);

    マーカー/サイズ

    $BoxMarker->setLineColor("red");

    マーカー/枠色

    $BoxMarker->setFillColor("red");

    マーカー/中色

    $Marker->add($BoxMarker);
    $Plot =& $Plotarea->addNew('line', array(&$Dataset));

    エリアにラインとして描画

    $Plot->setLineStyle($Line);

    線のスタイルは上の設定($Line)

    $Plot->setMarker($Marker);

    $Markerオブジェクトをセット。

    別の方法

    $Dataset2 =& Image_Graph::factory('dataset');
    $Dataset2->addPoint('1', 3);
    $Dataset2->addPoint('2', 10);
    $Dataset2->addPoint('3', 12);
    $Dataset2->addPoint('4', 10);
    $Dataset2->addPoint('5', 15);
    $Dataset2->addPoint('6', 16);
    $Dataset2->addPoint('7', 20);
    $Dataset2->addPoint('8', 15);
    $Dataset2->addPoint('9', 9);
    $Dataset2->addPoint('10', 16);

    データを作成

    $img_text = mb_convert_encoding('別のサイト',"UTF-8","euc");
    $Dataset2->setName($img_text);

    凡例

    $Line2 =& Image_Graph::factory('Image_Graph_Line_Solid', "blue");

    線グラフの線オブジェクトを生成(青い実線)

    $Line2->setThickness(1);

    線の太さ1ピクセル

    $Plot2 =& $Plotarea->addNew('line', array(&$Dataset2));

    エリアにラインとして描画

    $Plot2->setLineStyle($Line2);

     

  • PEARのライブラリを使うと折れ線グラフも簡単に作ることができる。

    使い方は簡単。

    require_once 'Image/Graph.php';

    ライブラリ読み込み

    $w = 600;
    $h = 300;

    画像サイズを設定

    $Graph =& Image_Graph::factory('graph', array($w, $h));

    これがキャンバスになる

    ■日本語フォントを使いたい時は、フリーの日本語フォントをサーバー上に置いて指定する。

    $Font =& $Graph->addNew('font', '../../font/ipam.ttf');

    フォントオブジェクトを作成

    $Font->setSize(10);

    フォントサイズも指定できる(10ピクセル)

    $Graph->setFont($Font);

    キャンバスにフォントを適用

    ■タイトルとグラフを作成するエリアを設定

    $img_text = mb_convert_encoding('日別推移',"UTF-8","euc");

    日本語を使う時はUTF-8にするのがポイント

    コンバートしてあげればいい

    $Graph->add(
        Image_Graph::vertical(
            Image_Graph::factory('title', array($img_text, 12)),
            タイトルエリアは上グラフ関連エリア下
            文字サイズ12ピクセル
            Image_Graph::vertical(
    
            $Plotarea = Image_Graph::factory('plotarea'),
            グラフエリアは上
    
            $Legend = Image_Graph::factory('legend'),
            凡例エリアは下
    
             90
             グラフの占める縦のパーセンテージ
            ),
            20
            タイトルが占める縦のパーセンテージ
        )
    );
    $Plotarea->setPadding(array("top"=>1,"right"=>2,"bottom"=>2,"left"=>2));

    グラフ描画エリアのpadding設定はこんな感じ

    $Legend->setPlotarea($Plotarea);

    データと凡例の関係付け

    $Legend->setPadding(0);

    Legend の padding

    $Plotarea->setFillColor('gray@0.05');

    グラフエリアの背景色/透明度

    $GridY =& $Plotarea->addNew('line_grid', null, IMAGE_GRAPH_AXIS_Y);
    $GridY->setLineColor('gray@0.1');
    $GridX =& $Plotarea->addNew('bar_grid', null, IMAGE_GRAPH_AXIS_X);
    $GridX->setLineColor('gray@0.1');

    升目のグリッド指定

    サンプル

    http://digital-gate.com/graph/image_graph.php