[v0.9] ShoppingCart

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

Re: [v0.7] ShoppingCart

Сообщение systemiv »

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

Re: [v0.7] ShoppingCart

Сообщение kosenka »

systemiv писал(а):А такой глупый вопрос. Как его установить?
Сделал пока так, всю папку кинул в extensions. а файл интерфейса в компоненты. Правильно ли?
Не совсем. Надо ВСЕ положить в одну папку, а в `protected/config/main.php` добавить:

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

'import'=>array(
    '[ТВОЯ_ПАПКА].shoppingCart.*'
),

'components' => array(
  'shoppingCart' =>
    array(
        'class' => '[ТВОЯ_ПАПКА].shoppingCart.EShoppingCart',
    ),
)

[ТВОЯ_ПАПКА] может быть папка extensions или components.
systemiv
Сообщения: 360
Зарегистрирован: 2011.06.26, 22:55
Откуда: Липецк
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение systemiv »

Сработало, вот так
application.extensions.shoppingCart.*
Если убрать application то будет ошибка
Alias "extensions.shoppingCart.*" is invalid. Make sure it points to an existing directory or file.
Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение Caveman »

systemiv писал(а):Сработало, вот так
application.extensions.shoppingCart.*
Если убрать application то будет ошибка
Alias "extensions.shoppingCart.*" is invalid. Make sure it points to an existing directory or file.
Псевдоним для расширений - ext , т.е., такая строка должна была быть - ext.shoppingCart.*
См. http://yiiframework.ru/doc/guide/ru/basics.namespace
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение rak »

при подключении корзины не через конфиг, т.е. вот так:

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

$cart = Yii::createComponent(array(
    'class' => 'application.components.shoppingCart.EShoppingCart'
));
 
появлялась ошибка
Fatal error: CartWidget::renderCartMenu(): The script tried to execute a method or access a property of an incomplete object.
Получилось исправить данную ситуацию несколькими правками расширения:

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

public function __construct() {        
    parent::__construct();
    $this->init();
}
public function restoreFromSession() {
    $data = unserialize(Yii::app()->getUser()->getState(__CLASS__));
//...
}
protected function saveState() {
    Yii::app()->getUser()->setState(__CLASS__, serialize($this->toArray()));
}
 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение samdark »

Работе через конфиг не мешает?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение rak »

не знаю, потестить надо будет
кстати нашел баг

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

 /**
     * onUpdatePoistion event
     * @param  $event
     * @return void
     */
    public function onUpdatePoistion($event) {
        $this->raiseEvent('onUpdatePoistion', $event);
    }
 
Ну и в вызовах тоже poistion везде
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение samdark »

Аккаунт yiiext и желание поправить есть?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение rak »

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

Re: [v0.7] ShoppingCart

Сообщение samdark »

rak, т.е. и то и то уже есть? :)
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение rak »

не, желание есть, аккаунта нету =)
Nokyta
Сообщения: 3
Зарегистрирован: 2011.08.02, 08:47

Re: [v0.7] ShoppingCart

Сообщение Nokyta »

А как в корзину к товару добавить еще один параметр (размер, к примеру)? Если доп. параметр находится НЕ в той самой модели продукции.
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение rak »

Нашел кстати ещё 1 баг.
Поведение ECartPositionBehaviour навешивается столько раз, сколько указано $quantity у товара. Т.е., если установлен EShoppingCart::refresh = TRUE(что идет по дефолту), то модель будет рефрешиться $quantity раз
Лечится:
класс EShoppingCart, метод update
Строку

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

$position->attachBehavior("CartPosition", new ECartPositionBehaviour());
 
нужно заменить на

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

$position->detachBehavior("CartPosition");
$position->attachBehavior("CartPosition", new ECartPositionBehaviour());
 
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение rak »

Nokyta писал(а):А как в корзину к товару добавить еще один параметр (размер, к примеру)? Если доп. параметр находится НЕ в той самой модели продукции.
По идее добавить паблик свойство в нужную модель, и перед добавлением в корзину заполнять его из другой модели
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: [v0.7] ShoppingCart

Сообщение mitaichik »

Nokyta писал(а):А как в корзину к товару добавить еще один параметр (размер, к примеру)? Если доп. параметр находится НЕ в той самой модели продукции.
Я делал так: была модель Product - непосредственно сам товар. У нее relation - variants - варианты товара. Цена указывалась непосредственно в варианте товара. К ней же прикреплялось поведение shoppingCart'a
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение rak »

Обновил корзину до 0.9
1. В класс EShoppingCart добавлено свойство cartId, что позволяет создавать несколько независимых друг от друга корзин. По умолчанию cartId = 'EShoppingCart'
2. Исправлено название события onUpdatePoistion на onUpdatePosition
3. Исправлен баг, когда поведение ECartPositionBehaviour на модель навешивалось $quantity количество раз, соответственно при вытаскивании корзины из сессии было $quantity селектов из БД для каждой модели, которая находится в корзине
4. Добавлена возможность объявлять корзину прямо в коде, а не в конфиге(ранее при попытке такого создания появлялась ошибка с __PHP_Incomplete_Class)
Забрать можно из свн или во вложении
Вложения
shoppingCart_0.9.zip
(15.08 КБ) 262 скачивания
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение slavcodev »

rak почему не в SVN?
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [v0.7] ShoppingCart

Сообщение samdark »

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

Re: [v0.7] ShoppingCart

Сообщение alexzv »

Вот мой вариант, с виртуальной моделью ;-) В одном проекте логика была такая, что нет четкой модели связанной непосредственно с нужным товаром. Если таблицы товаров, есть таблицы продавцов этого товара. Итоговый элемент, который попадает в корзину, это комбинация таблицы товара и таблицы продавца.

Значит вначале определяем виртульную модель, от которой будем наследоваться (методы определены для того, чтобы не возникало ошибки).

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

class VirtualRecord extends CModel
{
    public function attributeNames(){}
    public function onBeforeSave(){}
    public function onAfterSave(){}
    public function onBeforeDelete(){}
    public function onAfterDelete(){}
    public function onBeforeFind(){}
    public function onAfterFind(){}
    public function onAfterConstruct(){}
    public function refresh($terminate=true,$anchor=''){}
} 
дальше определяем класс для работы с корзиной

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

class Basket extends VirtualRecord implements IECartPosition
{
    public $id;
    public $id_product;
    public $id_seller;
    /* и другие поля модели */

    public function getId()
    {
        /* получаем ID модели, как комбинация ID товара и ID продавца */
    }

    public function getPrice()
    {
        return $this->price;
    }

    public function test()
    {
        /* проверяем, заполнены ли все необходимые поля */
    }

    public function restore($id)
    {
        /* восстанавливаем модели по ее ID (это комбинация ID товара и ID продавца) */
   }
} 
дальше пользуемся моделью Basket:

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

$basket = new Basket();
/* заполняем атрибуты $basket->id=... */
if($basket->test()) {
    Yii::app()->shoppingCart->put($basket, 1);
} 
после этого, когда нужно к примеру посмотреть корзину или провести с ней другие манипуляции, то делаем следующее (собственно это аналог findByPk() для нормальной модели):

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

$cart = new Basket();
$cart->restore($key);
/* и к примеру обновляем колличество товара */
Yii::app()->shoppingCart->update($cart, $value);
 
Аватара пользователя
nizsheanez
Сообщения: 814
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

Re: [v0.7] ShoppingCart

Сообщение nizsheanez »

В доках ошибочка: в примере для метода contains используется не contains, а itemAt
Ответить