以下、CakePHPに関する完全に私的なメモ書き。
- CakePHP(1.2)で複数レコードが表形式で表示されていて、チェックボックスで複数選択したものを、一括で削除しようとしているのだが、どうもうまくいかない。
- CakePHP1.1の頃はhtmlヘルパーで、項目名の指定の際に hoge][ みたいな信じられないような形で項目名を指定すると、同名項目を配列で受け取ってくれたのだが、同じ方法はうまくいかない。
- ・・・とここまで書いて、Cake1.2のformヘルパーが悪さしているのではないか、という気がしてきた。
- いま書いているソースは、<form>の部分を$form->create(…)としているが、このように記述すると、自動的にTokenなどのhiddenフィールドをくっつけてくれたりする。これ怪しいな。
- ということでのベタ書きを後で試してみる。
- formヘルパー使ってform要素を出力した場合、パラメータの改ざんやおかしなことがあると、真っ白画面を吐くような仕様になっているらしい。なんかエラー出せよ、という気がしないでも無いが、攻撃に対してはいたずらに画面にメッセージを出力するのはセキュリティ上はよろしくないしな。
- ということで試してみたら、やはりformヘルパーのせいだった。
- やられた・・・。
- 11/14にCodeIgniterで作るか、CakePHPで作るか悩んだが、CakePHPにした。
- ほとんどがCRUDパターンだし、新規にデータベースもつくるから、あんましソース書かなくてもある程度までたどり着けるCakePHPを適切と判断
- んでとりあえずモックアップ開発。認証はAuthコンポーネントを使ったので、1時間で完了。
- CakePHP1.2はデバッグモードの時やたらと遅い。遅い。遅すぎる。
- デバッグモードにしていなくても、体感としてはCodeIgniterの方が高速
- ちなみにGoogleTrendsでの傾向はこんな感じ。

- CakePHPが1とすると、Codeigniterは0.35。但しフィリピンとインドネシアは逆転している。何が起こっているんだ?
いつもいつも嵌っているのだが、今回もまた難題。
PHP4+mojavi2で動いているアプリなんだけど、さすがにPHP4の保守も切れたので、PHP5に変えないといけない。
んで、mojavi2なんだけど、古いフレームワークということもあって、PHP4までしか対応しておらず、選択肢としては、
- mojavi3以降(今の最新はmojavi4)に移行する
- 無理やりmojavi2をPHP5対応にする
という二つの選択肢から選ぶことになる。
どっちが良いのか一瞬悩んだのだが、mojavi3以降にすると、アプリ本体に手を入れる箇所が多くて面倒そう(context対応)なので、無理やりmojavi2をPHP5対応させる方式を選択した。
いやー、イバラの道っぽいよ・・・。
とりあえず、PHP4とPHP5の違いとして、参照渡しがあるので、関数に&がついているやつを片っ端から外せばなんとかなるような、ということで色々やっているが、Smartyとの連携あたりがイマイチうまくいかない。
海外で同じことをやった人がいるみたいなのだが、もうサイト自体もなくなっており、いまはこちらから参照可能。ここから入手したやつをxamppで試したところとりあえず動作した。
ちゅうことでまだまだ続く予感。
原文はこのあたり。かなりの意訳
Subversionのpre-commitフックを利用する方法
Subversionのpre-commitフックを利用するためのSubversionのpre-commit hookの設定について
Subversion pre-commit Hookは何をするんだっけ?
pre-commit hookはSubversionバージョンコントロールシステムの機能の1つで、レポジトリへのコミット前に、コードをvalidateすることが出来る。
PHP_CodeSniffer pre-commit hookは、コーディング規約に従っていないエラーをチェックし、もしエラーがあるようならコミットをさせないようにすることが出来る。これによって、開発者がコーディング規約に反したコードをコミットできないように担保することが出来る。また、そのかわりに、修正すべきエラーの一覧を表示することが出来る。
例 58-1 サンプルの pre-commit 出力
$ svn commit -m "Test" temp.php
Sending temp.php
Transmitting file data .svn: Commit failed (details follow):
svn: 'pre-commit' hook failed with error output:
FILE: temp.php
---------------------------------------------------------------
FOUND 1 ERROR(S) AND 0 WARNING(S) AFFECTING 1 LINE(S)
---------------------------------------------------------------
2 | ERROR | Missing file doc comment
--------------------------------------------------------------
pre-commit Hookの設定
/path/to/PHP_CodeSniffer/scripts/phpcs-svn-pre-commit を編集し、1行目にある@php_bin@をPHPのCLI版のパスに変更する。例えば,
#!@php_bin@ は #!/usr/bin/php になる。
さらに svnlook へのパスが正しく設定されているか確認し、必要ならば、以下の行を編集する。
例 58-2 svnlookコマンドのパスの変更
define('PHP_CODESNIFFER_SVNLOOK', '/usr/bin/svnlook');
さらに以下の行をhooksディレクトリにあるpre-commitファイルに追加する。
例 58-3 Subversionの設定ファイルにpre-commitフックを追加する。
/path/to/PHP_CodeSniffer/scripts/phpcs-svn-pre-commit "$REPOS" -t "$TXN">&2 || exit 1
もちろんphpcsの全てのコマンドラインオプションを利用することが出来る
例 58-4 Subversionの設定ファイルにpre-commitフックを追加する。
/path/to/PHP_CodeSniffer/scripts/phpcs-svn-pre-commit --standard=Squiz --tab-width=4 "$REPOS" -t "$TXN">&2 || exit 1
で良いはずなんだけどうまくいかない。
/usr/bin/scripts/phpcs-svn-pre-commit --standard=Squiz --tab-width=4 "$REPOS" -t "$TXN">&2 || exit 1
どうも-tオプションがうまく動作しておらず、何でもチェックを通ってしまう。
以下エラーメッセージ
[root@kamakura hooks]# /usr/bin/scripts/phpcs-svn-pre-commit /var/svn/test -t "21-1">&2
PHP Warning: Missing argument 3 for PHP_CodeSniffer_SVN_Hook::processUnknownArgument(), called in /usr/share/pear/PHP/CodeSniffer/CLI.php on line 166 and defined in /usr/bin/scripts/phpcs-svn-pre-commit on line 70
PHP Stack trace:
PHP 1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP 2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
PHP 3. PHP_CodeSniffer_CLI->getCommandLineValues() /usr/bin/scripts/phpcs-svn-pre-commit:89
PHP 4. PHP_CodeSniffer_CLI->processShortArgument() /usr/share/pear/PHP/CodeSniffer/CLI.php:119
PHP 5. PHP_CodeSniffer_SVN_Hook->processUnknownArgument() /usr/share/pear/PHP/CodeSniffer/CLI.php:166
リポジトリの引数が必要です
使用方法を知りたいときは 'svnlook help' と打ってください。
PHP Notice: Undefined index: standard in /usr/bin/scripts/phpcs-svn-pre-commit on line 110
PHP Stack trace:
PHP 1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP 2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
PHP Notice: Undefined index: verbosity in /usr/bin/scripts/phpcs-svn-pre-commit on line 119
PHP Stack trace:
PHP 1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP 2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
PHP Notice: Undefined index: tabWidth in /usr/bin/scripts/phpcs-svn-pre-commit on line 119
PHP Stack trace:
PHP 1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP 2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
PHP Notice: Undefined index: report in /usr/bin/scripts/phpcs-svn-pre-commit on line 149
PHP Stack trace:
PHP 1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP 2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
PHP Notice: Undefined index: showWarnings in /usr/bin/scripts/phpcs-svn-pre-commit on line 149
PHP Stack trace:
PHP 1. {main}() /usr/bin/scripts/phpcs-svn-pre-commit:0
PHP 2. PHP_CodeSniffer_SVN_Hook->process() /usr/bin/scripts/phpcs-svn-pre-commit:179
ということで追っかけたら分かった。
調査結果
/usr/share/pear/PHP/CodeSniffer/CLI.phpのバグ。166行目にある、processUnknownArgument関数だが、ここでは引数を2つ渡しているが、実際の関数定義では引数が3つでデフォルトパラメータがない。同様の箇所が123行目、240行目にある。第二引数はprocessUnknownArgumentの中では何も使っていないので、適当に引数を追加しておけば良い。
以上まだまだはまり中。CVSに登録されているソースを追っかけながら、引き続き調査することにする・・・。
Xincを色々いじくっているんだけど、バージョン要求が段々あがっていて、CentOSだと動かない。
仕方ないからPHPのバージョンを上げることになるんだけど、ソースでapacheとPHP管理するのは面倒だから野良でも良いのでrpmを使う。
rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
んで、/etc/yum.repos.d/にutterramblings.repoという名前で以下の内容のファイルを作成
[utterramblings]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
んで、最後に
完了したら、先ほど作成したutterramblings.repoの中のenabled=1を0に変えておく。
これをしておかないと不用意にphpのバージョンがあがってしまうこともありえる。
なんかあまり巷で話題にすらならなかったが、PHP4系のメンテナンスが、8月7日にリリースされた4.4.9を最後に終了した。
PHP5が出た当初、切り替えるのは当分無理だ~、なんて言ってたが、時間が経つのは早い。
4.4.9での変更内容
- PCREのバージョンが7.7になった
- memnstr関数のオーバーフロー問題の対応
- imageloadfontに無効なフォントを与えた場合にクラッシュする問題の対応
- curl拡張においてopen_basedirの扱いに問題があった点を対応
- mbstring.func_overloadを.htaccess内でセットすると、グローバルに有効になってしまう問題の対応
見ているとたいしたことはなさそうだが、ソースでインストールしているなら適用しとくべきか。
CodeIgniterがなかなか自由度が高くて気に入っているのだけれど、一方で、Cakeみたいにbakeコマンドで、CRUDがノンコーディングで出来てしまうわけでも無いので、面倒と言えば面倒。
そういう面倒さはCodeIgniterとRapydを組み合わせてあげることで解決できそうだ。
RapydもオープンソースのPHPフレームワークで、単体で動作するバージョンと、CodeIgniterのライブラリとして動作するバージョンの二つが提供されている。
CIと組み合わせてデータの一覧画面を表示する例を以下に記述する。
まずCIのコントローラの中で、$this->rapyd->load("datagrid");として、DataGridのライブラリを呼び出して、あとはクエリを組み立て、buildコマンドで、データを生成してしまえば良い。テンプレート側に色々なコードを書かないで、テーブル、ソート機能、編集へのリンク、ページング機能が実現できる。あー簡単。
<?php
require_once('basecontroller.php');
class Task extends BaseController
{
function Task()
{
parent::BaseController();
}
function index()
{
$this->rapyd->load("datagrid");
$grid = new DataGrid("Task List", "task");
$grid->per_page = 2;
$grid->column_detail("taskId","taskId", site_url('rapyd/hoge/<#taskId#>'));
$grid->column("Title", "title");
$grid->column("Description", "description");
$grid->build();
$data["grid_output"] = $grid->output;
$data["rapyd_head"] = $this->rapyd->get_head();
$this->load->view('rapyd/task_view', $data);
}
}
?>
サンプル画面は以下のような感じ。

Rapydの弱点は、出力するhtmlがあんまり綺麗じゃない、という点だろう。実際に見てみると早い。
<table style="margin:0;width:100%;border-collapse:collapse;padding:0;">
<tr>
<td>
<table style="margin:0;width:100%;border-collapse:collapse;padding:0;">
<tr>
<td class="mainheader">Task List</td>
<td class="mainheader" align="right"></td>
</tr>
</table>
<div class="mainbackground" style="padding:2px;clear:both;">
<table width="100%" cellpadding="1">
<tr>
<td class="tableheader">
<table style="width:100%; border-collapse:collapse;">
<tr>
(中略)
</tr>
</table></td></tr></table></div></td></tr></table>
なんなんだ、これは・・・、というレベルの汚さ。なぜ、もうちょっとまともにclassを振らないのか。
この問題は、/application/rapyd/views/defaultにある、datagrid.phpというviewを修正すれば直る。これを自分好み、もしくは自分が構築しているシステムのレギュレーションにあわせてあげると素敵になるだろう。
【PHP TIPS】 92. ハイフン付きのメンバ変数名を参照する方法:ITpro
オブジェクトのメンバ変数を参照する際、PHPでは $obj->element のように
指定しますが、まれにelementの変数名にハイフン「-」が入ったものを指定
しなければならない場合があります。
ハイフンが含まれる変数名なんて、いまだかつてお目にかかったことが無い。アンダースコアなら沢山あるけど。
これって、ORM使っていて、DBのカラム名にハイフンが付いている、とかくらいしか考えられないなぁ。
Pearの規約では明示的に-の使用は禁止されていないみたいだけど、まぁ普通は命名しない。
XincはPHPで書かれたSubversion、PHPUnit、Phingを統合するCIサーバ。
最新版は2.0.1.
CIサーバといえば、CruiseControlだけど、PHPの場合、CruiseControlにphpUnderControlを入れないといけなくて、かつ、PHP5.2以降必須なため、RHEL系で動作させにくいという問題がある。(CentOS4.6でやろうと思ったけど挫折。面倒すぎ)
いま試しているXincは、Xinc Is Not CruiseControlの頭文字らしく、CIをPHPにより適応させることを目的としている。
このスライドでは継続的統合の意義、XincとphpUnderControlとの違い、Xincのインストール方法等を解説している。
PHPで継続的統合を行おうと検討している人必見だ。
Trying to clone an uncloneable object of class ReflectionClass
なんていうエラーがPHPUnit+Selenium RCな環境で出たので調べてみた。
結論としては、phpの設定で、
zend.ze1_compatibility_mode = On
になっていると、ダメということで、こいつをOffにすればよい。
« 前の記事
日記
PHP
オープンソース
Linux
Trac
Perl
wordpress
フリーソフト
Agile
自宅サーバ
phpMyFaq
Plugin
書評
Delphi
apache
プラグイン
Subversion
アジャイル
mojavi
セキュリティ
Ruby
Firefox
Ajax/Web2.0
eclipse
サーバ
Zope
フレームワーク
CakePHP
文字化け
scuttle
OpenVZ
自宅
phpBB
CMS
翻訳・日本語化
Excel
ApacheDS
生産性向上
仮想化
hacks
CodeIgniter
XAMPP
LDAP
SBM
taskfreak
Ajax
修正
言語ファイル
mod_security
ダウンロード
HTML::FillInForm
情報共有
格安
メンテナンス
移転
アンケート
レンタル
PhpScheduleIt
翻訳
API