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