2012年6月10日日曜日

openpne3 Symfony cc で Warning: array_merge()

OpenPNE3でSymfony ccとキャッシュをクリアすると下記のWarningが発生。
       
Warning: array_merge(): Argument #1 is not an array in openpneルート
\lib\config\opProjectConfiguration.class.php on line 131

Warning: Invalid argument supplied for foreach() in openpneルート\li
b\config\opProjectConfiguration.class.php on line 144

Notice: Undefined index: session_storage in openpneルート\lib\config
\opProjectConfiguration.class.php on line 141

Notice: Undefined index: session_storage in ルート\lib\config
\opProjectConfiguration.class.php on line 141

公式ページのバグでも管理されているようで、php4とphp5でのarray_mergeの使用の違いで
発生するようだ。

なお、自分のPHPのバージョンは5.3.8でした。

修正方法
================================
openpneルート\lib\config 配下の
opProjectConfiguration.class.phpの131行目を下記のように修正すると直りました。
(openpne3.6.3)

<修正前>
$config = array_merge($config, sfYaml::load($path));
<修正後>
$config = array_merge((array)$config, sfYaml::load($path));
================================

と、一件落着です。

2012年6月3日日曜日

Symfonyでカスタムバリデータを作成 ちょいとハマッタのでメモ

提供されているバリデータでチェックできない要件があったので自前で作成。

作成するには、setPreValidator() もしくは、setPostValidator()で作成します。
それぞれの違いは下記のとおり。

setPreValidator()
フォームから送信された生のデータを使用できる。
setPostValidator()
フォームの値がクリーンされたデータを使用できる。

とりあえず、setPostValidator()を使用して実装。
内容としては、A項目とB項目の両項目に値が入力されていない場合はエラーにするというもの。
※どちらも空の場合はエラーにしない。

とりあえず、実装して動作確認。
よし!動いた!!
と、試験に取り合かかると、あるパターンの時のみチェックをスルーしてしまう事象が!
そのパターンとは、文字数制限をオーバーしているときに発生。

ん?なにゆえ?と少々悩みましたが、結局は凡ミスでした。
理由は 「setPostValidator()は、フォームの値がクリーンされたデータを使用できる」
ということです。
「クリーンされたデータ」ということは、文字数制限などに引っかかった値は”汚染された値”ということで、クリーン後は、空文字?のような扱いになり、作成したカスタムバリデータではフォームの生のデータではなく、クリーン後の空文字を取得していたためチェックに引っかかりませんでした。

なので、フォームから送信された生データを使用できる「setPreValidator()」に変更したところ
無事チェックが行えました。

次回からも気を付けねば。