我正在尝试通过octobercms ajax将项目保存在cookie中,但未保存该cookie:
HTML
<button
data-request="onSaveItem"
data-request-data="item_id: 12345">Save item</button>
PHP
function onSaveItem() {
$item_id = Input::get('item_id');
Cookie::forever('saved_item', $item_id);
}
因此,当我尝试在页面开始处检索cookie时,它返回NULL
:
function onStart() {
var_dump(Cookie::get('saved_item'));
}
// output: NULL
使用cookie也使我花了一些时间来理解。希望我为您写得足够清楚。基本上,您不会将Cookie返回浏览器以将其添加到应用程序存储中。我创建了一个示例页面,您可以看到here。
第一个示例是常见的html形式。
{{ form_open({request:'onSaveItemRedirect'}) }}
<input type="text" name="item_id" value="12345">
<button>Save item</button>
{{ form_close() }}
此表格将帖子信息发送到onSaveItemRedirect
。要注意的关键是cookie队列。这样,服务器就可以在带有重定向的标头中发送电磁炉。
function onSaveItemRedirect() {
$item_id = Input::get('item_id');
$cookie = Cookie::forever('saved_item', $item_id);
Cookie::queue($cookie);
return Redirect::refresh();
}
第二个示例使用AJAX API,但稍微复杂一些。请注意,我正在使用局部和data-request-complete
方法。这将使用JavaScript函数updateCookie()
更新部分代码,并在AJAX上完成新的cookie。
<h3 id="cookiePartial">{% partial 'cookie/test' %}</h3>
{{ form_ajax('onSaveItemAjax', {'complete' : 'updateCookie()' }) }}
<input type="text" name="item_id" value="12345">
<button>Save item</button>
{{ form_close() }}
脚本:
<script>
function updateCookie() {
$.request('onUpdateCookiePartial', {
update: {'cookie/test': '#cookiePartial'}
});
}
</script>
PHP:注意,您应该返回包含cookie信息的响应。当响应返回并完成时,AJAX API将请求发送到onUpdateCookiePartial()
。优良作法是在运行事件处理程序时返回一些内容。在这种情况下为true
。
function onSaveItemAjax() {
$item_id = Input::get('item_id');
$cookie = Cookie::forever('saved_item', $item_id);
return Response::json(['Success'])->withCookie($cookie);
}
function onUpdateCookiePartial() {
return true;
}
我想它非常简单,因为cookie是客户端,您可以轻松地将其存储在客户端。
<button
data-request="onSaveItem"
data-request-data="item_id: 12345"
data-request-success="document.cookie = 'saved_item=222; expires=Fri, 31 Dec 9999 23:59:59 GMT';"
>
Save item
</button>
它将像永远存储Cookie一样:)
您还可以使用
data-request-error
或data-request-complete (both case error or success)
之类的其他API属性来存储cookie。
[如有疑问请发表评论。