1

这不是获取登录客户名称的正确方法吗?

<?php echo Mage::helper('customer')->getCustomer()->getName(); ?>

我有一个具有实时聊天功能的网站。昨天,我被要求将电子邮件地址和登录用户的名称传递到网站头部的 Javascript 跟踪变量代码中。这样运营商就可以看到谁在网站上以及他们在与谁交谈,而无需询问他们的信息。

所以我将 Magento 中的信息传递到 Javascript 代码中,但现在我看到这件非常奇怪的事情正在发生。例如,

如果我使用凭据登录姓名 = John 电子邮件 = john12@yahoo.com

然后这个名称和电子邮件变量值随着页面的变化而变化。例如,如果我单击任何产品页面,我传递的变量值会更改为其他用户的信息。

名称变为 Ricky 电子邮件变为 ricky23@gmail.com

随着页面的变化,这个变量值不断变回 john 并从 john 变为其他值。所以操作员不知道他们在说谁,因为值一直在变化。此外,用户 ricky 或更改为的用户也存在于数据库中。所以它正在从数据库中随机选择一个人。

这就是我将代码传递给javascript的方法。如果这不是传递信息的正确代码,请告诉我。请检查我用来从 Magento 获取信息的 php 代码。粗略地说,我每 5 次收到一次不正确的值。请提供一些帮助。提前致谢。

<?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>

我还附上快照 我以 Gagan Sharma 的身份登录,但在 Google 开发人员工具中,您可以看到它向我展示了数据库 Warwick Burton 中的其他人

4

3 回答 3

1

我很想听听您是如何将此代码添加到页面的?它是在它自己的块中,还是你将它添加到footer.phtml,或类似的?如果您添加到现有块,请务必检查该模板的块缓存设置。

为了确认缓存假设,我会问以下问题:

  • 您是否始终在同一页面上使用相同的名称?当您刷新页面时,您是否在 Javascript 中获得相同的名称和电子邮件?
  • 禁用缓存后问题是否仍然存在?

这听起来根本不像一个单例问题。PHP 脚本的每次执行都与其他脚本隔离,服务于一个页面请求。另一个客户的对象不可能在脚本的调用之间移动。

于 2012-07-16T10:20:21.353 回答
0

这是理解单例模式的问题。如果您两次调用您的代码:

$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;
}

这意味着在其中一种情况下,单例已经实现/调用,而在另一种情况下 - 不是已经设置了属性。使用 quote/customer/cart 以始终​​获取正确数据的正确方法是始终使用单例模式。所以使用这个:

$customer = Mage::getSingleton('customer/session')->getCustomer();

始终保证您在该会话中获得正确的客户。您可能知道singleton模式基于以下registry模式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);
}

并看着app/Mage.php

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。希望这将帮助您了解您面临的问题。

于 2012-07-15T16:20:53.743 回答
-1

我已经解决了这个问题。我已将代码从 footer.phtml 移动到 head.phtml 并且现在工作正常。值不再改变。如果有人知道背后的逻辑,请发布,我会改变我的答案。到目前为止,这是有效的。

于 2012-07-17T07:11:48.497 回答