Работа с сессией

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Работа с сессией

Сообщение nihaha »

Делаю корзину товаров с использованием сессии для временного хранения выбранных товаров.
Из вьюхи передаю через ajax id товара в метод контроллера и получаю объект товара по его id:

Код: Выделить всё

public function actionAdd($id) {

    $product = Product::findOne($id);

    $session = Yii::$app->session;
    $session->open();

    $cart = new Cart();
    $cart->addToCart($product);

    $this->layout = false;
    return $this->render('cart-modal', compact('session'));
}
здесь открываю сессию, обращаюсь к методу модели Cart для добавления товара в сессию:

Код: Выделить всё

public function addToCart($product, $qty = 1) {

    if(isset($_SESSION['cart'][$product->id])) {
        $_SESSION['cart'][$product->id]['qty'] += $qty;
    } else {
        $_SESSION['cart'][$product->id] = [
            'qty' => $qty,
            'title' => $product->title,
            'price' => $product->price,
            'image' => $product->image,
        ];
    }

    $_SESSION['cart.qty'] = isset($_SESSION['cart.qty']) ? $_SESSION['cart.qty'] + $qty : $qty;
    $_SESSION['cart.sum'] = isset($_SESSION['cart.sum']) ? $_SESSION['cart.sum'] + $qty * $product->price : $qty * $product->price;
}
При первом добавлении товар оказывается в сессии и в выводе я получаю полные данные, все ок, но при повторном клике на этот товар или при добавлении нового товара данные сессии то ли обнуляются, то ли еще что происходит и в корзине оказывается новый товар, а предыдущий пропадает...

Не могу найти в чем у меня ошибка, прошу помочь.
Спасибо.
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Работа с сессией

Сообщение Onotole »

Есть же готовые решения
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Работа с сессией

Сообщение nihaha »

И все же хотелось бы разобраться почему такая петрушка.
Аватара пользователя
vikweb
Сообщения: 25
Зарегистрирован: 2009.09.23, 16:07
Откуда: Краматорск
Контактная информация:

Re: Работа с сессией

Сообщение vikweb »

несмотря на то что isset($_SESSION['cart'][$product->id]) вроде правильная функция у меня на практике часто почему то именно при работе с массивами плохо работает.
Я обычно делаю так:

Код: Выделить всё

        if(!@$_SESSION['cart']){
            $_SESSION['cart']=[];
        }
        if(array_key_exists($product->id, $_SESSION['cart'])){
            ....
        }else{
           ....
        }
Разработка на Yii:VikWeb.Net
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Работа с сессией

Сообщение nihaha »

Мне кажется, что проблема кроется в другом.
Где бы я ни вызывал

Код: Выделить всё

$session = Yii::$app->session;
$session->open();
вместо открытия предыдущей сессии создается новая.
Работаю я на локальном сервере (OpenServer) и он складывает сессии в папку Temp и там у меня куча сессий с единичными записям.
Это очень странно, ведь рядом на этом же сервере аналогичный проект работает нормально...
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Работа с сессией

Сообщение nihaha »

Короче, проблема была в опенсервере. Перенес на хостинг и все заработало.
Это очень странно, потому что на опенсервере рядом ну практически идентичный проект лежит с той же логикой и все работает отлично.
Nicolai6120
Сообщения: 143
Зарегистрирован: 2014.08.13, 15:08

Re: Работа с сессией

Сообщение Nicolai6120 »

Почему Вы работает с $_SESSION напрямую как с массивом? Есть же красивые методы get/set ? И еще много красивых методов. Код становится чище и читабельнее. Просто откройте доку по нужному компоненту. http://www.yiiframework.com/doc-2.0/yii ... ssion.html
Ответить