yii2-cart (модуль корзины с виджетами)
yii2-cart (модуль корзины с виджетами)
Всем привет.
https://github.com/pistol88/yii2-cart
Модуль корзины для YII2. Корзина привязывается к пользователю и хранится в базе данных. Если пользователь не авторизирован, создается временный идентификатор в сессии пользователя, корзина привязывается к нему на время жизни сессии.
В корзину можно закинуть любую модель, которая имлементирует \pistol88\cart\interfaces\CartElement. Такую модель можно передать в один из виджетов, который выведет кнопку "купить", поле для ввода количества, выбор опций и т.д. (все работает аяксом). Отдельный виджет - вывод списка товаров. Впрочем, зачем я это рассказываю, когда полный список виджетов и прочая информация есть в ридми на Гитхабе.
Это просто корзина, заказ пока вы должны написать самостоятельно. Отдельный модуль оформления заказа у меня еще в разработке.
https://github.com/pistol88/yii2-cart
Модуль корзины для YII2. Корзина привязывается к пользователю и хранится в базе данных. Если пользователь не авторизирован, создается временный идентификатор в сессии пользователя, корзина привязывается к нему на время жизни сессии.
В корзину можно закинуть любую модель, которая имлементирует \pistol88\cart\interfaces\CartElement. Такую модель можно передать в один из виджетов, который выведет кнопку "купить", поле для ввода количества, выбор опций и т.д. (все работает аяксом). Отдельный виджет - вывод списка товаров. Впрочем, зачем я это рассказываю, когда полный список виджетов и прочая информация есть в ридми на Гитхабе.
Это просто корзина, заказ пока вы должны написать самостоятельно. Отдельный модуль оформления заказа у меня еще в разработке.
Последний раз редактировалось pistol 2016.05.08, 21:00, всего редактировалось 4 раза.
Re: yii2-cart (модуль корзины с виджетами)
1. где psr?
2. достается из интерфейса id, который в интерфейсе не описан
3. yii::$app, Yii::$app
4. захардкоженные ссылки в js
5. false вместо исключений
6. хардкод хранилища
вообще объем работы вроде и неплохой, но настолько все неаккуратно - я такие либы сразу закрываю после открытия. отсутствие кодстайла по psr уже сразу "нет".
2. достается из интерфейса id, который в интерфейсе не описан
3. yii::$app, Yii::$app
4. захардкоженные ссылки в js
5. false вместо исключений
6. хардкод хранилища
вообще объем работы вроде и неплохой, но настолько все неаккуратно - я такие либы сразу закрываю после открытия. отсутствие кодстайла по psr уже сразу "нет".
Re: yii2-cart (модуль корзины с виджетами)
Спасибо за указание на косяки! PSR по части отступов и {} не соблюден из-за моей борьбы с автоформатером Нетбинс, только сейчас посмотрел, как код форматится на Гитхабе, чуть сам не проблевался. Завтра исправлю.
Был бы также рад, если кто-то подсказал архитектурные косяки.
Был бы также рад, если кто-то подсказал архитектурные косяки.
Re: yii2-cart (модуль корзины с виджетами)
6. хардкод хранилища
создайте интерфейс CartItemService c геттерами для Cart, чтобы не хардкодить AR внутри
создайте интерфейс CartItemService c геттерами для Cart, чтобы не хардкодить AR внутри
Re: yii2-cart (модуль корзины с виджетами)
В контроллере:
В представлении применяю виджет:
но выдаёт ошибку: Call to a member function getPriceTypeId() on null
для метода модели Product:
и товар не ложится в корзину. Что не так?
Код: Выделить всё
public function actionCategory()
{
$slug = Yii::$app->request->get('slug');
$category = Category::find()->where(['slug' => $slug])->asArray()->all();
$products = Product::find()->where(['category_id' => $category[0]['id']])->all();
return $this->render('category',[
'products' => $products,
]);
}
Код: Выделить всё
<?php
foreach ($products as $product) {
/* код шаблона */
echo BuyButton::widget([
'model' => $product,
'text' => 'В корзину',
'htmlTag' => 'a',
]) ?>
}
?>
для метода модели Product:
Код: Выделить всё
public function getPriceModel($type = null)
{
$prices = $this->getPrices();
if(!$prices->count()) {
return null;
}
if(!$type) {
if($defaultType = Yii::$app->getModule('shop')->getPriceTypeId($this)) {
$type = $defaultType;
} else {
$type = 'sort';
}
}
if($type == 'sort') {
$price = $prices->where('price > 0')->orderBy('sort DESC')->one();
} elseif($type) {
$price = $prices->where(['type_id' => $type])->one();
} else {
$price = $prices->orderBy('price DESC')->one();
}
return $price;
}
Re: yii2-cart (модуль корзины с виджетами)
Вы еще используете yii2-shop. Скорее всего, не подключили его в modules секции config.yurik777 писал(а): ↑2017.03.16, 11:00 В контроллере:В представлении применяю виджет:Код: Выделить всё
public function actionCategory() { $slug = Yii::$app->request->get('slug'); $category = Category::find()->where(['slug' => $slug])->asArray()->all(); $products = Product::find()->where(['category_id' => $category[0]['id']])->all(); return $this->render('category',[ 'products' => $products, ]); }
но выдаёт ошибку: Call to a member function getPriceTypeId() on nullКод: Выделить всё
<?php foreach ($products as $product) { /* код шаблона */ echo BuyButton::widget([ 'model' => $product, 'text' => 'В корзину', 'htmlTag' => 'a', ]) ?> } ?>
для метода модели Product:и товар не ложится в корзину. Что не так?Код: Выделить всё
public function getPriceModel($type = null) { $prices = $this->getPrices(); if(!$prices->count()) { return null; } if(!$type) { if($defaultType = Yii::$app->getModule('shop')->getPriceTypeId($this)) { $type = $defaultType; } else { $type = 'sort'; } } if($type == 'sort') { $price = $prices->where('price > 0')->orderBy('sort DESC')->one(); } elseif($type) { $price = $prices->where(['type_id' => $type])->one(); } else { $price = $prices->orderBy('price DESC')->one(); } return $price; }
-
- Сообщения: 1
- Зарегистрирован: 2018.05.26, 01:53
Re: yii2-cart (модуль корзины с виджетами)
Отображение корзины в основном меню на вашем скрине идеально подходит для моей задачи. У меня возникли некоторые проблемы, если можно так выразиться.
В виджете Nav bootstrap прописываю такой пункт, который показываетcя через dropdown
Элементы itemsPage, itemsCategory, itemsCompany берутся из параметров виджета, если кто не понимает. (Данный код - это view виджета меню)
Сама корзина работает так как надо. Но отображается не с ровень с меню (как на картинке), а второй строкой.
После некоторого анализа пришёл к выводу, что там используется тег div, а в меню, как известно, используется теги li
Может это конечно и правильно, но как тогда выровнить корзину, чтобы она была наравне с другими элементами, как на картинке.
Как можно заметить я его переопределил. Как можно добиться того же без переопределения? Задаю данный вопрос по той причине, что придётся переопределить много чего. (view, контроллер и может там что-то ещё) Раз на картинке так, то может быть можно добиться этого и так, надеюсь. А то что это за параметр ['type' => ElementsList::TYPE_DROPDOWN], которым нельзя нормально пользоваться.
P.S. Часть меню, как можно заметить по коду, вложенное. Да, ещё, модуль использую отсюда https://github.com/dvizh/yii2-cart. Пишу первый раз на данном форуме. Прошу прощения за некоторые повторения и возможную грубость.
В виджете Nav bootstrap прописываю такой пункт, который показываетcя через dropdown
Код: Выделить всё
$itemsMenuStatic = [
['label' => 'Ключи', 'url' => ['shop/keys'], 'options' => ['class' => 'dropdown dropdown-large'],],
['label' => 'Аккаунты', 'url' => '#',
'options' => ['class' => 'dropdown dropdown-large'],
'items' => [
['label' => 'Компании', 'url' => NULL,
'options' => ['class' => 'col-lg-4 col-md-4'],
'items' => $itemsCompany,
],
['label' => 'Категории', 'url' => NULL,
'options' => ['class' => 'col-lg-7 col-md-6'],
'items' => $itemsCategory,
],
],
],
];
$itemsMenu = array_merge($itemsMenuStatic, $itemsPage);
$itemsMenu[] = \frontend\widgets\CartList::widget(['type' => ElementsList::TYPE_DROPDOWN]);
echo yii\bootstrap\Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
'encodeLabels' => FALSE,
'items' => $itemsMenu
]);
Сама корзина работает так как надо. Но отображается не с ровень с меню (как на картинке), а второй строкой.
После некоторого анализа пришёл к выводу, что там используется тег div, а в меню, как известно, используется теги li
Может это конечно и правильно, но как тогда выровнить корзину, чтобы она была наравне с другими элементами, как на картинке.
Как можно заметить я его переопределил. Как можно добиться того же без переопределения? Задаю данный вопрос по той причине, что придётся переопределить много чего. (view, контроллер и может там что-то ещё) Раз на картинке так, то может быть можно добиться этого и так, надеюсь. А то что это за параметр ['type' => ElementsList::TYPE_DROPDOWN], которым нельзя нормально пользоваться.
P.S. Часть меню, как можно заметить по коду, вложенное. Да, ещё, модуль использую отсюда https://github.com/dvizh/yii2-cart. Пишу первый раз на данном форуме. Прошу прощения за некоторые повторения и возможную грубость.
Re: yii2-cart (модуль корзины с виджетами)
Как переопределить class для кнопки корзины? а так же чтобы вместо цены выводилось количество, а еще хотелось бы иконку к записи вывести
<?=ElementsList::widget(['type' => ElementsList::TYPE_DROPDOWN]);?>
<?=ElementsList::widget(['type' => ElementsList::TYPE_DROPDOWN]);?>