2016-04-01 8 views
1

ユーザーがログに記録されていないかログされている場合、カタログモードをオンまたはオフに設定するためのプレスタシャップモジュールで作業しています。Prestashopカタログモードをユーザーがログオン/ログアウトした場合にON/OFFする

問題はありますが、うまく機能します。

私は、未ログインのユーザーには価格が一目瞭然で注文されることは望ましくありません。しかし、私が見つけた解決策では、最初の接続(モードカタログオフ)時には、ユーザーがページをロードし、カタログモードをオンにするが、価格を見ることができる(価格を隠すためにリロードしなければならない)実カタログモードを表示します。

新しいモードで自動的にリロードするjsスクリプトが見つかりましたが、明らかにページの読み込み時間は2倍長くなっています。ここで

は関数である。

public function hookHeader() 
    { 
     $logged = $this->context->customer->isLogged(); 
     if (!$logged) { 
     Configuration::updateValue('PS_CATALOG_MODE', true); 
     } else { 
     Configuration::updateValue('PS_CATALOG_MODE', false); 
     } 
     // reload the page once more 
     echo ' 
     <script type="text/javascript"> 
      (function() { 
      if(window.localStorage) { 
       if(!localStorage.getItem("firstLoad")) { 
       localStorage[ "firstLoad" ] = true; 
       window.location.reload(); 
       } else { 
       localStorage.removeItem("firstLoad"); 
       } 
      } 
      })(); 
     </script> 
     '; 
    } 

は、誰かがこれで私を助けることができる願っています。ありがとうございました。

答えて

1

解決策に問題があります。 データベース内の値を更新しています。複数のユーザーがサイトを参照している場合、値はオン/オフ/オン/オフ/ ...になります。つまり、「不安定」です。 サイトを訪れる次の顧客は現在の値を取得します(オンとオフが可能)。

代わりに、その顧客の値のみを切り替える必要があります。 Configurationクラスのオーバーライドを書きました。PS_CATALOG_MODEを取得しようとしているかどうかを確認し、ログインしていれば、0 or 1を返します。 static変数を使用してこの値をキャッシュするようにしてください(複数回チェックする必要はありません)。

しかし、この解決法にも欠陥があります。毎回要求構成変数のキーをチェックします。

より良い解決策は、セッション中にこの値を変更することです。設定変数は実際にはセッション中にPHP配列で保持されます。 あなたはここでそれを変更する必要があります。おそらく

https://github.com/PrestaShop/PrestaShop/blob/1.6.1.x/classes/Configuration.php#L203

をオーバーライドすることにより、

https://github.com/PrestaShop/PrestaShop/blob/1.6.1.x/classes/Configuration.php#L140

これは私がloadConfigurationオーバーライドすることにより、念頭に置いていたものです:私が書いた

<?php 

// placed in /override/classes/Configuration.php 

class Configuration extends ConfigurationCore 
{ 
    public static function loadConfiguration() 
    { 
     parent::loadConfiguration(); 
     // 'global' because I assume you're not runing multishop 
     self::$_cache[self::$definition['table']][0]['global']['PS_CATALOG_MODE'] = !Context::getContext()->customer->isLogged(); 
    } 
} 

をこれはmからemeroyので、あなたが実行していると仮定して、私はあなたが実行していると仮定してください。> PS1.6

+0

感謝をバックFIXEするフロントオフィスであれば

EDIT

は、条件を追加します。私はあなたが「不安定」であることを見ますが、それは私が見つけた最も簡単な方法でした。私は、あなたが話していた関数loadConfigurationを見ましたが、私は自分自身をカスタマイズするのに十分ではありません。ところで、それは解決策のようです。 あなたにそれを上書きするための情報やヒントを教えてください。私はそれをやる方法を学び、自分自身を改善することができれば嬉しいです。 もう一度ありがとうございます。 – JazZ

+0

こんにちは!あなたのヒントに従って、それは素晴らしいですが、私はそれを正しくやっていると確信していません。このコードをチェックして、それが良いのか、改善が必要なのかを教えてください。 http://pastebin.com/jV7EcYb5 このコードが良好であることを確認できれば、この問題を編集してソリューションを共有します。ありがとう! – JazZ

+0

@AdrienLeber 'LoadConfiguration'オーバーライドで私の答えを更新しました – gskema

0

なぜあなたは単にグループ設定を使用しないでください?顧客グループの設定では、「ショー価格」オプションを訪問者には「偽」、顧客に対しては「真」に設定することができます。

+0

その答えをありがとうございますが、前の返信以来、私は他の方法でモジュールを書いていることを理解しました。あなたのヒントありがとう! – JazZ

0

我々はgskemaで見つけるソリューションは、ConfigurationクラスのGET()関数をオーバーライドすることです!

<?php 

// placed in /override/classes/Configuration.php 

class Configuration extends ConfigurationCore 
{ 
    public static function get($key, $id_lang = null, $id_shop_group = null, $id_shop = null) 
    { 
     if (defined('_PS_DO_NOT_LOAD_CONFIGURATION_') && _PS_DO_NOT_LOAD_CONFIGURATION_) { 
      return false; 
     } 

     // If conf if not initialized, try manual query 
     if (!isset(self::$_cache[self::$definition['table']])) { 
      Configuration::loadConfiguration(); 
      if (!self::$_cache[self::$definition['table']]) { 
       return Db::getInstance()->getValue('SELECT `value` FROM `'._DB_PREFIX_.bqSQL(self::$definition['table']).'` WHERE `name` = "'.pSQL($key).'"'); 
      } 
     } 
     $id_lang = (int)$id_lang; 
     if ($id_shop === null || !Shop::isFeatureActive()) { 
      $id_shop = Shop::getContextShopID(true); 
     } 
     if ($id_shop_group === null || !Shop::isFeatureActive()) { 
      $id_shop_group = Shop::getContextShopGroupID(true); 
     } 

     if (!isset(self::$_cache[self::$definition['table']][$id_lang])) { 
      $id_lang = 0; 
     } 

     if ($id_shop && Configuration::hasKey($key, $id_lang, null, $id_shop)) { 
      if($key == 'PS_CATALOG_MODE' && Context::getContext()->controller->controller_type == 'front') 
      { 
       return !Context::getContext()->customer->isLogged() || self::$_cache[self::$definition['table']][$id_lang]['shop'][$id_shop][$key]; 
      } else { 
       return self::$_cache[self::$definition['table']][$id_lang]['shop'][$id_shop][$key]; 
      } 
     } elseif ($id_shop_group && Configuration::hasKey($key, $id_lang, $id_shop_group)) { 
      if($key == 'PS_CATALOG_MODE' && Context::getContext()->controller->controller_type == 'front') 
      { 
       return !Context::getContext()->customer->isLogged() || self::$_cache[self::$definition['table']][$id_lang]['group'][$id_shop_group][$key]; 
      } else { 
       return self::$_cache[self::$definition['table']][$id_lang]['group'][$id_shop_group][$key]; 
      } 
     } elseif (Configuration::hasKey($key, $id_lang)) { 
      if($key == 'PS_CATALOG_MODE' && Context::getContext()->controller->controller_type == 'front') 
      { 
       return !Context::getContext()->customer->isLogged() || self::$_cache[self::$definition['table']][$id_lang]['global'][$key]; 
      } else { 
       return self::$_cache[self::$definition['table']][$id_lang]['global'][$key]; 
      } 
     } 
     return false; 
    } 
} 

/\まだこれが、キー値に誰かが設定変数を取得しようとするたびに比較します少しだけ店を遅くする。コンテキスト情報のための「コールはNULLにisLoggedのオフィスの問題

関連する問題