XOOPSのライブラリの機能だけを流用する方法はないかと見てみたが、
どうもmainfile.phpだけを読み込めば
DB接続から何から行ってくれているようだ。
あとは適当にモジュールのファイルを読み込んで関数を呼んだり、
DB接続クラスを呼び出したりも可能。
フォーラムの最新書き込み呼び出しとかも非常に簡単に
外部で利用することもできた。
XOOPSの外部利用
オリジナルのView
CakePHPではViewにViewというクラスが用いられているが、
これはオーバーライドしたものを利用できる。
例えばSmartyViewを作りたい場合、
app/viewsにsmarty.phpという名前のファイルに
SmartyViewクラスを作成。
クラスの内容自体は関数をオーバーライドして適当に作ればいい。
あとはコントローラで
var $view = ‘Smarty’
と宣言すればいい。
気を付けなればいけないのが、
テンプレートの拡張子にctpもしくはthtmlを利用する場合、
Viewの_render関数をオーバーライドしても
勝手にView::_renderという感じでViewのものを呼び出されてしまう。
なのでテンプレートの拡張子をtplとかに変更するか、
_renderメソッドを呼び出しているところもすべて
オーバーライドする必要がある。
サウンドをループ
flexでサウンドをループする方法。
BGM等に使用したい場合。
あと、主に複数サウンドをならしたい時に
一つのリスナー関数で終わらしたい時の話。
Soundを再生する時、以下のようにチャンネルオブジェクトが出てくる。
その時そのチャンネルオブジェクトにイベントを設定。
var channel:SoundChannel = snd.play(); channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);
で、ぐぐっても出なかったしリファレンスにも
ちゃんとした情報が載っていなかったのだけど、
リスナーで受け取ったパラメータに、SoundChannelが割り当てられている。
なのでSoundとSoundChannelをなにかで結びつけて保存しておけば、
どのSoundが終了したのかを判別できる。
public function onSoundComplete(evt:Event):void
{
for (var name:String in m_sounds)
{
if (m_sounds[name].channel == evt.target)
{
m_sounds[name].sound.play();
break;
}
}
}
画像の回転
flexでBitmapオブジェクトを回転させる際、
リファレンスを見るとrotaionというプロパティがあり、
それを変更することで簡単に回転が出来る。
が、よくよく見るとx=0, y=0の部分で回転しているため、
ちゃんと真ん中で回転してくれない。
リファレンスを見ると、その基準点を変更するための
プロパティも何も無いようだ。
色々調べていると、行列変換が使えることが分かった。
これで回転どころか何もかも好き勝手に出来る。
さすがflex。携帯のアプリとは違う。
具体的には、Bitmap.transform.matrixに
Matrixオブジェクトを代入しておけばよい。
行列を知らない人はなんのこっちゃと思うかもしれないが、
特に難しいことはない。
var matrix:Matrix = new Matrix(); matrix.rotate(angle);
という感じで何も分からなくても簡単に変換行列は作成できる。
で、具体的に回転させるのは、
まず基準点を画像の中心に合わせ、
それから回転、スケール変更を行い、
表示する位置に移動する、という作業。
内容的にはこれだけ。
var matrix:Matrix = new Matrix(); matrix.tx = -bitmap.bitmapData.width / 2; matrix.ty = -bitmap.bitmapData.height / 2; matrix.scale(scalex, scaley); matrix.rotate(Math.PI * angle / 180); matrix.tx += x; matrix.ty += y; bitmap.transform.matrix = matrix;
フォームから配列で複数アイテムを使う
CakePHP1.2ではフォームの作成にはhtmlヘルパーを使わず、
formヘルパーを使うようになった。
使い方は以下のような感じ。
< ?php $form->create(’User’); $form->input(’name’); $form->end(’Submit’); ?>
1.1から移行した時はなんだか良く分からないなあと思うけど、
使っていくうちに$form->inputが色々出来ることに気付く。
誕生日なんかも$form->input(’birthday’, array(’type’ => ‘date’));
みたいな感じで出来るので面白い。
月が英語で出るのがやっかいだが。
例えば以下のようなデータ構造の場合。
User
- Item
- Item
- Item
このようにItemが複数ある場合もフォームで作れる。
もしかしたら1.2betaバージョン以降じゃないと駄目かもしれないが、
以下のように作成できる。
< ?php $form->create(’User’); $form->input(’name’); $form->input(’Item/0/name’); $form->input(’Item/1/name’); $form->input(’Item/2/name’); ?>
これで
$this->data[’Item’]に複数のItemが入る。
色々出来るんだなあと思った。
後は、app_model.phpにそれようのバリデーション関数や
保存関数を加えておけばもっと便利に。
function insertList($rows) {
foreach ($rows as $row) {
$this->create($row);
if (!$this->save()) return false;
}
return true;
}
みたいな感じ。
userDefined
CakePHPの1.2のバリデーションにuserDefinedというのがある。
これを利用すればフレームワークを汚さなくても
独自のバリデーションを加えることが可能。
具体的な使い方は以下の通り。
まずは特定のモデルもしくはapp_model.php等に
専用のバリデーション関数を追加する。
例えば以下のような関数。
function tel($data) {
return preg_match(’/¥d{2,4}-¥d{3,4}-¥d{4}/’) ? true : false;
}
そしてモデルのバリデーション設定には以下のように設定。
var $validate = array(
‘tel’ => array(’rule’ => array(’userDefined’, ‘User’, ‘tel’)),
);
配列の3つめに先ほどのtelを記入。
2番目はよく分からないけどモデル名を書いておけばよいと思う。
別のモデルのも使えるよと言うことだろうか。
ちなみに、モデル内にruleで指定するメソッドを定義しておけばそれでもいいらしい。
年齢の計算
すごい、なんだこれ…
echo (int)((20070823 – 19850101)/10000);
で年齢が計算できるらしい。
http://itpro.nikkeibp.co.jp/article/Watcher/20070822/280097/
php.iniによるサーバー変更時におこるPOST,GETの文字化け対策
サーバーを変更した時にmbstring関係の設定は正しいはずなのに、
POSTやGETだけが文字化けしてしまう時がある。
他の部分はちゃんと動いているのに。
POSTやGET関連のmbstring設定はいくつかあるが、
これらが関連している。
原因は、設定のタイミング。
プログラム内でini_setとかで設定しても修正できない。
なぜなら、POSTやGETの代入はプログラムが開始される前に起きていることだから。
なので、プログラム内では設定せず、
.htaccessやphp.iniで設定しよう。
.htaccessの場合は
php_value mbstring.internal_encoding UTF-8 php_value mbstring.http_input auto php_value mbstring.http_output pass php_flag mbstring.encoding_translation Off
みたいな感じで。
Ajaxが使えないサーバー
こんな症状が発生。
Ajaxリクエストを行うと失敗するのだが、以下のような条件。
IEでcss等 … 成功
IEでphpファイル … 失敗
FireFox?でphpファイル … 成功
別のサーバーでIEでphpファイル … 成功
つまり、特定のサーバーでphpファイルのリクエストを行うと
失敗してしまうという現象。
原因は、apacheの設定で
AddDefaultCharset none
とするとこうなるらしい。
ちゃんと
#AddDefaultCharset
という風にしなければならない。
RAID1の設定
http://www.ysd.bne.jp/linux/raid.htm
や
http://tangiku.net/wiki/index.php?CentOS%A4%C7%A5%BD%A5%D5%A5%C8%A5%A6%A 5%A7%A5%A2RAID
を参考にしたら出来た。
bootが後者と同じくmd0にあったので、
grub-install --root-directory=/boot /dev/hda
にしたら、再起同時に見事にgrubの画面で止まった。
しょうがないので
configfile /grub/grub.conf
で復活できます。
原因は上記コマンドだと/boot/boot/grubを見てしまうために
設定ファイルが足りないから。
色々と変な情報が行き交ってて訳がわからなかったが、
とりあえず以下が正しいよう。
grub-install --root-directory=/ /dev/hda
あとは参考URLに書いてあるとおりにしたら出来た。