CakePHP で Cookie を読み書きする方法
CakaPHPでCookie を読み書きするためには、CookieComponent
を使います。
public $components = array('Cookie');
Cookieに書き込むには、write
を使います。
$this->Cookie->write('キー', '値');
その結果次のようなCookieのキーが出来上がります。
CakeCookie[キー]
Cookieから読み出すには、read
を使います。
$val = $this->Cookie->read('キー');
jquery.cookie.jsでCookieを読み書きする方法
次に、jQueryのCookieプラグインでCookieを読み書きするためには、jquery.cookie.js
を使います。
<script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.cookie.js"></script>
Cookieに書き込むには次のようにします。
$.cookie('キー', '値', オプション配列);
その結果次のようなCookieのキーが出来上がります。
キー
Cookieから読み出すには次のようにします。
var $val = $.cookie('キー');
jquery.cookie.jsでCookieに配列を書き込む方法
続いてカートに商品を積むような場合を想定し、Cookieに配列のデータを書き込むこ方法を検討してみたいと思います。
Cookie は、key1=value1; key2=value2
のようにキーと値を「=」で区切った文字列を列挙したとして管理されます。
そのため、配列のデータを文字列に変換する必要があります。その方法の一つとして、JSON形式の文字列を利用することを検討します。
JSON形式はJavaScriptとの相性が非常に良いうえに、HTTP通信でデータを送受信する方法として広く利用されています。
これらのことを踏まえて、JSON形式の文字列に変換することにします。
Cookieに書き込むには次のようにします。
$.cookei.json = true; $.cookie('キー', 配列, オプション配列);
1行目の$.cookei.json = true;
で、データがJSON形式であることを指定しています。この行がないと、Cookieを読み込んだ際にjQueryでエラーが発生します。
2行目で、配列のデータをCookieに書き込んでいます。
以上の操作で、Cookieに書き込むことはできます。
CakePHPでCookieが読めない
ここからがはまりどころです。
CakePHPでは、CakeCookie[キー]
という名前のデータとして管理されています。
幸運なことにデータは、JSON形式で管理されていますので、JavaScriptで書き込んだデータがそのまま読み出せるはずです。
しかし、読み出せないのです。原因は、CakeCookie[キー]
という名前で書き込めないためです。
$.cookie('CakeCookie[キー]', 配列, オプション配列);
を実行すると、URLエンコードされたCakeCookie%5bキー%5d
という名前ので書き込まれてしまいます。
jquery.cookie.jsのソースを確認すると、キーも値も共にURLエンコードしていることがわかりました。
いろいろな対方法があるとは思いますが、jquery.cookie.jsを修正して、キーはURLエンコードしないそのままの値を利用することとします。
これは、キーが原因で不具合が発生した場合は、そのようなキーを指定したプログラマーが悪いというポリシーでいくべきだと思うからです。
ほかに良い方法をお持ちの方はお教えください。
Tweet