Cookie 未保存在 OctoberCMS 中

Cookie not being saved in OctoberCMS

我正在尝试通过 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 时,它​​ returns NULL:

function onStart() {
    var_dump(Cookie::get('saved_item'));
}

// output: NULL

使用 cookie 也花了我一段时间才理解。我希望我写的对你来说足够清楚。基本上,您不会 return 将 cookie 发送到浏览器以将其添加到应用程序存储中。我创建了一个示例页面,您可以看到 here.

第一个示例是常见的 html 形式。

{{ form_open({request:'onSaveItemRedirect'}) }}
    <input type="text" name="item_id" value="12345">
    <button>Save item</button>
{{ form_close() }}

此表单将 post 信息发送到 onSaveItemRedirect。需要注意的关键是 cookie queue。这允许服务器通过重定向在 header 中发送 cooker。

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() 更新部分内容,新 cookie 在 AJAX 完成。

<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:注意这里你应该return一个带有cookie信息的响应。 return 编辑并完成响应后,AJAX API 会向 onUpdateCookiePartial() 发送请求。当 运行 一个事件处理程序时,return 是个好习惯;在这种情况下 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;
}

您只需要对其进行排队,并确保之后没有退出您的 php 代码,因为 cookie 将使用响应发送回客户端。

服务器端cookie你不能从客户端读取它,你只能从服务器端访问和读取它

function onSaveItem() {
    $item_id = Input::get('item_id');
    Cookie::queue(Cookie::forever('saved_item', $item_id));
    return Response::json(['success' => true], 200);
}

如果你只想要客户端cookie,你可以像这样使用,你不能从服务器读取它

我想这很简单,因为 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 最长时间:)

You can also use other API attributes like data-request-error or data-request-complete (both case error or success) to store your cookie.

如有疑问请评论。