Symfony 1.xのフォームと言えばsfFormですが、クライアントから送信された値を取る方法は主に2つあります。
$form->getValue('foobar');
$form['foobar']->getValue();
前者はsfForm::getValues()の対応する値を、
後者は対応するsfFormFieldの::getValue()の値をそれぞれ返してるようでして、結果が食い違う事があります。
sfForm::getValues()の値は::doBind()が実行され、バリデーションをパスした値のみが保存されます。
エラーのあるフィールドはnullがセットされます。
また、form.filter_valuesイベントメソッドやpostValidateコールバックの返り値が優先して使われます。
一方でsfFormFieldの方はdoBind()が実行された時点でそのままの値が保存されます。
以上のような違いがある為テンプレートで表示する場合はケースバイケースですが、
DBに格納する際は前者の方が無難なケースが殆んどかと思います。
ご存知の通りSymfony 1.4系のユーザークラスはsfUserですが、
このクラスで良く使われるsetAttributeおよびsetFlashの3番目の引数の存在にこの間気付いたので( ..)φメモメモ
sfUser::setAttribute($name, $default = null, $ns = null)
第3引数で名前空間を指定し、他クラスの値と名前衝突するのを防ぎます。
$user = sfContext::getInstance()->getUser();
$user->setAttribute('key1', 'value', 'symfony/user/myUser/ns1');
$user->setAttribute('key1', 0xFF, 'symfony/user/myUser/ns2');
$user->setAttribute('key2', array('hoge'), 'symfony/user/myUser/ns2');
// 'value'
var_dump($user->getAttribute('key1', null, 'symfony/user/myUser/ns1'));
// '無いって!'
var_dump($user->getAttribute('key2', '無いって!', 'symfony/user/myUser/ns1'));
// 0xFF
var_dump($user->getAttribute('key1', null, 'symfony/user/myUser/ns2'));
// array('hoge')
var_dump($user->getAttribute('key2', null, 'symfony/user/myUser/ns2'));
因みにsfUser::setAttribute()格納先の名前空間は「symfony/user/myUser/attributes」です。
命名規則は「@package/@subpackage/__CLASS__/~~」がベターかと。
また、名前空間ごと全て削除する場合は
$user->removeNamespace('symfony/user/myUser/ns1');
// hasも使えます!
var_dump($user->hasNamespace('symfony/user/myUser/ns2')); // true
のような感じ。
sfUser::setFlash($name, $value, $persist = true)
第3引数にfalseを指定すると、リクエスト終了時に即値が削除されます。
// ~~/actions/actions.class.php
if (true /* 特定の条件 */) {
$this->getUser()->setFlash('flash', 'value', false);
}
Flashに値をセット後、リダイレクトせず本リクエストでのみ使用する場合に使います。
// ~~/templates/testSuccess.php
var_dump($sf_user->hasFlash('flash')); // true
var_dump($sf_user->getFlash('flash')); // 'value'
次回リクエスト時には跡形も無く消えます。
こうしておかないと、例えばコンプリートメッセージ等に使用している場合
次回のリクエストでも表示されるのでユーザーの混乱を招きます。
逆に、リダイレクト後のリクエストで使用する場合はtrue(デフォルト)でなければなりません。
Shiftキーを押しながら文字列選択するか、 メニューの Edit → Settings… → Hotkeys/Mouse → Copy/Clear Selection の Mouse Action から Shift を外して Left だけにする。
選択した文字列をクリップボードにコピーする時は、Ctrl+Insertだけど、これもSettingsのHotkeysから変更できる。
残念ながら文字列選択の操作はキーボードだけでは出来なくてマウスが必要。
久々にハマったので書いてみた。
実行環境はPHP 5.3。
$string = 'show-hey-hey^^'; var_dump(isset($string['foobar']));
期待とは裏腹に「boolean (true)」との出力結果がw
まぁ結論から言うと、
$str[42] のように、 角括弧を使用してゼロから始まるオフセットを指定すると、 文字列内の任意の文字にアクセスし、修正することが可能です。
これだよね。普段はこの記法をする時は波括弧で$str{42}としていたから暫く気づかなかった…。
因みに添字が文字列の場合は強制的にintval(=0)されるから↑のコードだと出力結果はsとなる。
それにしてもissetがtrueなのは如何な物かな(^_^;)
可変引数の関数とかで、1つの変数に複数型を混在させる場合などは要注意。
2012-03-02 追記:
どうやらPHP 5.4でこの不具合は改善されたようです。
PHP 5.4.x における変更点 > 下位互換性のない変更点
$a が文字列の場合に非数値のオフセット (たとえば $a[‘foo’]) を指定したときに、isset() の返り値は false、 そしてempty() の返り値は true となりました。 そして同時に warning が発生します。オフセットに double や bool そして null を指定した場合は notice が発生します。数値とみなせる文字列を渡した場合 ($a[‘2’] など) の挙動はこれまでと変わりません。 ‘12.3’ や ‘5 and a half’ のようなオフセットは非数値とみなされて warning が発生しますが、過去との互換性のためにそれぞれ 12 および 5 に変換されることに注意しましょう。
まぁwarningですが。
ちょいとテスト投稿…
イーーーーーヤッホゥwwwwww
My memorable first post.