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(デフォルト)でなければなりません。

anengineer:

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
まぁ結論から言うと、

PHP: 文字列 - Manual

$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ですが。

ちょいとテスト投稿…

  • あああああ
  • いいいいい
  • うううううう
  1. ほげほげ
  2. ほんげぇ~
  3. うっほうっほ

イーーーーーヤッホゥwwwwww

My memorable first post.