ドコモ携帯でXHTML(php+smarty)を利用する

Docomo携帯でXHTML(php+smarty)を利用するために、.htaccessにAddType application/xhtml+xml .phpを記述する。が、そうするとphp自体が動作せずにIEだとダウンロード、Firefoxだとエラー表示になる。かといってtext/htmlに戻せばphpは動作するがそれでは本末転倒。

少し考えたら変な勘違いをしていたことに気が付く。そもそもphpを実行するのはサーバーであって、コンテンツヘッダを気にするのはブラウザなのだから、phpでの処理が終わった後にその結果をコンテンツヘッダを設定してからブラウザ側に送り出してあげれば良いので、header関数を利用してsmartyのdisplay関数の直前に次のように書いたら上手くいっている様子。考えてみれば当たり前だなあとは思うんですけど、なかなか・・・

header("Content-Type: application/xhtml+xml; charset=Shift_JIS");

quickformでregisterRule()をするとき。

quickformでregisterRule()をするときに、オブジェクト内のメソッドを利用するにはメソッド名の後ろにオブジェクトを指定すると良いらしいです(PHP5では参照指定は必要ないようです)。

しばし悩みました。。。

registerRule("ルール名称", "callback", "メソッド名", &$オブジェクト);

ですので、良くあるメールアドレスチェックでは次のように。

function checkForm(){
$this -> _form->registerRule('checkmail', 'callback', 'checkEmail', &$this);
$this -> _form->addRule('email', 'メールアドレスではありません。', 'checkmail');
}
function checkEMail(){
//チェック関数
}

Zend Framework

ZendFrameworkを導入してみました。主要な機能が全てコンポーネント化されており、必要なときに必要なファイルを読み込むだけで利用することができます。フレームワークだけありファイル名やクラス名の命名規則や処理の流れを理解するのに少し時間がかかりますが(「hello world!」一つとっても、いくつかのステップを経なければ動きもしない!)、それさえ理解してしまえばあとは流れに乗って開発を進められそうです。

これまでは、ゼロから作るのには心許なく、しかしCMSを利用するには機能的に中途半端、といった案件に対しても、いずれかの方法を強引に採用してきました。しかし、このフレームワークを利用することによりそのジレンマが少しは解決しそうです。

imagicを利用して画像のサムネイルを作成する。

imagicを利用して画像のサムネイルを作成する。

$old = 'path/to/old.jpg';
$new = 'path/to/new.jpg';
$x = 200;
$y = 200;
$ext = 'jpg';
makeThumbnail($old, $new, $x, $y, $ext) ;
function makeThumbnail($old, $new, $x, $y, $ext) {
$im = new Imagick($old);
$im->cropThumbnailImage($x, $y);
$im->setImageFormat($ext);
$success = $im->writeImage($new);
$im->destroy();
if($success){
return true;
}
}

iモードIDを取得する

2008年4月からドコモが提供しているiモードIDをPHPで受け取ってみる。コード自体は非常に簡単で、$_SERVERの中の拡張ヘッダであるHTTP_X_DCMGUIDから受け取ることができます。

なお、iモードIDの取得については、取得コードが含まれるアドレスにguid=ONというパラメータが必要になります。

例:getdcmguid.php?guid=ON

function getDcmguid(){
$dcmguid = $_SERVER['HTTP_X_DCMGUID'];
}

このiモードID、個体識別のためには非常に使えるのですが、ただ一つの難点はSSL環境ではiモードIDをはき出してくれないこと。会員認証関係はSSLを利用するサイトが多いと思われるのになぜなんでしょう?

配列のキーの文字コードを変換する。

汎用フォームなどを作成する場合に、formのname属性を日本語にする場合がある。それだけであれば問題ないのだが、PC、携帯の両方から、つまり文字コードがutf8とsjisであったりすると困る。

いろいろ悩んだあげく、配列をキーと値に一旦分割し、それぞれ文字コード変換をしてから再び結合するという力業でなんとかなった。ただし1次元配列の場合だけだけど。

$to = 'utf8';
$from = 'sjis';
$arg = array('配列1'=>'値1', '配列2'=>'値2', '配列3'=>'値3');//sjisでPOSTされる配列。
cnvertEncoding($to, $from, $arg);
function cnvertEncoding($to, $from, $arg){
if(is_array($arg)){
$a = array_keys($arg);
$b = array_values($arg);
mb_convert_variables($to, $from, $a);
mb_convert_variables($to, $from, $b);
return array_combine($a, $b);
}else{
return mb_convert_encoding($arg, $to, $from);
}
}

そもそも、sjisでコーディングすること自体がちょっといやですが・・・

symfonyとsymphony

今更ながらにsymfonyとsymphonyのスペルの違いに気がついた。

「symfony」とばかり普段はタイプしているので、いざ正しい「symphony」をタイプしようとしたときに危ないかも。いや絶対に間違えそう。。。

OpenPNE3.0.1をインストールする。

ようやくリリースされた3.0.1をインストールしてみる。

基本はこちらのインストールガイドに沿って行います。なお、シリーズ3からはsymfonyの事前セットアップが必要。

まずこちらからファイルをダウンロードして解凍します。解凍先は「/公開ディレクトリ/op3/とします。次にテーブルの作成。今回はユーザー名/パスワード/DB名を共に’openpne’としてます。

$mysql -u root -p
mysql> CREATE DATABASE openpne DEFAULT CHARACTER SET utf8;
mysql> grant all privileges on openpne.* to openpne@localhost identified by 'パスワード(openpne)';

次に解凍したフォルダのsymfonyフォルダがあるディレクトリで次のコマンドを実行します。

$./symfony openpne:install

途中でいくつかの質問に答えます。最後に確認をしてOKのはずです。

Choose DBMS (mysql, pgsql or sqlite) <-DBMS名の選択
mysql
Type database username <-DBのユーザー名の選択
openpne
Type database password (optional) <-DB名の選択(オプショナル)
openpne
Type database hostname <-DBホスト名の選択
localhost
Type database name <-DB名の選択
openpne
Type database socket path (optional) <-ソケットパス名の選択(オプショナル)
The DBMS                mysql
The Database Username   openpne
The Database Password   ******
The Database Hostname   localhost
The Database Name       openpne
The Database Socket
Is it OK to start this task? (y/n) <-最終確認
y

インストールが完了したら、下記にアクセスします。

一般ページ
http://***.***.***/op3/web/
管理ページ
http://***.***.***/op3/web/pc_backend.php
id/pwはadmin/password

インストール途中で次の警告がでます。とりあえず動くので調査は保留・・・

Warning: symlink(): ファイルが存在します in /***/***/***/op3/lib/symfony/task/sfFilesystem.class.php on line 224

Maximum execution time of 30 seconds exceeded

phpに重い処理をさせたら次のように怒られた。パフォーマンスチェックなどをしたいけれど、時間がないのでphp.iniの設定を変更した。

Fatal error: Maximum execution time of 30 seconds exceeded in /path/to/hoge.php on line 72

php.iniのmax_execution_timeを大きな秒数に設定する。もしくは0(無制限)にする。このほか、ブラウザのリミットなどにも依存する。

max_execution_time = 180

参考