Magento在前端页面上返回不正确的客户数据
这不是获取已登录客户名称的正确方法吗Magento在前端页面上返回不正确的客户数据,magento,Magento,这不是获取已登录客户名称的正确方法吗 <?php echo Mage::helper('customer')->getCustomer()->getName(); ?> 我有一个具有实时聊天功能的网站。昨天,我被要求将电子邮件地址和登录用户的姓名传递到网站头部的Javascript跟踪变量代码中。这样,运营商就可以看到谁在网站上,他们正在与谁交谈,而无需询问他们的信息 因此,我将信息从Magento传递到Javascript代码中,但现在我看到这非常奇怪的事情发生了
<?php echo Mage::helper('customer')->getCustomer()->getName(); ?>
我有一个具有实时聊天功能的网站。昨天,我被要求将电子邮件地址和登录用户的姓名传递到网站头部的Javascript跟踪变量代码中。这样,运营商就可以看到谁在网站上,他们正在与谁交谈,而无需询问他们的信息
因此,我将信息从Magento传递到Javascript代码中,但现在我看到这非常奇怪的事情发生了。比如说,
如果我使用凭据名称=John Email登录=
john12@yahoo.com
然后,此名称和电子邮件变量值会随着页面的变化而变化。例如,如果我在任何产品页面上单击变量值,我会将更改传递给其他用户的信息
名字变成了Ricky电子邮件变成了ricky23@gmail.com
随着页面的变化,该变量值会不断地变回john,并从john变回其他值。所以操作员不知道他们在说谁,因为值一直在变化。此外,用户ricky或它更改为的用户也存在于数据库中。因此,它从数据库中随机选取一个人
这就是我将代码传递给javascript所做的。如果这不是传递信息的正确代码,请告诉我。请检查我用来从Magento获取信息的php代码。大致上,我五次收到一次错误的值。请提供一些帮助。提前谢谢
<?php
$customer = Mage::getSingleton('customer/session')->getCustomer();
$email = $customer->getEmail();
$firstname = $customer->getFirstname();
$lastname= $customer->getLastname();
$name = $firstname . ' ' . $lastname;
?>
<script type="text/javascript">
if (typeof(lpMTagConfig) == "undefined"){ lpMTagConfig = {};}
if (typeof(lpMTagConfig.visitorVar) == "undefined"){ lpMTagConfig.visitorVar = [];}
lpMTagConfig.visitorVar[lpMTagConfig.visitorVar.length] = 'Email=<?php echo $email; ?>';
lpMTagConfig.visitorVar[lpMTagConfig.visitorVar.length] = 'Name=<?php echo $name; ?>';
</script>
如果(typeof(lpMTagConfig)=“未定义”){lpMTagConfig={};}
if(typeof(lpMTagConfig.visitorVar)=“未定义”){lpMTagConfig.visitorVar=[];}
lpMTagConfig.visitorVar[lpMTagConfig.visitorVar.length]=“Email=”;
lpMTagConfig.visitorVar[lpMTagConfig.visitorVar.length]=“Name=”;
我还附上了一张快照
这是一个理解单例模式的问题。如果您调用代码两次:
$customer_1 = Mage::helper('customer')->getCustomer()->getName();
$customer_2 = Mage::helper('customer')->getCustomer()->getName();
您将获得对象的两个不同实例。但是如果其中一个已经在其构造函数中实现了一个单例模式,或者已经实现了一个单例getInstance
,那么这两个对象实际上将指向同一个对象。
查看customer/helper/Data.php
代码可以看到函数
public function getCustomer()
{
if (empty($this->_customer)) {
$this->_customer = Mage::getSingleton('customer/session')->getCustomer();
}
return $this->_customer;
}
这意味着,在其中一种情况下,singleton已经实现/调用,而在另一种情况下,不是因为属性已经设置。
使用quote/customer/cart以始终获得正确数据的正确方法是始终使用singleton模式。
所以用这个:
$customer = Mage::getSingleton('customer/session')->getCustomer();
始终确保在该课程中找到正确的客户。您可能知道,singleton
模式基于app/Mage.php中的registry
模式:
public static function getSingleton($modelClass='', array $arguments=array())
{
$registryKey = '_singleton/'.$modelClass;
if (!self::registry($registryKey)) {
self::register($registryKey, self::getModel($modelClass, $arguments));
}
return self::registry($registryKey);
}
public static function register($key, $value, $graceful = false)
{
if (isset(self::$_registry[$key])) {
if ($graceful) {
return;
}
self::throwException('Mage registry key "'.$key.'" already exists');
}
self::$_registry[$key] = $value;
}
...
public static function registry($key)
{
if (isset(self::$_registry[$key])) {
return self::$_registry[$key];
}
return null;
}
查看app/Mage.php
:
public static function getSingleton($modelClass='', array $arguments=array())
{
$registryKey = '_singleton/'.$modelClass;
if (!self::registry($registryKey)) {
self::register($registryKey, self::getModel($modelClass, $arguments));
}
return self::registry($registryKey);
}
public static function register($key, $value, $graceful = false)
{
if (isset(self::$_registry[$key])) {
if ($graceful) {
return;
}
self::throwException('Mage registry key "'.$key.'" already exists');
}
self::$_registry[$key] = $value;
}
...
public static function registry($key)
{
if (isset(self::$_registry[$key])) {
return self::$_registry[$key];
}
return null;
}
您可以看到Magento检查它是否已设置。如果是这样,Magento将抛出异常(这是默认行为)或返回null
。
希望这能帮助您理解您面临的问题。我很想听听您是如何将此代码添加到页面的?它是在它自己的块中,还是要将它添加到footer.phtml
或类似文件中?如果要添加到现有块,请确保检查该模板的块缓存设置
要确认缓存假设,我将询问以下问题:
- 你总是在同一页上有相同的名字吗?刷新页面时,Javascript中是否有相同的名称和电子邮件
- 禁用缓存后问题是否仍然存在
这听起来根本不像是一个单身问题。PHP脚本的每一次执行都是独立于其他脚本的,服务于一个页面请求。其他客户的对象不可能在脚本调用之间移动。我已经解决了这个问题。我已经将代码从footer.phtml移到head.phtml,现在工作正常。值不再更改。如果有人知道背后的逻辑,请张贴,我会改变我的答案。到目前为止,这是有效的。Milen我也尝试过。但它仍然没有解决我的问题。我仍然面临着同样的问题。对象是会话备份的,因此无论您创建了多少实例,您都将始终引用相同的数据存储,因此引用相同的数据。无论如何,你的建议只是避开助手,然后进行完全相同的代码调用,正如OP所确认的,这显然会导致相同的结果..Nick,有趣的是,你所说的对象是会话支持的?我怀疑问题在于getcustomer,你如何保存传递给javascript的信息,然后向操作员显示该信息?我认为每次客户访问站点时,信息都会被覆盖。这就是为什么它看起来是随机出现的。你能从你的跟踪器中显示相关代码吗?这是他们提供的唯一代码。我问题中的javascript代码,并将php变量传递给它。您是否尝试在live chat管理员中使用会话范围而不是访问者范围?然后将新代码粘贴到footer.phtml中,并在magento中禁用所有缓存,然后查看它是否有效?是的,我尝试了会话,查看了所有页面变量。我正在将javascript代码放到footer.phtml中。这就是他们在正文结束前建议的地方。成功登录后,值仅在2个用户之间更改,其中一个显然是原始用户,另一个可能是任何人,但我看到其他用户也从其他地方登录。因此,值仅在这两者之间切换。如果我注销并再次登录,则其他用户可能是任何人,但它也必须登录。是的,禁用缓存后仍然存在问题。页脚实际上正在进行一些基于url的缓存,请尝试将其置于