Магазин на Yii2, часть 4. Добавляем новую сущность — бренд

05.05.2019

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

Создадим в базе данных таблицу brand для хранения брендов. И добавим в таблицу product внешний ключ brand_id. Создадим модель для этой сущности, и добавим два action-а в контроллер — которые будут отвечать за показ списка всех брендов и за показ списка товаров выбранного бренда.

--
-- Структура таблицы `brand`
--
CREATE TABLE `brand` (
  `id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'Уникальный идентификатор',
  `name` varchar(255) NOT NULL COMMENT 'Наименование',
  `content` varchar(255) DEFAULT NULL COMMENT 'Краткое описание',
  `keywords` varchar(255) DEFAULT NULL COMMENT 'Мета-тег keywords',
  `description` varchar(255) DEFAULT NULL COMMENT 'Мета-тег description',
  `image` varchar(255) DEFAULT NULL COMMENT 'Имя файла изображения'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
<?php
namespace app\models;

use yii\db\ActiveRecord;

class Brand extends ActiveRecord {

    /**
     * Метод возвращает имя таблицы БД
     */
    public static function tableName() {
        return 'brand';
    }

    /**
     * Метод возвращает массив товаров бренда
     */
    public function getProducts() {
        // связь таблицы БД `brand` с таблицей `product`
        return $this->hasMany(Product::class, ['brand_id' => 'id']);
    }

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

    /**
     * Возвращает массив всех брендов каталога и
     * количество товаров для каждого бренда
     */
    /**
     * Возвращает массив всех брендов каталога и
     * количество товаров для каждого бренда
     */
    public function getAllBrands() {
        $query = self::find();
        $brands = $query
            ->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();
        return $brands;
    }
}
<?php
namespace app\controllers;

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

class CatalogController extends AppController {
    /**
     * Главная страница каталога товаров
     */
    public function actionIndex() {
        // получаем корневые категории
        $root = Category::find()->where(['parent_id' => 0])->all();
        // получаем популярные бренды
        $brands = (new Brand())->getPopularBrands();
        return $this->render('index', compact('root', 'brands'));
    }

    /**
     * Категория каталога товаров
     */
    public function actionCategory($id) {
        $id = (int)$id;
        $temp = new Category();
        // товары категории
        list($products, $pages) = $temp->getCategoryProducts($id);
        // данные о категории
        $category = $temp->getCategory($id);
        // устанавливаем мета-теги для страницы
        $this->setMetaTags(
            $category->name . ' | ' . Yii::$app->params['shopName'],
            $category->keywords,
            $category->description
        );
        return $this->render(
            'category',
            compact('category', 'products', 'pages')
        );
    }

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

    /**
     * Список товаров бренда с идентификатором $id
     */
    public function actionBrand($id) {
        $id = (int)$id;
        $brand = (new Brand())->getBrand($id);
        return $this->render(
            'brand',
            compact('brand')
        );
    }
}

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

Каталог оборудования
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.