Магазин на Yii2, часть 8. Список товаров бренда и все бренды

10.05.2019

Теги: Web-разработкаYii2ИнтернетМагазинКаталогТоваровПрактикаФреймворк

Следующий шаг — вывести список товаров отдельного бренда. И создать страницу всех брендов. Методы в модели для получения списка товаров бренда и получения списка всех брендов у нас уже есть. Методы actionBrand() и actionBrands() в контроллере тоже определены. Осталось только создать файлы view-шаблонов brand.php и brands.php .

<?php
namespace app\models;

use yii\db\ActiveRecord;

class Brand extends ActiveRecord {

    /*...*/

    /**
     * Возвращает информацию о бренде с идентификатором $id
     */
    public function getBrand($id) {
        $id = (int)$id;
        return self::findOne($id);
    }

    /**
     * Возвращает массив всех брендов каталога и
     * количество товаров для каждого бренда
     */
    public function getAllBrands() {
        return self::find()
            ->select([
                'id' => 'brand.id',
                'name' => 'brand.name',
                'content' => 'brand.content',
                'image' => 'brand.image',
                'count' => 'COUNT(*)'
            ])
            ->innerJoin(
                'product',
                'product.brand_id = brand.id'
            )
            ->groupBy([
                'brand.id', 'brand.name', 'brand.content', 'brand.image'
            ])
            ->orderBy(['name' => SORT_ASC])
            ->asArray()
            ->all();
    }

    /**
     * Возвращает массив всех товаров бренда с идентификатором $id
     */
    public function getBrandProducts($id) {
        return Product::find()->where(['brand_id' => $id])->asArray()->all();
    }
}
<?php
namespace app\controllers;

use app\models\Category;
use app\models\Brand;
use app\models\Product;
use Yii;


class CatalogController extends AppController {

    /*...*/

    /**
     * Список всех брендов каталога товаров
     */
    public function actionBrands() {
        $brands = (new Brand())->getAllBrands();
        return $this->render(
            'brands',
            compact('brands')
        );
    }

    /**
     * Список товаров бренда с идентификатором $id
     */
    public function actionBrand($id) {
        $id = (int)$id;
        $temp = new Brand();
        // товары бренда
        $products = $temp->getBrandProducts($id);
        // данные о бренде
        $brand = $temp->getBrand($id);

        return $this->render(
            'brand',
            compact('brand', 'products')
        );
    }
}

Файлы views/catalog/brand.php и views/catalog/brands.php:

<?php
/*
 * Страница списка товаров бренда, файл views/catalog/brand.php
 */

use app\components\TreeWidget;
use app\components\BrandsWidget;
use yii\helpers\Html;
use yii\helpers\Url;
?>

<section>
    <div class="container">
        <div class="row">
            <div class="col-sm-3">
                <h2>Каталог</h2>
                <div class="category-products">
                    <?= TreeWidget::widget(); ?>
                </div>

                <h2>Бренды</h2>
                <div class="brand-products">
                    <?= BrandsWidget::widget(); ?>
                </div>
            </div>

            <div class="col-sm-9">
                <?php if (!empty($products)): /* выводим товары бренда */ ?>
                    <h2><?= Html::encode($brand['name']); ?></h2>
                    <div class="row">
                        <?php foreach ($products as $product): ?>
                            <div class="col-sm-4">
                                <div class="product-wrapper text-center">
                                    <?=
                                    Html::img(
                                        '@web/images/products/medium/'.$product['image'],
                                        ['alt' => $product['name'], 'class' => 'img-responsive']
                                    );
                                    ?>
                                    <h2><?= $product['price']; ?> руб.</h2>
                                    <p>
                                        <a href="<?= Url::to(['catalog/product', 'id' => $product['id']]); ?>">
                                            <?= Html::encode($product['name']); ?>
                                        </a>
                                    </p>
                                    <a href="#" class="btn btn-warning">
                                        <i class="fa fa-shopping-cart"></i>
                                        Добавить в корзину
                                    </a>
                                    <?php
                                    if ($product['new']) { // новинка?
                                        echo Html::tag(
                                            'span',
                                            'Новинка',
                                            ['class' => 'new']
                                        );
                                    }
                                    if ($product['hit']) { // лидер продаж?
                                        echo Html::tag(
                                            'span',
                                            'Лидер продаж',
                                            ['class' => 'hit']
                                        );
                                    }
                                    if ($product['sale']) { // распродажа?
                                        echo Html::tag(
                                            'span',
                                            'Распродажа',
                                            ['class' => 'sale']
                                        );
                                    }
                                    ?>
                                </div>
                            </div>
                        <?php endforeach; ?>
                    </div>
                <?php else: ?>
                    <p>Нет товаров у этого бренда.</p>
                <?php endif; ?>
            </div>
        </div>
    </div>
</section>
<?php
/*
 * Страница списка всех брендов, файл views/catalog/brands.php
 */

use app\components\TreeWidget;
use app\components\BrandsWidget;
use yii\helpers\Html;
use yii\helpers\Url;
?>

<section>
    <div class="container">
        <div class="row">
            <div class="col-sm-3">
                <div class="left-sidebar">
                    <h2>Каталог</h2>
                    <div class="category-products">
                        <?= TreeWidget::widget(); ?>
                    </div>

                    <h2>Бренды</h2>
                    <div class="brand-products">
                        <?= BrandsWidget::widget(); ?>
                    </div>
                </div>
            </div>

            <div class="col-sm-9 padding-right">
                <h1>Все бренды</h1>
                <?php if (!empty($brands)): ?>
                    <div class="row">
                        <?php foreach ($brands as $brand): ?>
                            <div class="col-sm-6 col-md-4">
                                <div class="thumbnail">
                                    <?=
                                    Html::img(
                                        '@web/images/brands/'.$brand['image'],
                                        ['alt' => $brand['name']]
                                    );
                                    ?>
                                    <div class="caption">
                                        <h2>
                                            <a href="<?= Url::to(['catalog/brand', 'id' => $brand['id']]); ?>">
                                                <?= Html::encode($brand['name']); ?>
                                            </a>
                                        </h2>
                                        <p><?= Html::encode($brand['content']); ?></p>
                                    </div>
                                </div>
                            </div>
                        <?php endforeach; ?>
                    </div>
                <?php endif; ?>
            </div>
        </div>
    </div>
</section>

И внесем изменения в файл конфигурации config/web.php:

<?php
/*...*/
$config = [
    /*...*/
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                'catalog/category/<id:\d+>' => 'catalog/category',
                'catalog/brand/<id:\d+>' => 'catalog/brand',
            ],
        ],
    ],
    /*...*/
];
/*...*/

Поиск: Web-разработка • Yii2 • Интернет магазин • Каталог товаров • Практика • Фреймворк

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.