如果用户未记录或记录,我正在使用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>
';
}
希望有人可以帮助我。谢谢。
答案 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'
,则添加一个条件