Magento 2 会话自行取消设置
Magento 2 session unsetting itself
我需要能够存储一些为自定义存在的自定义会话变量,无论它们是否登录,但由于某种原因,我的会话不断自我删除。
我已经使用 this 示例来帮助我添加我的会话代码。
这是我的代码
块文件
<?php
namespace MyVendor\MyModel\Block;
use Magento\Framework\View\Element\Template;
class ProductSearch extends Template {
protected $_customSession;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Customer\Model\Session $customSession,
array $data = []
){
parent::__construct($context, $data);
$this->_customSession = $customSession;
}
//Get the car model from the session
public function getSessionCarModel(){
return $this->_customSession->getCarModel();
}
//Unset the car model from the session
public function unsetSessionCarModel(){
return $this->_customSession->unsCarModel();
}
}
这是我的模板文件的顶部,它在加载会话时对会话进行排序
productsearchbanner.phtml
<?php
//If the user has selected a new model, unset our session then start a new one
if(isset($_POST['modelSelect'])){
//Unset the other sessions
$block->unsetSessionCarModel();
//Set the model session
$block->setSessionCarModel($_POST['model']);
}
echo '<pre>';
var_dump($_SESSION);
echo '</pre>';
?>
代码的工作方式是,如果设置了 $_POST['modelSelect']
,则用户来自模型 select 页面,因此我们需要再次启动流程并重置他们的会话, 但如果他们没有,会话应该保持不变。
我的问题是,当我来自模型 select 页面时,我的会话变量在 var 转储中显示没有问题,如下所示。
但是当我转到我网站上的任何其他页面(例如主页)然后返回产品搜索页面时,会话已清除?
我做错了什么?为什么每次加载页面时我的会话都会被清除?我只需要能够设置 $_SESSION['carModel']
的等价物,并且它对于该用户是持久的,无论他们是否登录,或者他们去网站的哪个位置。
有人能给我指出正确的方向吗?
在块或模板文件中设置会话是一个问题。这是因为整页缓存。 Magento的执行周期随着FPC的开启而变化
控制器或模型是更新会话数据的最佳位置。
但是,如果您需要在模板/块中更新会话,则可以通过 AJAX 调用自定义操作并让它更新会话信息。
通常,在 Magento 2 中需要执行以下步骤:
在现有模块或新模块中创建新的控制器/操作对,这将更新会话信息。理想情况下,该控制器应该只接受 AJAX 个请求。
在容器 before_body_end
中呈现一个模板并在其中添加一些 jQuery 代码,这将查询控制器/操作对以更新会话信息。
这样,无论何时加载页面,它都会通过请求您的控制器/操作来触发会话更新(或者您可以让它在任何其他事件上触发,比如当用户单击某些内容时等),例如, /my-module/my-controller/my-session-updater-action
.
我需要能够存储一些为自定义存在的自定义会话变量,无论它们是否登录,但由于某种原因,我的会话不断自我删除。
我已经使用 this 示例来帮助我添加我的会话代码。
这是我的代码
块文件
<?php
namespace MyVendor\MyModel\Block;
use Magento\Framework\View\Element\Template;
class ProductSearch extends Template {
protected $_customSession;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Customer\Model\Session $customSession,
array $data = []
){
parent::__construct($context, $data);
$this->_customSession = $customSession;
}
//Get the car model from the session
public function getSessionCarModel(){
return $this->_customSession->getCarModel();
}
//Unset the car model from the session
public function unsetSessionCarModel(){
return $this->_customSession->unsCarModel();
}
}
这是我的模板文件的顶部,它在加载会话时对会话进行排序
productsearchbanner.phtml
<?php
//If the user has selected a new model, unset our session then start a new one
if(isset($_POST['modelSelect'])){
//Unset the other sessions
$block->unsetSessionCarModel();
//Set the model session
$block->setSessionCarModel($_POST['model']);
}
echo '<pre>';
var_dump($_SESSION);
echo '</pre>';
?>
代码的工作方式是,如果设置了 $_POST['modelSelect']
,则用户来自模型 select 页面,因此我们需要再次启动流程并重置他们的会话, 但如果他们没有,会话应该保持不变。
我的问题是,当我来自模型 select 页面时,我的会话变量在 var 转储中显示没有问题,如下所示。
但是当我转到我网站上的任何其他页面(例如主页)然后返回产品搜索页面时,会话已清除?
我做错了什么?为什么每次加载页面时我的会话都会被清除?我只需要能够设置 $_SESSION['carModel']
的等价物,并且它对于该用户是持久的,无论他们是否登录,或者他们去网站的哪个位置。
有人能给我指出正确的方向吗?
在块或模板文件中设置会话是一个问题。这是因为整页缓存。 Magento的执行周期随着FPC的开启而变化
控制器或模型是更新会话数据的最佳位置。
但是,如果您需要在模板/块中更新会话,则可以通过 AJAX 调用自定义操作并让它更新会话信息。 通常,在 Magento 2 中需要执行以下步骤:
在现有模块或新模块中创建新的控制器/操作对,这将更新会话信息。理想情况下,该控制器应该只接受 AJAX 个请求。
在容器
before_body_end
中呈现一个模板并在其中添加一些 jQuery 代码,这将查询控制器/操作对以更新会话信息。
这样,无论何时加载页面,它都会通过请求您的控制器/操作来触发会话更新(或者您可以让它在任何其他事件上触发,比如当用户单击某些内容时等),例如, /my-module/my-controller/my-session-updater-action
.