カテゴリー: fuelphp

Form::select でvalueが空のoption項目を作る

fuelphpのFormクラスはいろいろと便利です。
その中でも、selectとradioはチェックをつけてくれたりするので大好きです。

Form::select – http://fuelphp.jp/docs/1.7/classes/form.html#/method_select

View内で以下のように書いたら、

[code]
<?
$arrGender = [1 => ‘男性’, 2 => ‘女性’];
$gender = 2;
echo Form::select(‘gender’,$gender,$arrGender,[‘class’ =>’form-control’]);
?>
[/code]

こんなhtmlを作ってくれます。

[code]
<select class=”form-control” name=”gender” id=”form_gender”>
<option value=”1″>男性</option<
<option value=”2″ selected=”selected”>女性</option>
</select>
[/code]

通常は$arrGenderの部分は別で定義しておきますし、
$genderの部分はModelあたりから取ってきたりPostされた値が入っています。

$arrGenderの配列に合わせてoption の部分を作ってくれて、
$genderのキーと一致するoptionにselectedを付けてくれます。超便利。

ですが、これだとユーザーが本当に値を選択したのかわからないので、入力が空ならエラーを出す形にしたい。
つまりこういうHTMLを出したい。

[code]
<select class=”form-control” name=”gender” id=”form_gender”>
<option value=””>選択してください</option>
<option value=”1″>男性</option>
<option value=”2″>女性</option>
</select>
[/code]

$arrGenderをこんな配列にしてやれば実現できました。

[code]
<?
$gender = null;
$arrGender = [” => ‘選択してください’, 1 => ‘男性’, 2 => ‘女性’];
echo Form::select(‘gender’,$gender,$arrGender,[‘class’ => ‘form-control’]);
?>
[/code]

ORMで最後にINSERTしたデータのIDが知りたい

fuelphpで最後にINSERTしたauto incrementなid(プライマリKey)を取得したい時

いろいろ面倒な事をしてたんですが、save();後にオブジェクトから参照できました。

$new = Model_Hoge::forge();
$new->hoge = 'hogehoge';
$new->save();
$id = $new->id; // idのデータが取得できてる

素晴らしい・・。

サブドメイン間のセッションを共有する

hogehoge.com でログインした場合に user.hogehoge.com でもログインした状態にしたい事があったので。

fuelphpサブドメイン間でセッションを共有すればいけるのではないかと思ったのですが
結構苦労したので備忘録です。

下記のブログを参考にしました。

サブドメインでセッションを共有する方法:逆襲のニート
http://gooddays1.blog37.fc2.com/blog-entry-984.html

こちらに紹介されている通り、別サイトでセッションを共有するには以下の条件が必要です
サブドメインである事
・別サーバーの場合はセッションをDBに保存するなどセッション情報が共有できる事

fuelPHPでの設定

さて、実際にfuelphpで設定する方法です。
例として hogehoge.com user.hogehoge.com でセッションを共有すると仮定します。

以下のconfigファイルの一部を修正します。

fuel/app/config/config.php のクッキー項目のdomainを編集
[code]
cookie‘ => array(
// Number of seconds before the cookie expires
// ‘expiration’ => 0,
// Restrict the path that the cookie is available to
// ‘path’ => ‘/’,
// Restrict the domain that the cookie is available to
// ‘domain’ => null,
‘domain’ => ‘.hogehoge.com’,
// Only transmit cookies over secure connections
// ‘secure’ => false,
// Only transmit cookies over HTTP, disabling Javascript access
// ‘http_only’ => false,
),
[/code]

fuel/app/config/session.phpcookie_domain の項目を編集
なければfuel/core/config/session.phpをコピーしてきて下さい。

[code]
cookie_domain’ => ‘.hogehoge.com’,
[/code]

以上、これだけでセッション情報を共有する事ができます。

内容について

上記の設定は保存するCookieドメイン属性の設定です。
「.hogehoge.com」のようにドメイン属性を指定してドットが付けると、Cookieは、サブドメインにアクセスした際にも送信されるようになります。hogehoge.com でも user.hogehoge.com でも login.user.hogehoge.com でも送信されるようになりました(Chromeで確認)。
ただ、サブドメインすべてに送信されるという事はセキュリティ的にもあまりいいものではありません。セッションを共有したい最小限のドメインにのみとか設定できるとベストなんですがこのあたりはもう少し調査が必要だと思っています。

この状態でhogehoge.comに接続してみて発行されたCookieドメインは 「.hogehoge.com」となります。また、user.hogehoge.comに接続してもCookieドメインは 「.hogehoge.com」として同じ値が送信されていると思います。

はまった所

今回の開発環境ではWindowsMACのhostsにホスト名を以下のように設定していて、以下のようなURLで開発環境に接続できるような設定を行っていました。

http://hogehoge/

こういった設定の上でサブドメイン間のセッション共有をしたかったので、上記に習って「.hogehoge」と設定していたのですが何度やってもセッションが共有されないという事がありました。

何度やってもCookieドメインが 「.hogehoge」として送信されません。
ヘッダーなどを見てみるときちんとset-cookieが送信されていましたが、実際のブラウザ側ではCookieに入ってきません・・・。

すごく頭を悩ませていたのですが、どうやら「.」が内包されていないドメイン属性は拒否されるようです。
(考えてみたら .jp とかが設定できちゃうと、同じ設定をしてるCookieがとってこれる事になっちゃいますね )
これらの規約は「RFC6265」によって規定されていて、
現在のブラウザは概ねこの規約にのっとっているようです。

というわけで今回の例のように開発環境は以下で接続できるように設定を変更する事で解決しました。

http://hogehoge.com/

© SEEDS Co.,Ltd.