Магазин на Yii2, часть 5. Виджет для вывода популярных брендов
05.05.2019
Теги: Web-разработка • Yii2 • ИнтернетМагазин • КаталогТоваров • Практика • Фреймворк
В левой колонке, под меню каталога, предусмотрен блок популярных брендов. Этот блок показывается на всех страницах сайта, так что оформим его в виде виджета. Все по аналогии с виджетом меню каталога — создаем в директории components
файл BrandsWidget.php
и view-шаблон в поддиректории views
.
Добавим в модель еще один метод, который возвращает массив популярных брендов:
<?php namespace app\models; use yii\db\ActiveRecord; class Brand extends ActiveRecord { /*...*/ /** * Возвращает массив популярных брендов и * количество товаров для каждого бренда */ public function getPopularBrands() { // получаем бренды с наибольшим кол-вом товаров $brands = self::find() ->select([ 'id' => 'brand.id', 'name' => 'brand.name', 'count' => 'COUNT(*)' ]) ->innerJoin( 'product', 'product.brand_id = brand.id' ) ->groupBy([ 'brand.id', 'brand.name' ]) ->orderBy(['count' => SORT_DESC]) ->limit(10) ->asArray() // для дальнейшей сортировки ->indexBy('name') ->all(); // теперь нужно отсортировать бренды по названию ksort($brands); return $brands; } /*...*/ }
<?php namespace app\components; use app\models\Brand; use yii\base\Widget; /** * Виджет для вывода списка брендов каталога */ class BrandsWidget extends Widget { public function run() { // пробуем извлечь данные из кеша $html = Yii::$app->cache->get('widget-brands'); if ($html === false) { // данных нет в кеше, получаем их заново $brands = (new Brand())->getPopularBrands(); $html = $this->render('brands', ['brands' => $brands]); // сохраняем полученные данные в кеше Yii::$app->cache->set('widget-brands', $html); } return $html; } }
<?php /* * Файл components/views/brands.php */ use yii\helpers\Html; use yii\helpers\Url; ?> <ul> <?php foreach ($brands as $brand): ?> <li> <a href="<?= Url::to(['catalog/brand', 'id' => $brand['id']]); ?>"> <span class="badge pull-right"><?= $brand['count']; ?></span> <?= Html::encode($brand['name']); ?> </a> </li> <?php endforeach; ?> </ul>
Вставляем вызов виджета в view-шаблоны views/page/index.php
(главная страница сайта) и views/catalog/category.php
(категория каталога):
<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"> <!-- основной контент страницы --> </div> </div> </div> </section>
- Магазин на Yii2, часть 35. Админка: загрузка картинок для страниц и страница 404
- Магазин на Yii2, часть 34. Показываем меню страниц в публичной части
- Магазин на Yii2, часть 33. Админка: приводим в порядок CRUD-код для страниц
- Магазин на Yii2, часть 32. Админка: удаление категорий и CRUD для страниц
- Магазин на Yii2, часть 31. Админка: загрузка изображений для категорий и брендов
- Магазин на Yii2, часть 30. Админка: WYSIWYG-редактор и изображение для товара
- Магазин на Yii2, часть 29. Админка: добавляем список товаров категории
Поиск: Web-разработка • Yii2 • Интернет магазин • Каталог товаров • Практика • Фреймворк