1

これは、ログインしている顧客の名前を取得する正しい方法ではありませんか?

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

ライブチャット機能を備えたウェブサイトを持っています。昨日、私は電子メール アドレスとログインしているユーザーの名前を、Web サイトのヘッド セクションに配置された Javascript 追跡変数コードに渡すように求められました。そのため、オペレーターは、情報を尋ねることなく、誰が Web サイトにアクセスしており、誰と話しているかを確認できます。

そのため、Magento からの情報を Javascript コードに渡しましたが、この非常に奇妙なことが起こっていることがわかりました。例えば、

資格情報でログインしている場合 名前 = ジョン 電子メール = john12@yahoo.com

次に、この名前と電子メール変数の値は、ページの変更に伴って変化しています。たとえば、製品ページをクリックすると、渡す変数の値が他のユーザーの情報に変更されます。

名前は Ricky になります メールは ricky23@gmail.com になります

この変数の値は、ページの変更に伴って john に戻ったり、john から別のものに変わったりし続けます。したがって、値が変化し続けるため、オペレーターは誰が話しているのかわかりません。また、ユーザー ricky またはそれが変更されたユーザーもデータベースに存在します。そのため、データベースからランダムに人物をピックアップしています。

これは、コードをjavascriptに渡すために私がしたことです。情報を渡すための正しいコードでない場合はお知らせください。Magento から情報を取得するために使用している php コードを確認してください。おおよそ、5回に1回、間違った値を受け取ります。助けてください。前もって感謝します。

<?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 スクリプトの各実行は他の実行から分離され、1 つのページ要求を処理します。スクリプトの呼び出し間で別の顧客のオブジェクトが移動する可能性はありません。

于 2012-07-16T10:20:21.353 に答える
0

シングルトンパターンを理解することです。コードを 2 回呼び出す場合:

$customer_1 = Mage::helper('customer')->getCustomer()->getName(); 
$customer_2 = Mage::helper('customer')->getCustomer()->getName();

オブジェクトの2 つの異なるインスタンスを取得します。しかし...そのうちの1つがコンストラクターですでにシングルトンパターンを実装している場合、またはシングルトンを実装しているgetInstance場合、両方のオブジェクトは実際には同じものを指します。customer/helper/Data.phpコードを見ると、関数がわかります

public function getCustomer()
{
    if (empty($this->_customer)) {
        $this->_customer = Mage::getSingleton('customer/session')->getCustomer();
    }
    return $this->_customer;
}

つまり、シングルトンがすでに実装/呼び出されているケースと、プロパティが既に設定されているケースではありません。常に正しいデータを取得するために見積もり/顧客/カートを操作する正しい方法は、常にシングルトン パターンを使用することです。だからこれを使って:

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

そのセッションで正しい顧客を獲得することを常に保証します。そして、パターンは次のパターンにsingleton基づいていることを知っているかもしれません:registryapp/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 はデフォルトの動作である Exception をスローするか、または を返しnullます。これが、直面している問題を理解するのに役立つことを願っています。

于 2012-07-15T16:20:53.743 に答える
-1

私はこれを整理しました。コードをfooter.phtmlからhead.phtmlに移動しましたが、正常に機能しています。値は変更されていません。誰かが背後にある論理を知っているなら、投稿してください、そして私は私の答えを変えます。これまでのところ、これは機能しています。

于 2012-07-17T07:11:48.497 に答える