Страница 1 из 8

[v0.9] ShoppingCart

Добавлено: 2009.12.12, 15:47
pirrat
Библиотека корзины товаров.

скачать - http://code.google.com/p/yiiext/downloads/list
полная и актуальная документация в архиве.

Re: ShoppingCart

Добавлено: 2009.12.12, 16:04
samdark
Понравилось:
1. CMap.
2. То, что можно таким образом работать с любыми компонентами AR не прописывая ничего в самих моделях.
3. Возможности по заданию количества и подсчёту цен.

Не доделано или не предусмотрено:
1. Поведение делает допущения о именовании полей в модели AR. Они могут и не так называться.
2. Политика по ценам у магазинов бывает разная. Некоторые предпочитают не менять цен уже положенных в корзину товаров.

Вопросы:
1. С анонимными пользователями работать будет?
2. Почему getTotal() возвращает float?

Предлагаю сделать общий компонент на основе наших корзинок.

Re: ShoppingCart

Добавлено: 2009.12.12, 16:11
pirrat
по поводу именования полей:
можно сделать так:
создать интерфейс, который будут обязаны реализовать модели товаров, а в корзине проверять реализуют ли они его ,и если нет кидать исключение.
в интерфейсе будут 2 метода
getPrice() и getId().

С анонимными пользователями работает на ура, при этом после авторизации пользователя корзина сохранятеся.

> Почему getTotal() возвращает float?
потому что ошибка, до рефакторинга этот метод был getCost(), а после забыл обновить комментарий

>Предлагаю сделать общий компонент на основе наших корзинок.
В лс обсудим)

Re: ShoppingCart

Добавлено: 2009.12.12, 20:13
slavcodev
Sam Dark писал(а):Некоторые предпочитают не менять цен уже положенных в корзину товаров.
Отсюда поподробнее пжл, что значит менять цены? вручную что ли?

Re: ShoppingCart

Добавлено: 2009.12.12, 21:23
pirrat
я думаю Сэм имел ввиду следующие:
при данной реализации, цены товаров каждый раз берутся из модели и соответственно в корзине они обновляются при каждой загрузки.

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


Хочу пояснить: я подразумеваю что корзина и заказ это разные сущности, и пока товары в корзине, цена может меняться, но когда товары из корзины оформляются как заказ, вот тогда ставится фиксированная цена + применяются скидки и тд и тп...

Re: ShoppingCart

Добавлено: 2009.12.12, 21:36
slavcodev
Все верное пока человек не сделал заказ, то цены могут и должны меняться в корзине.
Ведь если не будут меняться а товар наоборот подешевел, а в корзине осталась старая цена,
то клиент опять "немножко не доволен" (с).

Re: ShoppingCart

Добавлено: 2009.12.13, 01:41
pirrat
Я допустил ошибку - написал довод не проверив его!
при восстановлении из сессии коллекции моделей, данные НЕ обновляются: т.е. в нашем случае цены отдаются, такие как были при сохранении.
изменить такую ситуацию просто, дописать в подведении CartPositionBehaviour метод

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

    public function __wakeup()
    {
            $this->owner->refresh();
    }  
в новой версии обязательно это учту!

думаю целесообразно, вынести данное поведение в настройку компонента...

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.13, 14:16
pirrat
Обновил пост, а так же обновилось само расширение до версии 0.2

changelog:
1)изменена политика именования полей:
Модели должны реализовывать интерфейс ICartPosition и описать два метода: getId() и getPrice(), иначе выбросит исключение
2)Изменено поведение моделей при восстановлении из сессии: данные обновляются при каждой загрузки.
3) добавлено св-во компонента, при изменение которого в false, поведение моделей при восстановлении из сессии меняется: данные не обновляются.
4)компонент был выделен как отдельное расширение и базируется в директории protected/extensions/CShoppingCart

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.13, 21:59
pirrat
Расширение перебазировано в проект yiiext
http://code.google.com/p/yiiext/

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.20, 13:10
samdark
Как насчёт вот такой возможности: http://habrahabr.ru/blogs/php/78774/ ?

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.20, 14:06
pirrat
идея хорошая, но нужно понять целесообразность установки локов на товар.
с одной стороны - это логичо, если проводить аналогию с корзиной в магазине, то положив товар в корзину, он исчезает с полки и другой человек уже не может его забрать...
с другой - мне кажется, что лок надо ставить не в момент когда товар положен в корзину, а когда корзина оформляется как заказ(хотя очень сильно такое поведение зависит от ситуации) .
В любом случае такой функционал мы можем реализовать как поведение корзины, с возможностью его подключать и отключать!

по реализации такого функционала:
бегло глянув реализацию сессий в yii, нашел там обработчик destroySession, который по идее вызывается при сборке мусора, и перерузив его мы можем реализовать подобный функционал по снятию локов...

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.25, 20:17
samdark
Текущий прогресс по расширению:

[*] Проверки интерфейса изменены на нативные проверки PHP.
[*] Класс переименован в CShoppingCart.
[+] Написаны модульные тесты.
[+] Единичные элементы можно складывать в корзинку как в массив (не очень хорошо оттестировано).

Всплыли первые проблемы с CMap:
— Использование count($cart) и количество однотипного товара (в приципе не очень критично).
— Запихивание в корзинку неподходящей модели:

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

$cart = new CShoppingCart();
$cart[] = Post::model()->findByPk(1);
 

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.29, 15:06
pirrat
исправил "Запихивание в корзинку неподходящей модели".

http://code.google.com/p/yiiext/source/detail?r=69
Использование count($cart) и количество однотипного товара (в приципе не очень критично).
не понял.
я предполагал что count возвращает кол-во позиций, а getTotal - кол-во товаров, так что поидее все верно.

Дописал тесты.
Все тесты проходит успешно.

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.29, 15:47
samdark
С count() всё более-менее неплохо.

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

$this->setUp();
$cart = new CShoppingCart();

// Почему тут 1? Почему не 2 или ничего? Можно ли получить 1 автоматом?
$cart[1] = Post::model()->findByPk(1);
 

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.29, 15:50
pirrat
да я ошибся в написании теста, тут ключ не нужен, ключ сам устанавливается через метод getId
закомитил.
Зы: все время забываю при комите, добавить комментарий к ревизии(

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.29, 15:57
pirrat
Нужно обсудить вопрос именования методов.
Поскольку например есть метод count и метод getTotal.
надо привести к одному виду, либо все без приставки get, либо все с ней.

Так же надо бы перевести все комментарии на En.

После чего думаю, можно давать статус первой релиз версии расширению, если не будет предложении по добавлению функционала.

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.29, 16:08
samdark
put, remove — эти так лучше и оставить.
getTotal — можно переименовать, чтобы отражал суть. Например, в getItemsCount.
getCost — вроде нормально.
saveAsOrder — это что?

«перевести все комментарии на En» — могу взять на себя.

Re: [v0.2beta] ShoppingCart

Добавлено: 2009.12.29, 16:12
pirrat
saveAsOrder - это я забыл удалить...
«перевести все комментарии на En» — могу взять на себя.
Я не против, так как умею читать на en, а вот писать хоть и могу, но часто с ошибками)

согласен с переименованием getTotal


Закомитил все вышесказанное..

Re: [v0.5 rc1] ShoppingCart

Добавлено: 2010.02.12, 12:55
pirrat
ShoppingCart был изменен.
и имеет версию v0.5 rc2

Исправлены ошибки:
При восстановлении из сессии была ошибка с обновлением кол-ва товаров.
Неверно был перегружен метод add класса CMap.
и ещё что то по мелочи.

Изменен метод put - теперь работает так:
когда вызывается метод, товар добавляется в корзину, если такой товар там уже есть, то его кол-во не пересчитывается как ранее, а складывается.
например:
вызвав 2 раза метод put

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

$sc->put($product,1);
$sc->put($product,1); 
В корзине окажется 1 товар в кол-ве 2шт.

Так же был добавлен метод update, он обновляет позицию в корзине.
Если товара не было, то он добавляется в корзину, если был, то объект переписывается заново.

Re: [v0.5 rc2] ShoppingCart

Добавлено: 2010.06.26, 13:01
pirrat
Не прошло и года, компонент обновился.
1) добавлены события onUpdatePoistion,onRemovePosition.
2) добавлена простейшая система скидок.
3) добавлены и изменены методы.
4) написана актуальная и полная документация (пока что только на русском)

скачать последнею версию можно тут:
http://code.google.com/p/yiiext/downloads/list