如果用户未记录/记录,则Prestashop将目录模式设置为ON / OFF

时间:2016-04-01 18:02:56

标签: javascript module prestashop prestashop-1.6

如果用户未记录或记录,我正在使用prestashop模块将目录模式设置为ON或OFF。

效果很好,但遇到了问题。

我不希望未登记用户看到价格并允许订购。但是通过我发现的解决方案,当第一次连接(模式目录OFF)未登记用户加载页面时,目录mod打开,但他可以看到价格(必须重新加载以隐藏价格)所以,首先加载设置目录模式ON和第二加载显示实际目录模式。

我发现一个js脚本会自动重新加载以使用新模式生效,但显然,页面加载时间要长两倍。

这是功能:

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

希望有人可以帮助我。谢谢。

3 个答案:

答案 0 :(得分: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();
    }
}

我是从memeroy写的,所以一定要查看anmes等等。我假设你正在运行&gt; PS1.6

答案 1 :(得分:0)

为什么不使用群组设置?客户组设置允许您设置&#34;显示价格&#34;选项&#34; false&#34;对于访客,&#34; true&#34;例如,对于客户而言。

答案 2 :(得分: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;
  }
}

/!\仍然在每次有人试图获取配置变量时比较键值,这可能会稍微减慢商店的速度。

修改

如果Context是前台办公室以修复后台问题'Call isLogged on NULL'

,则添加一个条件