[v0.9] ShoppingCart

Выкладываем свои наработки
Bartholomew
Сообщения: 110
Зарегистрирован: 2010.02.05, 01:58
Откуда: Нижний Новгород
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение Bartholomew »

Спасибо за расширение!
Несколько вопросов:
1. На всех страницах, кроме непосредственно корзины, отображается только сумма всех товаров в корзине (getCost()). Однако, каждый раз из БД выбираются все данные по всем сохраненным товарам. Как бы отключить такое поведение?
2. Следствие первого вопроса. При входе в админ-панель, корзина продолжает дергать данные из БД. Как это отключить, скажем, для отдельного контроллера?
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: [v0.7] ShoppingCart

Сообщение mitaichik »

Шикарное расширение, спасибо огромное!!!!

Нашел один "недостаток". У меня все модели товаров находятся в модуле catalog. А виджет карзины - на каждой странце сайта. Так вот, когда я нахожусь вне модуля catalog, yii ничего не знает о моделях товаров. Но shoppingCart (который используется в виджете корзины), вместо того, чтобы генерировать ошибку, завершает приложение.

Рецепт прост - заранее импортировать необходимые модели в конфиге в секции import. Но об этом нужно написать в документации, так как ошибка не выдается, и сразу не поймешь из-за чего ты получаешь пустую страницу.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: [v0.7] ShoppingCart

Сообщение Nafania »

Есть предложение ввести такой параметр как Валюта.
Типа так

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

public $currency = 'RUR';
и во всех методах, где возвращается цена, возвращать отформатированное значение, например как

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

return Yii::app()->NumberFormatter->formatCurrency($price, $this->currency);
вместо

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

return $price;
Bartholomew
Сообщения: 110
Зарегистрирован: 2010.02.05, 01:58
Откуда: Нижний Новгород
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение Bartholomew »

Я сделал разные конфиги для админки и для пользовательской части, убрав из конфига для админки подключение компонента shoppingCart (в секции import и в секции components).
Теперь, если в корзине лежит хоть один товар, админка не отображается. Никаких логов, ничего - просто белый экран.
Если товары из корзины удалить - все нормально.
Примерно то же самое описал несколькими постами выше mitaichik. Но у меня никаких обращений к корзине в админке нет.
И я не хочу импортировать файлы корзины в админке - так как при этом на каждой странице дергаются данные о товарах из БД.
Есть ли другое решение проблемы?
Аватара пользователя
Darth_Ixis
Сообщения: 105
Зарегистрирован: 2010.08.23, 10:03
Откуда: KZ, Almaty

Re: [v0.7] ShoppingCart

Сообщение Darth_Ixis »

Этот код

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

public function actionEdit()
    {
        var_dump( Yii::app()->shoppingCart->getCost() ); 
        Yii::app()->end();
    } 
выдает

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

Fatal error: CComponent::__call(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "CTimestampBehavior" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition  in Z:\home\shopcms\vadim\lib\yii\base\CComponent.php on line 260

Call Stack:
    0.0009     341216   1. {main}() Z:\home\shopcms\vadim\frontend.php:0
    0.0322    2624840   2. CWebApplication->runEnd() Z:\home\shopcms\vadim\frontend.php:13
    0.0322    2625040   3. CComponent->__call() Z:\home\shopcms\vadim\lib\yii\base\CComponent.php:0
    0.0322    2625288   4. call_user_func_array() Z:\home\shopcms\vadim\lib\yii\base\CComponent.php:261
    0.0322    2625472   5. WebApplicationEndBehavior->runEnd() Z:\home\shopcms\vadim\lib\yii\base\CComponent.php:0
    0.0336    2636800   6. CApplication->run() Z:\home\shopcms\vadim\application\components\behaviors\WebApplicationEndBehavior.php:28
    0.0337    2636800   7. CWebApplication->processRequest() Z:\home\shopcms\vadim\lib\yii\base\CApplication.php:155
    0.0358    2836168   8. CWebApplication->runController() Z:\home\shopcms\vadim\lib\yii\web\CWebApplication.php:121
    0.0406    3263048   9. CController->run() Z:\home\shopcms\vadim\lib\yii\web\CWebApplication.php:328
    0.0416    3304984  10. CController->runActionWithFilters() Z:\home\shopcms\vadim\lib\yii\web\CController.php:257
    0.0416    3304984  11. CController->runAction() Z:\home\shopcms\vadim\lib\yii\web\CController.php:278
    0.0484    3384544  12. CInlineAction->runWithParams() Z:\home\shopcms\vadim\lib\yii\web\CController.php:300
    0.0485    3385160  13. ShoppingCartController->actionEdit() Z:\home\shopcms\vadim\lib\yii\web\actions\CInlineAction.php:50
    0.2512    6626856  14. EShoppingCart->getCost() Z:\home\shopcms\vadim\application\controllers\frontend\ShoppingCartController.php:30
    0.2517    6638144  15. Product->getSumPrice() Z:\home\shopcms\vadim\application\extensions\shoppingCart\EShoppingCart.php:145
    0.2517    6638344  16. CActiveRecord->__call() Z:\home\shopcms\vadim\lib\yii\db\ar\CActiveRecord.php:0
    0.2517    6638464  17. CComponent->__call() Z:\home\shopcms\vadim\lib\yii\db\ar\CActiveRecord.php:213
А вот этот код

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

public function actionEdit()
    {
        Product::model();
        var_dump( Yii::app()->shoppingCart->getCost() ); 
        Yii::app()->end();
    } 
работает исправно.
Что это за магия такая? Почем нужно вызывать модель до исп. shoppingCart ?
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: [v0.7] ShoppingCart

Сообщение Nafania »

Darth_Ixis писал(а):

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

public function actionEdit()
    {
        Product::model();
        var_dump( Yii::app()->shoppingCart->getCost() ); 
        Yii::app()->end();
    } 
работает исправно.
Что это за магия такая? Почем нужно вызывать модель до исп. shoppingCart ?
Ну судя по ошибке у вас закешировано что-то криво, даже не что-то, а CTimestampBehavior
Аватара пользователя
Darth_Ixis
Сообщения: 105
Зарегистрирован: 2010.08.23, 10:03
Откуда: KZ, Almaty

Re: [v0.7] ShoppingCart

Сообщение Darth_Ixis »

Проверил в другом браузере, с новой сессией, всё окей.
А отчего криво закешироваться могло?

Update
А нет, не работает. Если в корзине есть добавленные товары, выскакивает эта ошибка.
Впрочем, если вызвать модель перед вызовом метода getCost(), всё работает.
Кто-нибудь может объяснить более подробно, почему так?

Update 2
Проблема решена. Нужно вручную подключать все классы используемые в модели. В моём случае это CTimestampBehavior.
Аватара пользователя
Darth_Ixis
Сообщения: 105
Зарегистрирован: 2010.08.23, 10:03
Откуда: KZ, Almaty

Re: [v0.7] ShoppingCart

Сообщение Darth_Ixis »

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

$positions = Yii::app()->shoppingCart->getPositions(); 
Что сейчас находится в переменной $positions? Копия или ссылка на данные?

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

        
foreach ($positions as $position) {
     unset($position->imagePacks);
 }
 
Так вот, атрибут imagePacks уничтожается навсегда. Т.е. потом "Yii::app()->shoppingCart->getPositions()" возвращает мне позиции без атрибута "imagePacks".
Почему так? Ведь в $positions должна содержаться копия данных и манипуляция над ними никак не должна влиять на функцию "Yii::app()->shoppingCart->getPositions()".

Делал так.

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

   
$positions_copy = $positions;
foreach ($positions_copy as $position) {
     unset($position->imagePacks);
}
 
Создается копия переменной $positions, но манипуляция над данными копии, каким-то образом влияет на $positions. Ничего не понимаю.

Upd
Нужно учить матчасть. Всё дело в clone.
antonivanov
Сообщения: 5
Зарегистрирован: 2011.06.17, 22:33

Re: [v0.7] ShoppingCart

Сообщение antonivanov »

Друзья, помогите пожалуйста решить проблему! Использую версию ShoppingCart 0.8 и на продакшене выдается фатал еррор:

ShoppingCart::getAttributes() [<a href='shoppingcart.getattributes'>shoppingcart.getattributes</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Product" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in ..... /protected/components/ShoppingCart.php on line 21

Локально все работает отлично. Подскажите пожалуйста в чем может быть ошибка. Про предыдущий пост где написано о ручной загрузке классов в курсе, пробовал через Yii::import, не помогает. Спасибо.
shmuk
Сообщения: 6
Зарегистрирован: 2011.06.15, 15:16

Re: [v0.7] ShoppingCart

Сообщение shmuk »

Помогите с обновлением корзины. Совсем запутался :(
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение samdark »

antonivanov
Похоже на десериализацию, очень странно, что Yii::import не помогает. Второй параметр при импорте выставлен в true?
antonivanov
Сообщения: 5
Зарегистрирован: 2011.06.17, 22:33

Re: [v0.7] ShoppingCart

Сообщение antonivanov »

Sam Dark писал(а):antonivanov
Похоже на десериализацию, очень странно, что Yii::import не помогает. Второй параметр при импорте выставлен в true?
Выставлен.

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

public function init(){
    Yii::import('application.models.Product',true);
        $this->restoreFromSession();
}
 
Это инициализация модуля. Не помогает :(
Много что пробовал, результатов нет...
Аватара пользователя
Darth_Ixis
Сообщения: 105
Зарегистрирован: 2010.08.23, 10:03
Откуда: KZ, Almaty

Re: [v0.7] ShoppingCart

Сообщение Darth_Ixis »

Импортируйте через конфиг.
antonivanov
Сообщения: 5
Зарегистрирован: 2011.06.17, 22:33

Re: [v0.7] ShoppingCart

Сообщение antonivanov »

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

'import'=>array(
        'application.models.*',
                'application.models.Product',
        'application.extensions.shoppingCart.*',
        'application.components.*',
        'application.extensions.yiidebugtb.*',
        'application.vendors.Smarty.sysplugins.*',
        'application.extensions.CAdvancedArBehavior',
    ),
 
не помогает :(
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение samdark »

А в preload?
antonivanov
Сообщения: 5
Зарегистрирован: 2011.06.17, 22:33

Re: [v0.7] ShoppingCart

Сообщение antonivanov »

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

'preload'=>array(
        'log',
        'viewRenderer',
        'image',
        'application.models.Product',
    ), 
Не помогает
antonivanov
Сообщения: 5
Зарегистрирован: 2011.06.17, 22:33

Re: [v0.7] ShoppingCart

Сообщение antonivanov »

Добрый создатель сего модуля собственноручно прошарил мой проект и решил проблему добавлением "php_value session.auto_start 0" в .htaccess за что ему огромное спасибо!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение samdark »

Эээ, это имеет отношение к корзинке?
systemiv
Сообщения: 360
Зарегистрирован: 2011.06.26, 22:55
Откуда: Липецк
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение systemiv »

А может кто ни будь поделиться контроллером, который использует это расширение?
Интересно посмотреть реализацию в бою
Аватара пользователя
kosenka
Сообщения: 677
Зарегистрирован: 2009.09.26, 12:41
Откуда: москва
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение kosenka »

systemiv писал(а):А может кто ни будь поделиться контроллером, который использует это расширение?
Интересно посмотреть реализацию в бою
Я использую версию version 0.5 rc2 !

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

        public function actionAddBasket()//добавление товара в корзину
        {
                if(Yii::app()->request->isAjaxRequest)//если пришел ajax-запрос
                {
                        $item=Items::model()->findByPk((int)$_GET['id']);//ищем товар по ID
                        if($item and $item->txt_available==Items::AVAILABLE_YES)//товар есть и "доступен" для заказа
                        {
                                Yii::app()->shoppingCart->put($item);//добавляем товар в корзину
                                echo '<p>Товаров: <strong>'.Yii::app()->shoppingCart->getCount().' шт.</strong></p>';//возвращаем кол-во товаров
                                echo '<p>На сумму: <strong>'.Yii::app()->shoppingCart->getCost().' руб.</strong></p>';//сумму товаров
                        }
                        else
                                throw new CHttpException(404,'The requested page does not exist.');//товара нет
                }
                else
                        throw new CHttpException(404,'The requested page does not exist.');//запрос НЕ ajax'овский
        }

        public function actionDeleteBasket()//удаление товара из корзины
        {
                Yii::app()->shoppingCart->remove((int)$_GET['id']);//удаляем товар из корзины по ID
                $this->redirect($this->createUrl('shop/basket'));
        }

        public function actionRecalcBasket()//пересчет товаров в корзине
        {
                if($_POST)//к нам пришел POST
                {
                        foreach($_POST['Items'] as $itemBasket)//перебираем товары в корзине
                        {
                                Yii::app()->shoppingCart->update((int)$itemBasket['id'],$itemBasket['quantity']);//апдейтим у ID - кол-во
                        }
                }
                
                $this->redirect($this->createUrl('shop/basket'));
        }
 
Примерно так.

А это: сохранение товара в базе

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

                        //сохраняем детали заказа
                        foreach(Yii::app()->shoppingCart as $cart)
                        {
                                $cart->orderId=$orders->id;//ID заказа
                                $cart->priceTotal=($cart->quantity*$cart->price);//общая цена позиции
                                OrdersDetails::model()->add($cart);//сохраняем позицию заказа
                        }
 
Ответить