CakePHPのscaffoldでdatetimeなどの日時形式をカスタマイズする

CakePHPホント便利。そろそろ2.x系に移行しなくちゃと思って勉強しつつ、移行コストが億劫で1.3系も現役なうです。特に管理画面はscaffoldで事足りちゃうぐらい簡単なのが嬉しいんですけど、海外製なのでところどころ不便な事があります。例えば日時。date,datetime,timestamp型の場合、自動生成されるプルダウンが「月-日-年」の順番っていうだけでも馴染みがないのに、月のプルダウンは1〜12じゃなくてJanuary〜Decemberの英語名!これじゃあ英語ネイティブでもないとサクサク入力できません。うむむ。

ところが!さすがCake先生、カスタマイズしやすいようちゃんと用意されてます。手順は下記の通り。

1.cake/libs/view/scaffolds/edit.ctpをapp/views/scaffolds/edit.ctpにコピー

2.コードを下記のように編集

echo $this->Form->create();

となっている1行を

$options = array(
‘inputDefaults’ => array(‘dateFormat’ => ‘YMD’, ‘timeFormat’ => 24, ‘monthNames’ => null)
);
echo $this->Form->create(null, $options);

に変更します。これだけでdate型のプルダウンは年月日の順になり、月は英語名から数字になり、時間はAMとPMの12時間から24時間になります。他のオプションも設定できるので、minYearやmaxYearあたりを適宜設定してあげると使いやすくなるかもしれません。

最近はPHPのフレームワークでもFuelPHPなんかが活発になってきていて、CakePHPの行く先を案じつつも、割と細かいところに手が届いてくれるこの子をまだまだ手放せそうにないこの頃です。

CentOSにRVMとRubyをインストール

ローカル開発環境の作成用に、MacのVMware FUSION 5にCentOSを入れたので、RVMインストール時のメモ。下記は全てroot権限で実行。

必要なパッケージのインストール

yum install zlib-devel openssl-devel sqlite-devel

上記だけでもRVMはインストール出来たけど、Ruby1.9.3をインストールした際に怒られたので、あらかじめlibyamlも入れておくことにする。libyamlは標準のリポジトリにはないので、epelリポジトリを追加して(割愛)そこからインストールする。

yum –enablerepo=epel install libyaml-devel

RVMのインストール

curl -L https://get.rvm.io | bash -s stable

完了したら、RVMを有効にするために「source path/to/.rvm/scripts/rvm」コマンドを打つか、再ログインする(.bash_profileを読みこませる)。

rvm -vでバージョン&インストールの確認

Ruby1.9.3のインストール

rvm install 1.9.3

結構時間がかかるので、しばし待つ。完了したらruby -vとgem -vでそれぞれインストールされていることを確認する。

備考

libyamlをインストールしない状態でgem -vを叩いたら「It seems your ruby installation is missing psych (for YAML output).To eliminate this warning, please install libyaml and reinstall your ruby.」というエラーメッセージが表示された。この場合、本文に書いた通りepelリポジトリからlibyamlをインストールした上で、「rvm reinstall 1.9.3」コマンドでRubyを再インストールしたらメッセージは消えた。

CakePHP2でWarning: SplFileInfo::openFileエラー

CakePHP2でBakeしようと思ったら「Warning: SplFileInfo::openFile」というエラーが発生。さっさと焼き上げてCakePHP2の質感を試してみたかったのでガッカリしながら、Google様にお問い合わせ。すると下記の記事を発見。

CakePHP2にあげてから度々目にするWarning: SplFileInfo::openFileの対処法 | ミラボ

この記事の通りにcore.phpのCache::configの_cake_core_と_cake_model_の2つにmask「0666」を設定して、再度Bakeしようとしたものの同様のエラー。ちょっと考えたのち、既に作られたキャッシュのパーミッションがそのままな事に気付いたので、「sudo chmod -R 707 ./app/tmp」で変更してあげたら無事にBake出来ました。

CakePHP2でUnable to allocate memory for pool.エラー

CakePHP2をインストールしてdatabase.phpとcore.phpを設定、簡単なテーブルを作成してBakeしてみたところ、大量に「Warning (2): include() [http://php.net/function.include]: Unable to allocate memory for pool. [CORE/Cake/Core/App.php, line 562]」のエラーが!

ググってみたらAPCのエラーのよう。

PECL apcのエラー Unable to allocate memory for pool. | 永田順伸のブログ 

このページ内のアドバイスどおり、/etc/php.d/apc.iniを修正した。
apc.mmap_file_mask=/tmp/apc.XXXXX

apc.mmap_file_mask=/dev/zero
へ変更するとエラーは表示されなくなった。

心にひっかかりを覚えながら、上記のサイトを参考に修正しようと思ったら、既になってた。ひっかかりは前にやった事があったからみたい。さらにググってみたら、知恵袋でこんなものが。

PHP 5.3.6で、Warning: require(): Unable to allocate memory for pool.という警… – Yahoo!知恵袋

APCのエラーによるものです。(* APCとは、PHPの中間コードのキャッシュや最適化を行う拡張モジュールのことです。)

対処法は、APCを無効にすればOKです。以下の1行を.htaccessに追加してください。

php_flag apc.cache_by_default Off

恐るおそるwebroot/.htaccessに追加してみたところ、無事エラーが消えた!core.phpハッキリした原因が分からないのでとっても気持ち悪いけど、APCってPHPレベルで設定してなくても勝手に動いちゃってるものなのかな?それともPHPのバージョンによるもの??うーん…