Магазин на 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', ], ], ], /*...*/ ]; /*...*/
- Магазин на Yii2, часть 35. Админка: загрузка картинок для страниц и страница 404
- Магазин на Yii2, часть 34. Показываем меню страниц в публичной части
- Магазин на Yii2, часть 33. Админка: приводим в порядок CRUD-код для страниц
- Магазин на Yii2, часть 32. Админка: удаление категорий и CRUD для страниц
- Магазин на Yii2, часть 31. Админка: загрузка изображений для категорий и брендов
- Магазин на Yii2, часть 30. Админка: WYSIWYG-редактор и изображение для товара
- Магазин на Yii2, часть 29. Админка: добавляем список товаров категории
Поиск: Web-разработка • Yii2 • Интернет магазин • Каталог товаров • Практика • Фреймворк