Jump to content

Tworzenie własnych COOKIE


zmora.vip

Recommended Posts

Czy mógłbym prosić o pomoc w tworzeniu COOKIES?
 

Rozumiem, że tym sposobem odnoszę się do głównego cookie, a później mogę dopisywać mu nowe wartości.

$cookie = Context::getContext()->cookie;
$cookie->__set("var", "value 1");
$cookie->write();

Jednakże w ten sposób nadając $cookie->setExpire(time() + 1 * 10); nadaje ważność dla całego ciasteczka.

Rozumiem też, że mogę stworzyć 

$cookie = new Cookie("ciastko"); 
$cookie->setExpire(time() + 20 * 60);
$cookie->variable_name = 'hello';
$cookie->write();

I tutaj nie mam problemu w ustawieniu terminu ważności ale jak wtedy mogę się odwołać do niego by zweryfikować czy istnieje?
Jak ustawić $cookie->__isset()?

Mam na celu stworzenie ciastka i ustawić jego ważność na np. 5 minut i móc odnieść się czy on istnieje.

Edited by zmora.vip (see edit history)
Link to comment
Share on other sites

  • zmora.vip changed the title to Tworzenie własnych COOKIE

Udało mi się odnieść w ten sposób 

        $cookie = new Cookie('mycookie');
                
        if(!isset($cookie->variable_name) and Tools::getIsset($hash)){
            //$cookie = new Cookie('mycookie');
            $cookie->variable_name = 'promotional-product';
            $cookie->__set("var", "value 1"); 
            //$cookie->setExpire(time() + 1 * 60);
            $cookie->write();
        }

Jednakże w ten sposób tworząc cookie i gdy dodam coś do do koszyka (istnienie cookie zmienia cenę produktu) to gdy minie termin ważności cookie to wywala błąd 500 na stronie, aż do usunięcia pozostałych cookie. Macie może jakąś podpowiedź?

Kod modyfikuje w getSpecificPrice(); Gdy wykryje obecność cookie to zamienia wartość id_shop.

Link to comment
Share on other sites

  • 2 weeks later...

@Krystian PodemskiDziękuje za odpowiedź :)

Z tego co się orientuje to mechanizmy tworzenia cookie sa blokowane w prestashop a przynajmniej z tego co zaobserwowalem towrzone w ten sposob nie sa interpretowane. W ten sposob stworzony w controllerze nie byl brany pod uwage odpoczatku ladowania strony.

Czy wiesz moze jak wyczyscic koszyk (lub co zrobic z produktami w koszyku) gdy zmienila sie cena? Jak pisałem wyżej udąło mi się po zwerfikowaniu czy istnieje cookie zmienic cene uzywając getSpecificPrice jednak potem gdy ciastko straci swoja waznosc a jest produkt z obnizona cena w koszyku lub gdy jest pordukt w standardowej cenie a potem utworzymy ciastko ktore obniza nam cene to strona sie buguje na blad 500 i odmawia az do czasu usniecie cookies z przegladarki. Wiesz czym sa werfikowane ceny produktow i jak one sie zachowuja gdy np minie promocja?

Link to comment
Share on other sites

1. Ciasteczka, spróbuj w ten sposób:

dodaj do standardowego cookie nową wartość, która będzie przechowywała czas ważności

$cookie = Context::getContext()->cookie;
$cookie->__set('my_var_expire', time() + 5 * 60);

// jak potrzeba dodaj też inne wartości np.
$cookie->__set('my_var_data', 'moje dane');

// $cookie->write(); // to jest wywoływane automatycznie w destruktorze klasy, w razie potrzeby można wymusić wcześniejsze zapisanie


sprawdzić ważność Twoich danych możesz w ten sposób:

$cookie = Context::getContext()->cookie;
if ($cookie->__isset('my_var_expire')) {
    if (($expire = $cookie->__get('my_var_expire')) > time()) { // jest ważne
        
        // jakieś działanie
        
    } else {
        
        // inne działanie
    }
}


2. Nie bardzo rozumiem czemu chcesz usuwać zawartość koszyka klienta gdy zmieni się cena produktu. Ceny produktów w koszyku są "wyliczane" automatycznie, i są zależne od aktualnej ceny produktu (np. ustawionej promocji).
    Sam koszyk Presty nie przechowuje cen. Zobacz tabele ps_cart*

 

Link to comment
Share on other sites

On 12/11/2021 at 9:51 AM, atomek said:

1. Ciasteczka, spróbuj w ten sposób:

dodaj do standardowego cookie nową wartość, która będzie przechowywała czas ważności

$cookie = Context::getContext()->cookie;
$cookie->__set('my_var_expire', time() + 5 * 60);

// jak potrzeba dodaj też inne wartości np.
$cookie->__set('my_var_data', 'moje dane');

// $cookie->write(); // to jest wywoływane automatycznie w destruktorze klasy, w razie potrzeby można wymusić wcześniejsze zapisanie


sprawdzić ważność Twoich danych możesz w ten sposób:

$cookie = Context::getContext()->cookie;
if ($cookie->__isset('my_var_expire')) {
    if (($expire = $cookie->__get('my_var_expire')) > time()) { // jest ważne
        
        // jakieś działanie
        
    } else {
        
        // inne działanie
    }
}


2. Nie bardzo rozumiem czemu chcesz usuwać zawartość koszyka klienta gdy zmieni się cena produktu. Ceny produktów w koszyku są "wyliczane" automatycznie, i są zależne od aktualnej ceny produktu (np. ustawionej promocji).
    Sam koszyk Presty nie przechowuje cen. Zobacz tabele ps_cart*

 

Dziękuje serdecznie za odpowiedź. Tak jak wspomniałem. Gdy dodam przedmiot do koszyka, a potem stworze ciasteczko, które obniża cenę to buguje mi się presta do momentu usunięcia ciasteczka, bo inna cena jest w koszyku niż aktualnie obowiązuje na przedmiot. Tak samo dzieje się w drugą stronę czyli jeśli koszyk jest pusty, stworzę ciastko obniżające cenę, a potem ciastko straci ważność, a produkt nadal jest w koszyku to też buguje się strona na błąd 500 do momentu usnięcia cookiesów.

Ciastka obiżają cenę w getSpecificPrice wprowadzając warunek, że jak istnieje cookie to podmienia id_shop na 10 a akurat dla id_shop 10 ten produkt ma ustawioną stała inna cene.

Czy macie może jakąś radę jak inaczej wywołać promocje?

Zamysł jest taki, że jeśli jest odpowiednia konstrukcja linku to tworzy ciastko a ciastko obniża cenę na dany produkt na np. 60 minut.

Link to comment
Share on other sites

On 12/10/2021 at 3:31 PM, zmora.vip said:

Z tego co się orientuje to mechanizmy tworzenia cookie sa blokowane w prestashop a przynajmniej z tego co zaobserwowalem towrzone w ten sposob nie sa interpretowane. W ten sposob stworzony w controllerze nie byl brany pod uwage odpoczatku ladowania strony.

 

To nie jest prawda. Po prostu używając klasy Cookies i jej set czy get tworzysz wpisu w domyślnym ciastku utworzonym przez system. Możesz równie dobrze stworzyć własne ciastko tylko sugerowałbym by było w jakiś sposób zabezpieczone abym tworząc je sobie samemu nie miał promocji.

Link to comment
Share on other sites

7 hours ago, Krystian Podemski said:

To nie jest prawda. Po prostu używając klasy Cookies i jej set czy get tworzysz wpisu w domyślnym ciastku utworzonym przez system. Możesz równie dobrze stworzyć własne ciastko tylko sugerowałbym by było w jakiś sposób zabezpieczone abym tworząc je sobie samemu nie miał promocji.

Gdy początkowo używałem setcookie() to rzeczywiście tworzyło ciastko ale odnosząc sie w classie do tego ciastko przez $_cookie[] to w początkowych ładowaniach strony nie widziało go. Możliwe, że na tym polega to zabezpieczenie.

Jednakże mimo wszystko nawet jak utworze i poprawnie jest wyświetlane i dodawane do koszyka to mam problem, gdy cena się zmieni np. na rzecz usunięcia tego cookie lub jak powstanie ono po dodaniu już produktu bez obniżenia ceny. Przerobiłem getSpecificPrice() w następujący sposób

public static function getSpecificPrice(
        $id_product,
        $id_shop,
        $id_currency,
        $id_country,
        $id_group,
        $quantity,
        $id_product_attribute = null,
        $id_customer = 0,
        $id_cart = 0,
        $real_quantity = 0
    ) {        
        $idtmp = 123; //202cb962ac59075b964b07152d234b70
        $hash = md5($idtmp); 
        //$hash = md5('YIN:'.$id_product);
        
        //$cookie = Context::getContext()->cookie->mycookie;
        //if(!isset(Context::getContext()->mycookie->variable_name))
        //    $cookie = Context::getContext()->mycookie;
        
        $cookie = new Cookie('mycookie');
        
        //if(isset($cookie->variable_name)) print_r(Context::getContext()->cookie);  
        //echo "jest".$cookie->variable_name;
        
        if(!isset($cookie->variable_name) and Tools::getIsset($hash)){
            //$cookie = new Cookie('mycookie');
            $cookie->variable_name = 'promotional-product';
            //$cookie->__set("var", "value 1"); 
            $cookie->setExpire(time() + 1 * 60);
            $cookie->write();
        }
        
        //print_r ($cookie);
        if(!isset($_COOKIE[$hash]) and !isset($_GET[$hash])) {
            //$id_product = 0;
            //$id_shop = 0;
        }
      
        if(isset($cookie->variable_name) or Tools::getIsset($hash)){ 
            $id_group = 100;
        }
        
        if (!SpecificPrice::isFeatureActive()) {
            return [];
        }
        /*
         * The date is not taken into account for the cache, but this is for the better because it keeps the consistency
         * for the whole script.
         * The price must not change between the top and the bottom of the page
        */

        if (!self::couldHaveSpecificPrice($id_product)) {
            return [];
        }
            
        if (static::$psQtyDiscountOnCombination === null) {
            static::$psQtyDiscountOnCombination = Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION');
            // no need to compute the key the first time the function is called, we know the cache has not
            // been computed yet
            $key = null;
        } else {
            $key = self::computeKey(
                $id_product,
                $id_shop,
                $id_currency,
                $id_country,
                $id_group,
                $quantity,
                $id_product_attribute,
                $id_customer,
                $id_cart,
                $real_quantity
            );
        }

        if (!array_key_exists($key, self::$_specificPriceCache)) {
                        
            $query_extra = self::computeExtraConditions($id_product, $id_product_attribute, $id_customer, $id_cart);
            if ($key === null) {
                
                // compute the key after calling computeExtraConditions as it initializes some useful cache
                $key = self::computeKey(
                    $id_product,
                    $id_shop,
                    $id_currency,
                    $id_country,
                    $id_group,
                    $quantity,
                    $id_product_attribute,
                    $id_customer,
                    $id_cart,
                    $real_quantity
                );
            }
                        
            $query = '
			SELECT *, ' . SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer) . '
				FROM `' . _DB_PREFIX_ . 'specific_price`
				WHERE
                `id_shop` ' . self::formatIntInQuery(0, $id_shop) . ' AND
                `id_currency` ' . self::formatIntInQuery(0, $id_currency) . ' AND
                `id_country` ' . self::formatIntInQuery(0, $id_country) . ' AND
                `id_group` ' . self::formatIntInQuery(0, $id_group) . ' ' . $query_extra . '
				AND IF(`from_quantity` > 1, `from_quantity`, 0) <= ';

            $query .= (static::$psQtyDiscountOnCombination || !$id_cart || !$real_quantity) ? (int) $quantity : max(1, (int) $real_quantity);
            $query .= ' ORDER BY `id_product_attribute` DESC, `id_cart` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC, `to` DESC, `from` DESC';
            
            self::$_specificPriceCache[$key] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($query); ///// TUTAJ NIE WYKONUJE
                
        }
        
        return self::$_specificPriceCache[$key];
    }

 

 

Taka modyfikacje dobrze uaktywnia promocje pod warunkiem ze koszyk jest pusty.

Edited by zmora.vip (see edit history)
Link to comment
Share on other sites

On 12/11/2021 at 9:51 AM, atomek said:

1. Ciasteczka, spróbuj w ten sposób:

dodaj do standardowego cookie nową wartość, która będzie przechowywała czas ważności

$cookie = Context::getContext()->cookie;
$cookie->__set('my_var_expire', time() + 5 * 60);

// jak potrzeba dodaj też inne wartości np.
$cookie->__set('my_var_data', 'moje dane');

// $cookie->write(); // to jest wywoływane automatycznie w destruktorze klasy, w razie potrzeby można wymusić wcześniejsze zapisanie


sprawdzić ważność Twoich danych możesz w ten sposób:

$cookie = Context::getContext()->cookie;
if ($cookie->__isset('my_var_expire')) {
    if (($expire = $cookie->__get('my_var_expire')) > time()) { // jest ważne
        
        // jakieś działanie
        
    } else {
        
        // inne działanie
    }
}


2. Nie bardzo rozumiem czemu chcesz usuwać zawartość koszyka klienta gdy zmieni się cena produktu. Ceny produktów w koszyku są "wyliczane" automatycznie, i są zależne od aktualnej ceny produktu (np. ustawionej promocji).
    Sam koszyk Presty nie przechowuje cen. Zobacz tabele ps_cart*

 

@atomek Twój sposób jak najbardziej działa i chyba to było rozwiązanie mojego problemu. Dziękuje Ci za pomoc. Czy nie będzie problemu gdy będę w ten sposób dodawał dużą ilość zmiennych, potencjalnie każdy produkt będzie na promocji.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...