2016-04-01 18 views
1

Ich arbeite an einem Prestashop-Modul, um den Katalog-Modus ON oder OFF zu aktivieren, wenn der Benutzer nicht angemeldet oder angemeldet ist.Prestashop Katalog-Modus ON/OFF, wenn Benutzer nicht angemeldet/geloggt wurde

Funktioniert gut, aber habe ein Problem.

Ich möchte nicht protokollierte Benutzer Preise sehen und dürfen bestellen. Aber mit der Lösung, die ich gefunden habe, wenn die erste Verbindung (Modus Katalog OFF) nicht angemeldeten Benutzer laden Sie die Seite, die Katalog-Mod einschalten, aber er kann Preise sehen (muss neu zu laden, um Preise zu verbergen) Also zuerst laden Katalog-Modus ON und zweite Laden Sie den Katalogmodus für die Anzeige.

Ich habe ein js-Skript gefunden, das automatisch neu geladen wird, um mit dem neuen Modus wirksam zu werden, aber die Ladezeit der Seite ist offensichtlich doppelt so lang. Hier

ist die Funktion:

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

Hoffnung jemand mir dabei helfen könnte. Vielen Dank.

Antwort

1

Ihre Lösung hat ein Problem. Sie aktualisieren den Wert in der Datenbank: Wenn mehrere Benutzer die Website durchsuchen, wird der Wert ein-/ausgeschaltet/ein/aus/..., also "instabil". Der nächste Kunde, der die Site besucht, erhält den aktuellen Wert (kann ein- und ausgeschaltet sein).

Stattdessen sollten Sie den Wert nur für diesen Kunden umschalten. Ich schrieb eine Überschreibung für Configuration Klasse, die überprüfen, ob Sie versuchen, PS_CATALOG_MODE zu bekommen, dann überprüfen Sie, ob Sie eingeloggt sind und 0 or 1 zurückgibt. Achten Sie darauf, diesen Wert mit static Variablen zwischenzuspeichern (Sie müssen also nicht mehrmals überprüfen).

Aber diese Lösung hat auch einen Fehler. Es prüft jedes Mal den Schlüssel der Konfigurationsvariablen der Anfrage.

Eine bessere Lösung wäre, den Wert während der Sitzung zu ändern. Konfigurationsvariablen werden während der Sitzung tatsächlich in einem PHP-Array gespeichert. Sie sollten es ändern:

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

möglicherweise durch overridding

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

Dies ist, was ich im Sinn hatte, durch zwingendeloadConfiguration:

<?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(); 
    } 
} 

Ich schrieb dies von m emeroy also sicher sein, die anmes, etc. zu überprüfen. Ich nehme an, Sie laufen> PS1.6

+0

Dank für die Informationen

EDIT

eine Bedingung hinzufügen, wenn Context Front-Office ist. Ich sehe, was Sie mit "instabil" meinen, aber es war der einfachste Weg, den ich fand. Ich habe die Funktion loadConfiguration gesehen, über die du geredet hast, aber ich bin verwirrt, ich bin nicht gut genug, um es mir selbst anzueignen. Übrigens scheint es die Lösung zu sein. Kannst du mir mehr Informationen/Tipps geben, um es auf die beste Weise zu überschreiben? Ich werde froh sein, wenn ich lernen kann, wie ich es mache und mich verbessere. Danke nochmal. – JazZ

+0

Hallo! Gefolgt von deinen Tipps und es funktioniert super, aber ich bin mir nicht sicher, ob ich es richtig mache. Können Sie diesen Code überprüfen und mir sagen, ob es gut ist oder ob es verbessert werden muss? http://pastebin.com/jV7EcYb5 Wenn Sie bestätigen können, dass dieser Code gut ist, werde ich die Frage damit bearbeiten, um die Lösung zu teilen. Vielen Dank ! – JazZ

+0

@AdrienLeber Ich habe meine Antwort mit 'LoadConfiguration' überschreiben – gskema

0

Warum verwenden Sie nicht einfach die Gruppeneinstellungen? Kundengruppeneinstellungen ermöglichen es Ihnen, die Option "Preise anzeigen" für Besucher auf "Falsch" und für Kunden auf "Wahr" zu setzen.

+0

Vielen Dank für diese Antwort, aber seit der letzten Antwort habe ich verstanden, dass ich das Modul anders geschrieben habe. Danke für deinen Tipp! – JazZ

0

Die Lösung, die wir mit gskema finden ist, die get() Funktion der Configuration-Klasse außer Kraft zu setzen:

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

/\ noch den Schlüsselwert zu vergleichen jedesmal, wenn jemand eine Konfigurationsvariable zu erhalten versucht, EVENTUELL bremse den Laden nur leicht ab.Büro Thema zurück zu fixe 'Aufruf isLogged auf NULL'