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的缓存,请尝试将其置于