yii2-cart (модуль корзины с виджетами)

Выкладываем свои наработки
Ответить
Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

yii2-cart (модуль корзины с виджетами)

Сообщение pistol » 2016.05.07, 15:18

Всем привет.

https://github.com/pistol88/yii2-cart

Модуль корзины для YII2. Корзина привязывается к пользователю и хранится в базе данных. Если пользователь не авторизирован, создается временный идентификатор в сессии пользователя, корзина привязывается к нему на время жизни сессии.

В корзину можно закинуть любую модель, которая имлементирует \pistol88\cart\interfaces\CartElement. Такую модель можно передать в один из виджетов, который выведет кнопку "купить", поле для ввода количества, выбор опций и т.д. (все работает аяксом). Отдельный виджет - вывод списка товаров. Впрочем, зачем я это рассказываю, когда полный список виджетов и прочая информация есть в ридми на Гитхабе.

Это просто корзина, заказ пока вы должны написать самостоятельно. Отдельный модуль оформления заказа у меня еще в разработке.

Изображение
Последний раз редактировалось pistol 2016.05.08, 21:00, всего редактировалось 4 раза.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cart (модуль корзины с виджетами)

Сообщение zelenin » 2016.05.07, 17:13

1. где psr?
2. достается из интерфейса id, который в интерфейсе не описан
3. yii::$app, Yii::$app
4. захардкоженные ссылки в js
5. false вместо исключений
6. хардкод хранилища

вообще объем работы вроде и неплохой, но настолько все неаккуратно - я такие либы сразу закрываю после открытия. отсутствие кодстайла по psr уже сразу "нет".

Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: yii2-cart (модуль корзины с виджетами)

Сообщение pistol » 2016.05.07, 17:40

Спасибо за указание на косяки! PSR по части отступов и {} не соблюден из-за моей борьбы с автоформатером Нетбинс, только сейчас посмотрел, как код форматится на Гитхабе, чуть сам не проблевался. Завтра исправлю.

Был бы также рад, если кто-то подсказал архитектурные косяки.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: yii2-cart (модуль корзины с виджетами)

Сообщение zelenin » 2016.05.07, 17:46

6. хардкод хранилища

создайте интерфейс CartItemService c геттерами для Cart, чтобы не хардкодить AR внутри

yurik777
Сообщения: 1
Зарегистрирован: 2017.03.16, 10:47

Re: yii2-cart (модуль корзины с виджетами)

Сообщение 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,
        ]);
    }
В представлении применяю виджет:

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

<?php
 foreach ($products as $product) {
 /* код шаблона */
echo BuyButton::widget([
                            'model' => $product,
                            'text' => 'В корзину',
                            'htmlTag' => 'a',
                        ]) ?>
}
?>
но выдаёт ошибку: Call to a member function getPriceTypeId() on null
для метода модели 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;
    }
и товар не ложится в корзину. Что не так?

Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: yii2-cart (модуль корзины с виджетами)

Сообщение pistol » 2017.03.27, 05:37

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,
        ]);
    }
В представлении применяю виджет:

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

<?php
 foreach ($products as $product) {
 /* код шаблона */
echo BuyButton::widget([
                            'model' => $product,
                            'text' => 'В корзину',
                            'htmlTag' => 'a',
                        ]) ?>
}
?>
но выдаёт ошибку: Call to a member function getPriceTypeId() on null
для метода модели 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;
    }
и товар не ложится в корзину. Что не так?
Вы еще используете yii2-shop. Скорее всего, не подключили его в modules секции config.

nikolajzaigrin
Сообщения: 1
Зарегистрирован: 2018.05.26, 01:53

Re: yii2-cart (модуль корзины с виджетами)

Сообщение nikolajzaigrin » 2018.05.26, 03:09

Отображение корзины в основном меню на вашем скрине идеально подходит для моей задачи. У меня возникли некоторые проблемы, если можно так выразиться.
В виджете 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
]);
Элементы itemsPage, itemsCategory, itemsCompany берутся из параметров виджета, если кто не понимает. (Данный код - это view виджета меню)

Сама корзина работает так как надо. Но отображается не с ровень с меню (как на картинке), а второй строкой.

После некоторого анализа пришёл к выводу, что там используется тег div, а в меню, как известно, используется теги li
Может это конечно и правильно, но как тогда выровнить корзину, чтобы она была наравне с другими элементами, как на картинке.

Как можно заметить я его переопределил. Как можно добиться того же без переопределения? Задаю данный вопрос по той причине, что придётся переопределить много чего. (view, контроллер и может там что-то ещё) Раз на картинке так, то может быть можно добиться этого и так, надеюсь. А то что это за параметр ['type' => ElementsList::TYPE_DROPDOWN], которым нельзя нормально пользоваться.

P.S. Часть меню, как можно заметить по коду, вложенное. Да, ещё, модуль использую отсюда https://github.com/dvizh/yii2-cart. Пишу первый раз на данном форуме. Прошу прощения за некоторые повторения и возможную грубость.

Ответить