[v0.9] ShoppingCart
Re: [v0.7] ShoppingCart
А такой глупый вопрос. Как его установить?
Сделал пока так, всю папку кинул в extensions. а файл интерфейса в компоненты. Правильно ли?
Сделал пока так, всю папку кинул в extensions. а файл интерфейса в компоненты. Правильно ли?
Re: [v0.7] ShoppingCart
Не совсем. Надо ВСЕ положить в одну папку, а в `protected/config/main.php` добавить:systemiv писал(а):А такой глупый вопрос. Как его установить?
Сделал пока так, всю папку кинул в extensions. а файл интерфейса в компоненты. Правильно ли?
Код: Выделить всё
'import'=>array(
'[ТВОЯ_ПАПКА].shoppingCart.*'
),
'components' => array(
'shoppingCart' =>
array(
'class' => '[ТВОЯ_ПАПКА].shoppingCart.EShoppingCart',
),
)
Re: [v0.7] ShoppingCart
Сработало, вот так
application.extensions.shoppingCart.*
Если убрать application то будет ошибка
Alias "extensions.shoppingCart.*" is invalid. Make sure it points to an existing directory or file.
application.extensions.shoppingCart.*
Если убрать application то будет ошибка
Alias "extensions.shoppingCart.*" is invalid. Make sure it points to an existing directory or file.
Re: [v0.7] ShoppingCart
Псевдоним для расширений - ext , т.е., такая строка должна была быть - ext.shoppingCart.*systemiv писал(а):Сработало, вот так
application.extensions.shoppingCart.*
Если убрать application то будет ошибка
Alias "extensions.shoppingCart.*" is invalid. Make sure it points to an existing directory or file.
См. http://yiiframework.ru/doc/guide/ru/basics.namespace
[Редкие] Записки пещерного человека
Re: [v0.7] ShoppingCart
при подключении корзины не через конфиг, т.е. вот так:
появлялась ошибка
Код: Выделить всё
$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()));
}
Re: [v0.7] ShoppingCart
не знаю, потестить надо будет
кстати нашел баг
Ну и в вызовах тоже poistion везде
кстати нашел баг
Код: Выделить всё
/**
* onUpdatePoistion event
* @param $event
* @return void
*/
public function onUpdatePoistion($event) {
$this->raiseEvent('onUpdatePoistion', $event);
}
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: [v0.7] ShoppingCart
Аккаунт yiiext и желание поправить есть?
Нравится Yii? Давайте сделаем его лучше!.
Re: [v0.7] ShoppingCart
А как в корзину к товару добавить еще один параметр (размер, к примеру)? Если доп. параметр находится НЕ в той самой модели продукции.
Re: [v0.7] ShoppingCart
Нашел кстати ещё 1 баг.
Поведение ECartPositionBehaviour навешивается столько раз, сколько указано $quantity у товара. Т.е., если установлен EShoppingCart::refresh = TRUE(что идет по дефолту), то модель будет рефрешиться $quantity раз
Лечится:
класс EShoppingCart, метод update
Строку
нужно заменить на
Поведение ECartPositionBehaviour навешивается столько раз, сколько указано $quantity у товара. Т.е., если установлен EShoppingCart::refresh = TRUE(что идет по дефолту), то модель будет рефрешиться $quantity раз
Лечится:
класс EShoppingCart, метод update
Строку
Код: Выделить всё
$position->attachBehavior("CartPosition", new ECartPositionBehaviour());
Код: Выделить всё
$position->detachBehavior("CartPosition");
$position->attachBehavior("CartPosition", new ECartPositionBehaviour());
Re: [v0.7] ShoppingCart
По идее добавить паблик свойство в нужную модель, и перед добавлением в корзину заполнять его из другой моделиNokyta писал(а):А как в корзину к товару добавить еще один параметр (размер, к примеру)? Если доп. параметр находится НЕ в той самой модели продукции.
Re: [v0.7] ShoppingCart
Я делал так: была модель Product - непосредственно сам товар. У нее relation - variants - варианты товара. Цена указывалась непосредственно в варианте товара. К ней же прикреплялось поведение shoppingCart'aNokyta писал(а):А как в корзину к товару добавить еще один параметр (размер, к примеру)? Если доп. параметр находится НЕ в той самой модели продукции.
Re: [v0.7] ShoppingCart
Обновил корзину до 0.9
1. В класс EShoppingCart добавлено свойство cartId, что позволяет создавать несколько независимых друг от друга корзин. По умолчанию cartId = 'EShoppingCart'
2. Исправлено название события onUpdatePoistion на onUpdatePosition
3. Исправлен баг, когда поведение ECartPositionBehaviour на модель навешивалось $quantity количество раз, соответственно при вытаскивании корзины из сессии было $quantity селектов из БД для каждой модели, которая находится в корзине
4. Добавлена возможность объявлять корзину прямо в коде, а не в конфиге(ранее при попытке такого создания появлялась ошибка с __PHP_Incomplete_Class)
Забрать можно из свн или во вложении
1. В класс EShoppingCart добавлено свойство cartId, что позволяет создавать несколько независимых друг от друга корзин. По умолчанию cartId = 'EShoppingCart'
2. Исправлено название события onUpdatePoistion на onUpdatePosition
3. Исправлен баг, когда поведение ECartPositionBehaviour на модель навешивалось $quantity количество раз, соответственно при вытаскивании корзины из сессии было $quantity селектов из БД для каждой модели, которая находится в корзине
4. Добавлена возможность объявлять корзину прямо в коде, а не в конфиге(ранее при попытке такого создания появлялась ошибка с __PHP_Incomplete_Class)
Забрать можно из свн или во вложении
- Вложения
-
- shoppingCart_0.9.zip
- (15.08 КБ) 262 скачивания
Re: [v0.7] ShoppingCart
Вот мой вариант, с виртуальной моделью В одном проекте логика была такая, что нет четкой модели связанной непосредственно с нужным товаром. Если таблицы товаров, есть таблицы продавцов этого товара. Итоговый элемент, который попадает в корзину, это комбинация таблицы товара и таблицы продавца.
Значит вначале определяем виртульную модель, от которой будем наследоваться (методы определены для того, чтобы не возникало ошибки).
дальше определяем класс для работы с корзиной
дальше пользуемся моделью Basket:
после этого, когда нужно к примеру посмотреть корзину или провести с ней другие манипуляции, то делаем следующее (собственно это аналог findByPk() для нормальной модели):
Значит вначале определяем виртульную модель, от которой будем наследоваться (методы определены для того, чтобы не возникало ошибки).
Код: Выделить всё
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 = new Basket();
/* заполняем атрибуты $basket->id=... */
if($basket->test()) {
Yii::app()->shoppingCart->put($basket, 1);
}
Код: Выделить всё
$cart = new Basket();
$cart->restore($key);
/* и к примеру обновляем колличество товара */
Yii::app()->shoppingCart->update($cart, $value);
- nizsheanez
- Сообщения: 814
- Зарегистрирован: 2011.04.29, 13:09
- Откуда: Москва
Re: [v0.7] ShoppingCart
В доках ошибочка: в примере для метода contains используется не contains, а itemAt