Skocz do zawartości


Zdjęcie
- - - - -

problem z cacheowaniem zmiennej


  • Proszę się zalogować aby odpowiedzieć
3 odpowiedzi na ten temat

#1 apactools

apactools

    Member

  • Members
  • PipPip
  • 15 postów

Napisany 20 February 2018 - 12:20 AM

Cześć VEKIA Czy spotkałeś się kiedyś z takim czymś jak poniżej? - w pliku /override/classes/controller/FrontController.php dodaliśmy swoją zmienną, która działa bez problemu w jednym z TPLi. Jest to zmienna pobierająca "typ urządzenia mobile/desktop". - niestety przy włączonym cache (w panelu Presty cache jest na ON) ta zmienna za każdym razem jest taka sama w TPLu - zmienna w TPLu zmienia się tylko wtedy gdy wyłączymy używanie cacheu lub gdy ten po prostu usuniemy - wartość zmiennej w pliku TPL nie jest aktualizowana z każdym odświeżeniem strony. Będę bardzo wdzięczny za wskazówkę, oczywiście jeśli trzeba w tym wypadku wykupić jakiś pakiet usługowy od Ciebie jak np to https://mypresta.eu/...prestashop.html to nie ma problemu. pozdrawiam serdecznie



#2 vekia

vekia

    Advanced Member

  • Members
  • PipPipPip
  • 98 postów

Napisany 20 February 2018 - 12:20 AM

Witam,
jaka to wersja prestashop? 1.6 / 1.7 ? Sprawdzę to.
Dodatkowo, czy ta zmienna gdy wykorzystywana w tpl - zawsze jest pobierana z cache, czy być może dotyczy to tylko wybranych plików tpl ?
+ mogę jeszcze prosić o fragment kodu, który dodaje tę zmienną do tablicy zmiennych przekazywanej do smarty?



#3 apactools

apactools

    Member

  • Members
  • PipPip
  • 15 postów

Napisany 20 February 2018 - 12:22 AM

Prestashop 1.6.1.18

w TPLu (product-list-home.tpl – product list wykorzystywany w homefeatured do prezentacji produktów) mam taki kod do testowania:

                <p>
                               {if $device_type_info === 'desktop'}
                                               DESKTOP
                               {else}
                                               MOBILE / NOT DESKTOP
                               {/if}
                </p>

a w kontrolerze:

        $browser = get_browser(null, true);
        $dev_info_check = $browser[device_type];
        if (strpos($dev_info_check, 'Desktop')===FALSE) {
            $dev_info = 'mobile';
        }
        else {
            $dev_info = 'desktop';
        }

i zmienna ląduje do smarty

            'device_type_info'    => $dev_info,


#4 vekia

vekia

    Advanced Member

  • Members
  • PipPipPip
  • 98 postów

Napisany 20 February 2018 - 12:23 AM

Ok sprawa wygląda następująco,
Zakładam, że moduł "homefeatured" to jakaś przeróbka standardowego modułu i gdy wywoływany jest plik product-list-home.tpl korzysta z cache. Istotne jest - aby z niego korzystał w odpowiedni sposób.  Posłużę się przykładem opartym o standardowy moduł homefeatured.

Standardowo linia wywołująca plik .tpl w funkcji hookdispalyHome wygląda tak:

return $this->display(__FILE__, 'homefeatured.tpl', $this->getCacheId());

Wywołanie funkcji $this->getCacheId() powoduje wygenerowanie CacheID zacacheowanego pliku, jeżeli funkcja jest bez parametru to automatycznie generowany jest standardowyc CacheID, który jest zawsze taki sam. Trzeba by było kod przerobić tak aby CacheID było różne dla różnych urządzeń.

I tak oto wywołanie funkcji getCacheId() modyfikujemy wprowadzając jako parametr naszą własną unikalną nazwę CacheID - różną dla różnych urządzeń, np:

$this>getCacheId('homefeatured-'.$dev_info);

Gdzie $dev_info to zmienna, która przechowuje informacje o typie urządzenia

Dzięki temu będą dwa CacheID:
- homefeatured-mobile - dla urządzeń mobilnych
- homefeatured-desktop - dla komputerów
A co za tym idzie również dwie różne wersje zacacheowanych plików - jedna dla mobilnych, druga dla komputerów.

Najprościej będzie dodać do FrontControllera statyczną funkcję, która będzie zwracać typ urządzenia wykorzystywanego do przeglądania stron sklepu, np:

public static function getDeviceType()
{    
        $browser = get_browser(null, true);
        $dev_info_check = $browser[device_type];
        if (strpos($dev_info_check, 'Desktop')===FALSE) {
            return 'mobile';
        }
        else {
            return 'desktop';
        }
}

wtedy w każdym module, który korzysta z cache, a dla którego chcielibyśmy wygenerować różne wersje cache dla różnych urządzeń wstawiamy unikalną nazwę CacheID składającą się z dowolnego ciągu znaków np "homefeatured-" oraz zmiennie zwracanej przez uworzoną funkcję:

return $this->display(__FILE__, 'homefeatured.tpl', $this>getCacheId('homefeatured-'.FrontController::getDeviceType());

To w sumie tyle, powinno działać :)
w zaproponowanym kodzie może być jakaś literówka bo nie wprowadzałem zmian w plikach - w każdym razie - sam tę metodę stosuję aby przechowywać różne wersje cache w zależności od różnych parametrów towarzyszących przeglądaniu sklepu.






0 użytkowników czyta ten temat

0 użytkowników, 0 gości, 0 anonimowych użytkowników