Магазин на Yii2, часть 26. Админка: модели и контроллеры для категорий и товаров
01.09.2019
Теги: CRUD • Web-разработка • Yii2 • ИнтернетМагазин • КаталогТоваров • ПанельУправления • Практика • Фреймворк
Хорошо, с заказами закончили, теперь займемся каталогом. Воспользуемся генератором кода Gii, чтобы создать модели категорий и товаров каталога. После чего с помощью все того же генератора кода создадим контроллеры и представления для реализации функционала просмотра, создания, редактирования и удаления категорий и товаров.
Создаем модели категорий и товаров каталога
Итак, создаем модель категорий каталога:
Table Name: category Model Class Name: Category
<?php namespace app\modules\admin\models; use Yii; /** * This is the model class for table "category". * * @property int $id Уникальный идентификатор * @property int $parent_id Родительская категория * @property string $name Наименование категории * @property string $content Описание категории * @property string $keywords Мета-тег keywords * @property string $description Мета-тег description * @property string $image Имя файла изображения */ class Category extends \yii\db\ActiveRecord { /** * {@inheritdoc} */ public static function tableName() { return 'category'; } /** * {@inheritdoc} */ public function rules() { return [ [['parent_id'], 'integer'], [['name'], 'required'], [['name', 'content', 'keywords', 'description', 'image'], 'string', 'max' => 255], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'parent_id' => 'Parent ID', 'name' => 'Name', 'content' => 'Content', 'keywords' => 'Keywords', 'description' => 'Description', 'image' => 'Image', ]; } }
Создаем модель товаров каталога:
Table Name: product Model Class Name: Product
<?php namespace app\modules\admin\models; use Yii; /** * This is the model class for table "product". * * @property int $id Уникальный идентификатор * @property int $category_id Родительская категория * @property int $brand_id Идентификатор бренда * @property string $name Наименование товара * @property string $content Описание товара * @property string $price Цена товара * @property string $keywords Мета-тег keywords * @property string $description Мета-тег description * @property string $image Имя файла изображения * @property int $hit Лидер продаж? * @property int $new Новый товар? * @property int $sale Распродажа? */ class Product extends \yii\db\ActiveRecord { /** * {@inheritdoc} */ public static function tableName() { return 'product'; } /** * {@inheritdoc} */ public function rules() { return [ [['category_id', 'brand_id', 'name'], 'required'], [['category_id', 'brand_id', 'hit', 'new', 'sale'], 'integer'], [['content'], 'string'], [['price'], 'number'], [['name', 'keywords', 'description', 'image'], 'string', 'max' => 255], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'category_id' => 'Category ID', 'brand_id' => 'Brand ID', 'name' => 'Name', 'content' => 'Content', 'price' => 'Price', 'keywords' => 'Keywords', 'description' => 'Description', 'image' => 'Image', 'hit' => 'Hit', 'new' => 'New', 'sale' => 'Sale', ]; } }
Создадем контроллеры и представления
Контроллеры и представления, реализующие CRUD-операции для категорий каталога:
Model Class: app\modules\admin\models\Category Controller Class: app\modules\admin\controllers\CategoryController View Path: @app/modules/admin/views/category Base Controller Class: app\modules\admin\controllers\AdminController
<?php namespace app\modules\admin\controllers; use Yii; use app\modules\admin\models\Category; use yii\data\ActiveDataProvider; use yii\web\NotFoundHttpException; use yii\filters\VerbFilter; /** * CategoryController implements the CRUD actions for Category model. */ class CategoryController extends AdminController { /** * {@inheritdoc} */ public function behaviors() { return [ 'verbs' => [ 'class' => VerbFilter::class, 'actions' => [ 'delete' => ['POST'], ], ], ]; } /** * Lists all Category models. * @return mixed */ public function actionIndex() { $dataProvider = new ActiveDataProvider([ 'query' => Category::find(), ]); return $this->render('index', [ 'dataProvider' => $dataProvider, ]); } /** * Displays a single Category model. * @param integer $id * @return mixed * @throws NotFoundHttpException if the model cannot be found */ public function actionView($id) { return $this->render('view', [ 'model' => $this->findModel($id), ]); } /** * Creates a new Category model. * If creation is successful, the browser will be redirected to the 'view' page. * @return mixed */ public function actionCreate() { $model = new Category(); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('create', [ 'model' => $model, ]); } /** * Updates an existing Category model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id * @return mixed * @throws NotFoundHttpException if the model cannot be found */ public function actionUpdate($id) { $model = $this->findModel($id); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('update', [ 'model' => $model, ]); } /** * Deletes an existing Category model. * If deletion is successful, the browser will be redirected to the 'index' page. * @param integer $id * @return mixed * @throws NotFoundHttpException if the model cannot be found */ public function actionDelete($id) { $this->findModel($id)->delete(); return $this->redirect(['index']); } /** * Finds the Category model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. * @param integer $id * @return Category the loaded model * @throws NotFoundHttpException if the model cannot be found */ protected function findModel($id) { if (($model = Category::findOne($id)) !== null) { return $model; } throw new NotFoundHttpException('The requested page does not exist.'); } }
Контроллеры и представления, реализующие CRUD-операции для товаров каталога:
Model Class: app\modules\admin\models\Product Controller Class: app\modules\admin\controllers\ProductController View Path: @app/modules/admin/views/product Base Controller Class: app\modules\admin\controllers\AdminController
<?php namespace app\modules\admin\controllers; use Yii; use app\modules\admin\models\Product; use yii\data\ActiveDataProvider; use yii\web\NotFoundHttpException; use yii\filters\VerbFilter; /** * ProductController implements the CRUD actions for Product model. */ class ProductController extends AdminController { /** * {@inheritdoc} */ public function behaviors() { return [ 'verbs' => [ 'class' => VerbFilter::class, 'actions' => [ 'delete' => ['POST'], ], ], ]; } /** * Lists all Product models. * @return mixed */ public function actionIndex() { $dataProvider = new ActiveDataProvider([ 'query' => Product::find(), ]); return $this->render('index', [ 'dataProvider' => $dataProvider, ]); } /** * Displays a single Product model. * @param integer $id * @return mixed * @throws NotFoundHttpException if the model cannot be found */ public function actionView($id) { return $this->render('view', [ 'model' => $this->findModel($id), ]); } /** * Creates a new Product model. * If creation is successful, the browser will be redirected to the 'view' page. * @return mixed */ public function actionCreate() { $model = new Product(); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('create', [ 'model' => $model, ]); } /** * Updates an existing Product model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id * @return mixed * @throws NotFoundHttpException if the model cannot be found */ public function actionUpdate($id) { $model = $this->findModel($id); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('update', [ 'model' => $model, ]); } /** * Deletes an existing Product model. * If deletion is successful, the browser will be redirected to the 'index' page. * @param integer $id * @return mixed * @throws NotFoundHttpException if the model cannot be found */ public function actionDelete($id) { $this->findModel($id)->delete(); return $this->redirect(['index']); } /** * Finds the Product model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. * @param integer $id * @return Product the loaded model * @throws NotFoundHttpException if the model cannot be found */ protected function findModel($id) { if (($model = Product::findOne($id)) !== null) { return $model; } throw new NotFoundHttpException('The requested page does not exist.'); } }
- Магазин на Yii2, часть 33. Админка: приводим в порядок CRUD-код для страниц
- Магазин на Yii2, часть 32. Админка: удаление категорий и CRUD для страниц
- Магазин на Yii2, часть 31. Админка: загрузка изображений для категорий и брендов
- Магазин на Yii2, часть 30. Админка: WYSIWYG-редактор и изображение для товара
- Магазин на Yii2, часть 29. Админка: добавляем список товаров категории
- Магазин на Yii2, часть 28. Админка: выбор родителя и список всех категорий
- Магазин на Yii2, часть 27. Админка: приводим в порядок сгенерированный код
Поиск: Web-разработка • Yii2 • Интернет магазин • Каталог товаров • Панель управления • Фреймворк • CRUD • Gii