Магазин на 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>

Поиск: 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.