[v0.9] ShoppingCart

Выкладываем свои наработки
Аватара пользователя
alexzv
Сообщения: 120
Зарегистрирован: 2010.04.23, 00:10
Откуда: Украина, Киев

Re: [v0.7] ShoppingCart

Сообщение alexzv » 2010.11.03, 18:31

При работе с данным расширением возникла очень интересная ошибка - добавляю я продукт в корзину и после этого браузер умирает (ничего не открывает). Перезапускаешь браузер - опять работает! :D

Сразу понял, что надо копать в сторону сохранения объекта в куки и нашлось решение - при сохранении сериализировать объект, и при получении восстанавливать. Таким образом проблема была решена.

Перегружаем CWebUser и добавляем своих методов.

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

/**
 * _CWebUser class file
 * 
 * Override some functions of Yii core class CWebUser.
 */
class _CWebUser extends CWebUser
{
    public function getCustomState($name,$defaultValue=null)
    {
        return unserialize(parent::getState($name,$defaultValue));
    }
    
    public function setCustomState($name,$value)
    {
        parent::setState($name,serialize($value));
    }
    
    public function clearCustomState($name)
    {
        parent::clearState($name);
    }

}
 
Хотя можно и прямо в расширение внести изменения, но тут надо еще тестировать...

dimanok88
Сообщения: 1
Зарегистрирован: 2010.11.16, 13:38

Re: [v0.7] ShoppingCart

Сообщение dimanok88 » 2010.11.16, 23:18

Вечер добрый!
НЕ могли бы рассказать как можно обновлять данные принадлежащие нескольким таблицам.
У меня есть Две таблицы Диски и Шины. Добавить данные в корзину не возникло проблем, а вот как обновить данные не могу понять, т.к. могут быть одинаковые id, да даже если разные то как можно узнать к какой таблице принадлежит позиция в корзине, чтобы сделать такое?

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

$disc = Disc::model()->findByPk(15);
Yii::app()->shoppingCart->update($disc,10);
 

Аватара пользователя
alexzv
Сообщения: 120
Зарегистрирован: 2010.04.23, 00:10
Откуда: Украина, Киев

Re: [v0.7] ShoppingCart

Сообщение alexzv » 2010.11.17, 12:04

Доброе утро. Одинаковых ID для товаров добавляемых в корзину быть не должно - Вы же сами объявляете метод getId() в моделе. Создавайте такие идентификаторы, чтобы они не пересекались с другими моделями. А по поводу обновления данных - там в документации все подробно написано.

keltanas
Сообщения: 39
Зарегистрирован: 2009.07.15, 10:19
Откуда: Санкт-Петербург
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение keltanas » 2010.12.03, 17:02

На сколько я понимаю, в корзине можно хранить пару id => count.

В качестве id можно использовать артикул товара. Но как быть, если у одного артикула есть различные свойства ( цвет, размер ), которые принадлежат одному артикулу, но являются физически разными товарами? При этом при добавлении товара в корзину покупатель выбирает, с какими именно значениями свойств он хочет купить товар.

Например http://present.ermin.ru/catalog/cat=146/

Планируется ли такое в будущем? Возможно, надо использовать за основу что-то другое, вместо CMap? Напрашивается еще одно поле для хранения, например, серриализованых данных или json...

Может быть в качестве значения сохранять какой-то объект, содержащий как количество позиций, так и другие свойства. А идентификатор товара генерировать в виде хэша?

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

Re: [v0.7] ShoppingCart

Сообщение samdark » 2010.12.05, 03:41

Это как-бы не очень логично для магазина. Вы усложняете. Гораздо эффективнее иметь в базе физические товары: например, чётко будет ясно, что «красного сейчас нет».

В вашем случае можно ключом выбрать строку "артикул-цвет-размер".

pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: [v0.7] ShoppingCart

Сообщение pirrat » 2010.12.07, 01:16

keltanas писал(а):На сколько я понимаю, в корзине можно хранить пару id => count.

В качестве id можно использовать артикул товара. Но как быть, если у одного артикула есть различные свойства ( цвет, размер ), которые принадлежат одному артикулу, но являются физически разными товарами? При этом при добавлении товара в корзину покупатель выбирает, с какими именно значениями свойств он хочет купить товар.

Например http://present.ermin.ru/catalog/cat=146/

Планируется ли такое в будущем? Возможно, надо использовать за основу что-то другое, вместо CMap? Напрашивается еще одно поле для хранения, например, серриализованых данных или json...

Может быть в качестве значения сохранять какой-то объект, содержащий как количество позиций, так и другие свойства. А идентификатор товара генерировать в виде хэша?
Во первых не совсем правильно, когда несколько товаров имеют одинаковый артикул (пусть и одинаковых по каким-то свойствам, но физически разные и в инвентаризации они зачастую считаются различными сущностями), но даже если это так, то принято делать следующим образом:
создается набор простых товаров, которые объединяются в один "групповой" и у каждого свои значения "конфигурируемых" свойств.
т.е. клиент видит один групповой товар с набором конфигурируемых св-тв, но физически в базе хранится вся коллекция "простых" товаров и при добавлении определенной конфигурации в корзину, физически в бд мы добавляем конкретный простой товар группы, а он в свое время имеет уникальный индификатор.


Дописывание библиотеки пока не планируется, ввиду нескольких причин:
1) нет времени.
2) эту библиотеку надо писать в контексте всего магазина, для того чтобы учесть конкретные требования, а не как отдельный компонент. Я лишь попробывал дать базу, от которой можно оттолкнуться для написания своей библиотеки.

Зы: Я специализируюсь на интернет-магазинах, так что если будут вопросы - спрашивайте, возможно что путного посоветую.

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

Re: [v0.7] ShoppingCart

Сообщение samdark » 2010.12.07, 01:30

База не база, но вполне подходит для большинства магазинов, поэтому не согласен про отдельный компонент. Расширение мегаполезное.

pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: [v0.7] ShoppingCart

Сообщение pirrat » 2010.12.07, 01:38

Я наверно просто отвык от "большинства" магазинов и чаще пишу нестандартные решения,заточенные под конкретные требования, потому так и говорю.
Расширение в том виде в каком есть, вполне жизнеспособно (не считая бага со скидками), а дописывать функционал для "большинства магазинов" я даже не знаю какой)

keltanas
Сообщения: 39
Зарегистрирован: 2009.07.15, 10:19
Откуда: Санкт-Петербург
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение keltanas » 2010.12.09, 11:35

Sam Dark писал(а):Это как-бы не очень логично для магазина. Вы усложняете. Гораздо эффективнее иметь в базе физические товары: например, чётко будет ясно, что «красного сейчас нет».
Это не я, честное слово. Это пожелания заказчиков. Они так видят эти товары. Они у них хранятся в базе 1С в таком виде. И у их поставщиков тоже.

Т.е. их склад не учитывает, красная у них там кружка или зеленая лежит. Этого никто не знает. Есть только артикул и кол-во. Но с сайта человек может заказать такую, какая ему больше понравилась, со всеми уточнениями.
pirrat писал(а): Во первых не совсем правильно, когда несколько товаров имеют одинаковый артикул (пусть и одинаковых по каким-то свойствам, но физически разные и в инвентаризации они зачастую считаются различными сущностями), но даже если это так, то принято делать следующим образом:
создается набор простых товаров, которые объединяются в один "групповой" и у каждого свои значения "конфигурируемых" свойств.
т.е. клиент видит один групповой товар с набором конфигурируемых св-тв, но физически в базе хранится вся коллекция "простых" товаров и при добавлении определенной конфигурации в корзину, физически в бд мы добавляем конкретный простой товар группы, а он в свое время имеет уникальный индификатор.
Не знаю даже, какой из путей более тернист..
Логика в этом есть. Но, поймет ли ее человек, который будет управлять товарами на сайте? Они привыкли работать с определенными шаблонами. И им тяжело будет перестраиваться на новые.

Да и запрограммить такой каталог сложнее, чем универсальную корзину... имхо...
pirrat писал(а): Дописывание библиотеки пока не планируется, ввиду нескольких причин:
1) нет времени.
2) эту библиотеку надо писать в контексте всего магазина, для того чтобы учесть конкретные требования, а не как отдельный компонент. Я лишь попробывал дать базу, от которой можно оттолкнуться для написания своей библиотеки.

Зы: Я специализируюсь на интернет-магазинах, так что если будут вопросы - спрашивайте, возможно что путного посоветую.
За это спасибо!
Может и сам займусь доработкой корзины.
Это не нарушит авторских прав? ))

Аватара пользователя
porcelanosa
Сообщения: 547
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: [v0.7] ShoppingCart

Сообщение porcelanosa » 2010.12.26, 23:32

Делаю все как в хелпе:
в хелпе -

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

EShoppingCart::getСount()

Возвращает количество позиций

Yii::app()->shoppingCart->put($book,2);
Yii::app()->shoppingCart->put($book2,3);
Yii::app()->shoppingCart->getСount(); //2

EShoppingCart::getItemsCount()

Возвращает количество товаров

Yii::app()->shoppingCart->put($book,2);
Yii::app()->shoppingCart->put($book2,3);
Yii::app()->shoppingCart->getItemsCount(); //5   
У меня

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

$id = (int)$_POST['id'];
        $quantity = (int)$_POST['qua'];
        $tiles = TilesItems::model()->findByPk($id);
        Yii::app()->shoppingCart->put($tiles, $quantity); //в корзине 1 позиция с id=1 в количестве 1 единица.
        echo Yii::app()->shoppingCart->getItemsСount(); // возвращаем количество  
выскакивает ошибка
EShoppingCart does not have a method named getItemsСount
тоже самое с методом getCount
И самое главное не нашла где в EShoppingCart описан метод getСount
Метод put() вроде бы работает. По-крайней мере ошибку не выбрасывает.
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы

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

Re: [v0.7] ShoppingCart

Сообщение samdark » 2010.12.27, 00:17

Очень странно т.к. у меня работает. А вот и сам метод:

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

/**
     * Returns count of items in shopping cart
     * @return int
     */
    public function getItemsCount() {
        $count = 0;
        foreach ($this as $position)
        {
            $count += $position->getQuantity();
        }

        return $count;
    }
 

Аватара пользователя
porcelanosa
Сообщения: 547
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: [v0.7] ShoppingCart

Сообщение porcelanosa » 2010.12.27, 03:36

В документации в этих методах русская буква С в слове *Count() - при копипасте возникла такая проблема.
Поправьте доки. А то смахивает на деверсию. :D
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы

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

Re: [v0.7] ShoppingCart

Сообщение samdark » 2010.12.28, 04:33

Поправлю. Про диверсии: http://rmcreative.ru/blog/post/trudnovy ... -oshchibka

Аватара пользователя
porcelanosa
Сообщения: 547
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: [v0.7] ShoppingCart

Сообщение porcelanosa » 2010.12.28, 06:44

Sam Dark писал(а):Поправлю. Про диверсии: http://rmcreative.ru/blog/post/trudnovy ... -oshchibka
Ну про диверсию было в шутку.
Кстати почему IDE (netBeans) не подсветило ошибку?
Конечно PHP допускает названия методов на кирилице (по мойму вообще любой unicode возможен), но все же..
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы

Аватара пользователя
porcelanosa
Сообщения: 547
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: [v0.7] ShoppingCart

Сообщение porcelanosa » 2010.12.28, 06:46

Вопросик про ShoppingCart:
А если у меня несколько моделей для разных видов товаров?
Можно ли завести несколько "корзин"?
Как их объединить?
Если конечо, такой функционал вообще предусмотрен.
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы

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

Re: [v0.7] ShoppingCart

Сообщение samdark » 2010.12.28, 06:57

Ну потому и не подсветило, что кириллицу можно использовать.

Из вопросов ничего не пробовал, но из того, что видел в коде:
— Разные модели вроде поддерживаются.
— Несколько корзин можно попробовать завести добавив компонент два раза с разными именами в конфиг (правда, не уверен, что ключи сессии не пересекутся).

oleg
Сообщения: 58
Зарегистрирован: 2010.04.20, 09:19
Откуда: Россия, Воронеж

Re: [v0.7] ShoppingCart

Сообщение oleg » 2010.12.29, 13:19

Очень долго бился с глюком со скидками (когда 10-20 позиций, то $poistion->getSumPrice() возвращает неправильную сумму). Возможно просто не правильно пытался использовать, но в этоге пришел к такому варианту:

Файл ECartPositionBehaviour.php исправил метод addDiscountPrice вот так:

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

public function addDiscountPrice($price) {
        $this->discountPrice = $price;
    } 
И пример файла по расчету скидок:

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

<?php

class ShopDiscount extends IEDiscount
{
    public function apply()
    {
        $userDiscount = 0;

        $user = Users::model()->findByPk(Yii::app()->user->id);
        if( !is_null($user) )
        {
            $userDiscount = $user->discount;
        }
        
        foreach($this->shoppingCart as $position)
        {
            if( $userDiscount > 0 )
            {
                $discountPrice = $userDiscount * $position->getPrice() / 100 * $position->getQuantity();
                $position->addDiscountPrice($discountPrice);
            }
        }
    }
}

?>

Аватара пользователя
porcelanosa
Сообщения: 547
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: [v0.7] ShoppingCart

Сообщение porcelanosa » 2010.12.29, 23:09

если у меня разные модели для разных типов товаров.

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

$book = Book::model()->findByPk(1);
$superbook = SuperBook::model()->findByPk(1);
Yii::app()->shoppingCart->put($book); //в корзине 1 позиция с id=1 в количестве 1 единица.
Yii::app()->shoppingCart->put($superbook); //в корзине 1 позиция с id=1 в количестве 3 единицы.
 
Что в итоге получится 2 товара с одинковым id - а скорее всего 2 единицы товара с id=1 ...
Что же делать?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы

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

Re: [v0.7] ShoppingCart

Сообщение samdark » 2010.12.30, 02:33

Почему с одинаковым? Префиксируем возвращаемый id именем модели и всё выходит как надо.

SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение SpiLLeR » 2011.01.27, 23:38

Кто может подсказать, хочу вывести количество товаров в корзине, пишу:
echo Yii::app()->shoppingCart->getItemsCount(); - валится с ошибками.
Делаю:
$model = new Product(); echo Yii::app()->shoppingCart->getItemsCount(); - все работает.
Кто мне может рассказать эту магию?
З.Ы. на всех страницах где нету экземпляра\ов объекта Product валяться ошибки.
Предупрежден - значит вооружен.
devKP.ru

Ответить