CakePHPでCookie


CakePHPとjQueryのCookieプラグインは相性が悪い

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エンコードしないそのままの値を利用することとします。
これは、キーが原因で不具合が発生した場合は、そのようなキーを指定したプログラマーが悪いというポリシーでいくべきだと思うからです。

ほかに良い方法をお持ちの方はお教えください。