minihakuでのアカウント情報表示

2007/08/23 | XOOPS

minihakuでは、アクセスがあったURLから、アカウント登録、アカウント編集、アカウント情報表示の場合だけプログラムを乗っ取り(hookし)、minihaku/include内の各スクリプトへその動作を流すよう設計されている。しかしアカウント情報表示の場合に限っては、hookはしているものの実際には何もしていない(アカウント情報表示は結局はXoops本来のものを使用していて、minihakuでは何もしていない)。これではきっと後継版を作るのに都合が悪いだろうと思い、アカウント情報表示もminihaku内で動作するようスクリプトとテンプレートを追加した。実際の作業は以下のとおり。

(1) テンプレートマネージャーから「system_userform.html」をダウンロードし、minihaku_userinfo.htmlとリネームしてminihakuモジュール内のテンプレートディレクトリに配置。
(2) xoops_version.phpのテンプレートの設定で、上記を追加。
(3) Xoopsのルートディレクトリにあるuserinfo.phpの中身を丸ごとコピーして、minihaku/include/userinfohook.phpペースト。ただし、テンプレートの指定を(1)で指定したテンプレートに変更しておく。
(4) minihakuモジュールのアップデート。

これでOK。minihaku内でアカウント情報表示プログラムも乗っ取ることが出来た。

白扇・ミニ白後継モジュールのその後

2007/08/22 | XOOPS

Xoops Cubeのリリース時に白扇後継モジュール開発を継続しようかどうか迷ってはいたが、依然としてその野望(?)は消えていない。Cubeでのユーザ関連機能のモジュール化に伴い、おそらく仕様ががらっと変わっているとは思うが、これまで蓄積した知識をこれからも利用したいので、いちおう開発は続けている(といってもまだ検証中だが)。
今回「物は試し」ということで、minihakuを実際にxoopsに組み込んでみた。といっても追加項目を設定したわけではなく、必要最低限な項目に限って登録・編集できるようにしてみた。
実際にしてみた作業は簡単。minihakuのconfig.php内にデフォルトで記入されている項目を全てコメントアウトし、テンプレートで記述されている不要な項目についても全てコメントアウトしてみた。実際の処理ルーチンには手を入れなかったが、これだけで対応できた(ログインID、メールアドレス、パスワードだけにしてみた)。
ここまでやってみてわかったこと。ユーザ情報の登録・編集の各機能はminihakuで用意されているが、ユーザ情報参照機能はXoops標準の機能を利用しているのだが、これは違和感がある。やはり入力した内容に応じた情報が表示されないと・・・。幸い、プログラムを組み込む余地だけは残してあるようなので、おいおい組み込んでみることにする。
実際にminihakuを組み込むことで、後継モジュール作成の基盤がずいぶん明確になったような気がする。ただ、のんびり作っていくことにした。

文字コードUTF-8で、BOMの有無による問題

Xoopsのモジュールを書いていて、すごく悩ましい問題に出くわした。
テンプレートを2つ(それぞれ仮にAとBと呼ぶことにする)用意したのだが、同じようなタグしか記述していないのに、どうしても片方で余白ができてしまう。原因を突き止めるためにテンプレートの中身を最低限の内容にしてみた。

テンプレートAの中身
<div>A</div>

テンプレートBの中身
<div>B</div>

しかしこれでも片方で余白が出来てしまう。これはスタイルシートとかタグレベルの問題ではないことは明白だ。では何がそうさせるのか。
答えは「UTFのBOM」でした。

最近は文字コードとしてUTF-8を使用するようにしている。テキストエディタとしてEmEditorを愛用しているのだが、UTF-8でもBOMの有無を設定できるようになっている。
BOMとはUTF-16で必要となる「ビット列の並び」を示す符号のようなものだ(検索したらそう書いてあった)。本来UTF-8では必要ないはずなのだが、UTFで書かれているということを示すためだけにBOMがつけられるとのことだった。

前述の問題は片方のテンプレートがBOM付きで保存されていたことが問題で、BOMをとって保存すると余白なく表示されることを確認できた。
いずれにしても文字コードは、問題を引き起こす原因の一つであることは間違いないようだ。

マルチバイト関数には文字コード指定

2007/08/15 | マイPHPメモ

今まで使ってたプログラムを別の環境に移設したら正しく動作しなくなった、というのはよくある話だ。今回マルチバイト文字を切ったり張ったりするプログラムを別の場所に移植しようとしたら全然動かなかった。

「正しく(予期したとおりに)動かない」というのには何らかの理由があるはずだ。

PHPには日本語(マルチバイト文字)を扱うための関数群(マルチバイト関数)がある。今回はこの関数が、期待する動作をしてくれなかったために発生してしまったようだ。「マルチバイト関数が期待通りの動作をしない」という場合、大抵は正しく文字コードを認識していないことに起因する。今回もそのとおり、文字コードを正しく認識していなかったようだ。

では、正しく認識させる方法。これには二つある(と思う)。
(1) 設定でプログラムの文字コードを指定しておく。
 要は「スクリプトのエンコーディングが何なのか」ということをphp.ini、.htaccessなどで指定しておくことだ。
(2) マルチバイト関数の引数で文字コードを渡す。
 mb_で始まる関数は大抵その引数で、文字コードを指定して渡すことが出来るので、正しい文字コードを指定しておく。

この2点。
ちょっと頭の片隅に入れておく。

extract — 配列から変数を生成

2007/08/14 | マイPHPメモ

プログラムを書くのになるべく注意していることがいくつかある。第一は可読性だ。あとで見直したときに「何書いたんだっけ」ということになるとメンテナンスできない。第二に「短いプログラム」を心がけている。長いプログラムは正直言って、後で読む気がなくなるからだ。
プログラムを短縮するのに便利な関数を一つ。「extract」を便利に使っている。この関数は連想配列から、キーを変数名として配列を複数の数の変数に展開してくれる関数だ。例えばこんな風に使う。

$myArray=array(‘id’=>1,’name’=>’php’);
extract($myArray);

これで$id=1、$name=’php’という二つの変数が出来上がる。ただしこれだと既に$idとか$nameといった変数があった場合に上書きされてしまうが、第二引数、第三引数を指定することで挙動にバリエーションを持たせられる。
例えば以下のように指定する。

$id=10;
$myArray=array(‘id’=>1,’name’=>’php’);
extract($myArray,EXTR_PREFIX_SAME,’new’);

このように記述すると$id=10、$name=’php’、$new_id=1という具合に、上書きしないよう衝突してしまった変数名にのみprefixをつけてくれる。挙動のオプションはいろいろ選べる。

EXTR_OVERWRITE
EXTR_SKIP
EXTR_PREFIX_SAME
EXTR_PREFIX_ALL
EXTR_PREFIX_INVALID
EXTR_IF_EXISTS
EXTR_PREFIX_IF_EXISTS
EXTR_REFS

上書きしたり、常にprefixをつけたりするなど、読んで字のごとくだ。見逃しやすい関数に思えるのでメモしておくことにした。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net