Как правильно организовать вывод изображений в модальном окне корзины?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Как правильно организовать вывод изображений в модальном окне корзины?

Сообщение Igor346 »

Вывод организовываю с помощью CostaRico/yii2-images. Понимание как это сделать в админке в моделях, контроллерах, видах и в видах на основном сайте для отображения на страницах категорий, серий и товаров есть. Но не знаю как это сделать для модального окна корзины с изображением товаров. Да и для страницы с формой тоже не соображу.
Модель

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

<?php
/**
 * Created by PhpStorm.
 * User: Игорь
 * Date: 25.09.2016
 * Time: 22:07
 */

namespace app\models;
use yii\db\ActiveRecord;

class Cart extends ActiveRecord
{

    public function behaviors()
    {
        return [
            'image' => [
                'class' => 'rico\yii2images\behaviors\ImageBehave',
            ]
        ];
    }
    
    public function addToCart($product, $qty = 1)//
    {
        if(isset($_SESSION['cart'][$product->id]))
        {
            $_SESSION['cart'][$product->id]['qty'] += $qty;
        }
        else
        {
            $_SESSION['cart'][$product->id] = [
                'qty' => $qty,
                'name' => $product->name,
                'price' => $product->price_r,
                'img' => $product->img,
                'code' => $product->code,
                'serie' => $product->series->name
            ];
        }

        $_SESSION['cart.qty'] = isset($_SESSION['cart.qty']) ? $_SESSION['cart.qty'] + $qty : $qty;
        $_SESSION['cart.sum'] = isset($_SESSION['cart.sum']) ? $_SESSION['cart.sum'] + $qty * $product->price_r : $qty * $product->price_r;
    }

    public function recalc($id)
    {
        if(!isset($_SESSION['cart'][$id])) return false;
        $qtyMinus = $_SESSION['cart'][$id]['qty'];
        $sumMinus = $_SESSION['cart'][$id]['qty'] * $_SESSION['cart'][$id]['price'];
        $_SESSION['cart.qty'] -= $qtyMinus;
        $_SESSION['cart.sum'] -= $sumMinus;
        unset($_SESSION['cart'][$id]);
    }

}
Контроллер

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

<?php
/**
 * Created by PhpStorm.
 * User: Игорь
 * Date: 25.09.2016
 * Time: 22:02
 */

namespace app\controllers;
use app\models\Products;
use app\models\Cart;
use app\models\Series;
use app\models\OrderItems;
use app\models\Order;
use Yii;


class CartController extends AppController
{

    public function actionAdd()
    {
        $id = Yii::$app->request->get('id');//
        $qty = (int)Yii::$app->request->get('qty');
        $qty = !$qty ? 1 : $qty;
        $product = Products::findOne($id);//
        if (empty ($product)) return false;//
        $session = Yii::$app->session;
        $session->open();
        $cart = new Cart();
        $cart->addToCart($product, $qty);
        if (!Yii::$app->request->isAjax){
            return $this->redirect(Yii::$app->request->referrer);
        }
        $this->layout = false;
        return $this->render('cart-modal', compact('session', 'product'));
    }

    public function actionClear()
    {
        $session = Yii::$app->session;
        $session->open();
        $session->remove('cart');
        $session->remove('cart.qty');
        $session->remove('cart.sum');
        $this->layout = false;
        return $this->render('cart-modal', compact('session'));
    }

    public function actionDelItem()
    {
        $id = Yii::$app->request->get('id');
        $session = Yii::$app->session;
        $session->open();
        $cart = new Cart();
        $cart->recalc($id);
        $this->layout = false;
        return $this->render('cart-modal', compact('session'));
    }

    public function actionShow()
    {
        $session = Yii::$app->session;
        $session->open();
        $this->layout = false;
        $product = Products::findOne($session);
        debug($product);
        return $this->render('cart-modal', compact('session', 'product'));
    }

    public function actionView()
    {
        $session = Yii::$app->session;
        $session->open();
        $product = Products::findOne($session);//
        $this->setMeta('Корзина');
        $order = new Order();
        if ($order->load(Yii::$app->request->post()))
        {
            $order->qty = $session['cart.qty'];
            $order->sum = $session['cart.sum'];
            if ($order->save())
            {
                $this->saveOrderItems($session['cart'], $order->id);
                Yii::$app->session->setFlash('info', 'Заказ принят. В ближайшее время мы с Вами свяжемся.');
                Yii::$app->mailer->compose('order', compact('session', 'order'))
                    ->setFrom(['lea@msvlg.ru' => 'ЮНИТЕКС - Мебель для офиса'])
                    ->setTo(Yii::$app->params['adminEmail'])
                    ->setSubject('Заявка')
                    ->send();
                Yii::$app->mailer->compose('letter', compact('session'))
                    ->setFrom(['lea@msvlg.ru' => 'ЮНИТЕКС - Мебель для офиса'])
                    ->setTo($order->email)
                    ->setSubject('Заявка')
                    ->send();
                $session->remove('cart');
                $session->remove('cart.qty');
                $session->remove('cart.sum');
                return $this->refresh();
            }
            else
            {
                Yii::$app->session->setFlash('error', 'При оформлении произошла ошибка. Пожалуйста свяжитесь с нами для заказа.');
            }
        }
        return $this->render('view', compact('session', 'order', 'letter', 'product'));
    }

    protected function saveOrderItems($items, $order_id)
    {
        foreach ($items as $id => $item) {
            $order_items = new OrderItems();
            $order_items->order_id = $order_id;
            $order_items->product_id = $id;
            $order_items->name = $item['serie'] . ' ' . $item['name'] . ' ' . $item['code'];
            $order_items->price = $item['price'];
            $order_items->qty_item = $item['qty'];
            $order_items->sum_item = $item['qty'] * $item['price'];
            $order_items->save();
        }

    }

}
cart-modal

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

<?
use yii\helpers\Html;
?>



<? if (!empty($session['cart'])): ?>
    <div class="table-responsive">
        <table class="table table-hover table-bordered">
            <thead>
            <tr class="info">
                <th>Фото</th>
                <th>Товар</th>
                <th>Количество</th>
                <th>Цена</th>
                <th><span class="glyphicon glyphicon-remove" aria-hidden="true"></span> </th>
            </tr>
            </thead>
            <tbody>
            <? foreach ($session['cart'] as $id => $item): ?>
                <? $mainImg = $product->getImage() ?>
                <tr>

                    <td><?= Html::img($mainImg->getUrl(), ['height' => '70px']) ?></td>
                    <td>  <?= $item['serie'] ?> <?= $item['name'] ?> <?= $item['code']?></td>
                    <td><?= $item['qty'] ?></td>
                    <td><?= $item['price'] ?></td>
                    <td><span data-id="<?= $id ?>" class="glyphicon glyphicon-remove text-danger del-item" aria-hidden="true"></span></td>
                </tr>
            <? endforeach; ?>
            <tr class="info">
                <td colspan="4">Количество:</td>
                <td><?= $session['cart.qty'] ?> шт. </td>
            </tr>
            <tr class="info">
                <td colspan="4">Всего:</td>
                <td><?= $session['cart.sum'] ?> руб. </td>
            </tr>
            </tbody>
        </table>
    </div>
<? else: ?>
    <h3>Корзина пуста</h3>
<? endif; ?>
cart/view

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

<?
use yii\helpers\Html;
use yii\helpers\Url;
use yii\widgets\ActiveForm;
?>


<div class="page-cart">

    <?php if( Yii::$app->session->hasFlash('info') ): ?>
        <div class="alert alert-info alert-dismissible" role="alert">
            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <?php echo Yii::$app->session->getFlash('info'); ?>
        </div>
    <?php endif;?>

    <?php if( Yii::$app->session->hasFlash('error') ): ?>
        <div class="alert alert-danger alert-dismissible" role="alert">
            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <?php echo Yii::$app->session->getFlash('error'); ?>
        </div>
    <?php endif;?>

    <? if (!empty($session['cart'])): ?>
        <div class="table-responsive">
            <table class="table table-hover table-bordered">
                <thead>
                <tr class="info">
                    <th>Фото</th>
                    <th>Товар</th>
                    <th>Количество</th>
                    <th>Цена</th>
                    <th>Сумма</th>
                    <th><span class="glyphicon glyphicon-remove" aria-hidden="true"></span> </th>
                </tr>
                </thead>
                <tbody>
                <? foreach ($session['cart'] as $id => $item): ?>
                    <tr>
                        <? $mainImg = $product->getImage() ?>
                        <td> <a href="<?= Url::to(['products/view', 'id' => $id])?>"> <?= Html::img($mainImg->getUrl(), ['height' => '70px']) ?></a></td>
                        <td>  <a href="<?= Url::to(['products/view', 'id' => $id])?>"><?= $item['serie'] ?> <?= $item['name'] ?> <?= $item['code']?></a></td>
                        <td><?= $item['qty'] ?></td>
                        <td><?= $item['price'] ?></td>
                        <td><?= $item['price'] * $item['qty'] ?></td>
                        <td><span data-id="<?= $id ?>" class="glyphicon glyphicon-remove text-danger del-item" aria-hidden="true"></span></td>
                    </tr>
                <? endforeach; ?>
                <tr class="info">
                    <td colspan="5">Количество:</td>
                    <td><?= $session['cart.qty'] ?> шт. </td>
                </tr>
                <tr class="info">
                    <td colspan="5">Всего:</td>
                    <td><?= $session['cart.sum'] ?> руб. </td>
                </tr>
                </tbody>
            </table>
        </div>
        <hr/>
        <? $form = ActiveForm::begin()?>
        <?= $form->field($order, 'name')?>
        <?= $form->field($order, 'email')?>
        <?= $form->field($order, 'phone')?>
        <?= $form->field($order, 'address')?>
        <?= Html::submitButton('Отправить', ['class' => 'btn btn-info'])?>
        <? ActiveForm::end()?>
    <? else: ?>
        <h3>Корзина пуста</h3>
    <? endif; ?>
</div>

Последний раз редактировалось Igor346 2017.05.04, 23:44, всего редактировалось 1 раз.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Как правильно организовать вывод изображений в модальном окне корзины?

Сообщение samdark »

Сомневаюсь, что здесь много форумчан использовали именно этот пакет именно для этой задачи...
Аватара пользователя
rodion_zlobin
Сообщения: 207
Зарегистрирован: 2017.01.11, 16:33

Re: Как правильно организовать вывод изображений в модальном окне корзины?

Сообщение rodion_zlobin »

А проблема то в чем? Также как и для
отображения на страницах категорий, серий и товаров есть
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Как правильно организовать вывод изображений в модальном окне корзины?

Сообщение Igor346 »

Поправил записи в контроллере и 2 видах.
Сейчас получается, что при добавлении первого товара в корзину выскакивает модальное окно в котором все хорошо,
- при добавлении 2-го товара он перезаписывает картинку первого т.е. в корзине все отображается правильно, 2-а товара, названия их, количество, цена, а изображения одинаковые второго добавленного.
- В тоже время при открытии корзины не добавлением товара, а кликом на неё, выскакивает модальное окно, в котором все также отображается правильно, кроме картинки, она первого товара (т.е. вообще первого в таблице товаров).
- При переходе на страницу оформления заказа такая же картина, отображается во всех товарах одна картинка первого товара таблицы товаров, даже если добавлен всего один товар у него картинка первого товара таблицы.
Последний раз редактировалось Igor346 2017.05.05, 10:14, всего редактировалось 1 раз.
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: Как правильно организовать вывод изображений в модальном окне корзины?

Сообщение Йож »

Мне напомнило игру в наперстки, кручу, верчу, запутать хочу. Угадай, где нужная картинка..
Смотрите вардампы и дебажте.
Igor346
Сообщения: 87
Зарегистрирован: 2016.09.13, 22:59

Re: Как правильно организовать вывод изображений в модальном окне корзины?

Сообщение Igor346 »

Йож писал(а): 2017.05.05, 06:25 Мне напомнило игру в наперстки, кручу, верчу, запутать хочу. Угадай, где нужная картинка..
Смотрите вардампы и дебажте.
Так и есть. Вот и сижу гадаю :?
Ответить