Yii2 Вывод списка подкатегорий
Добавлено: 2023.03.11, 16:14
Добрый день. Вопрос следующий: есть посты(post изображения камер), есть подкатегории(category месторасположение камер, двор, дорога и т.д.) и есть категории (city посёлок, город)
В базе имеется таблица постов post, таблица подкатегорий category, таблица категорий city.
таблицы выглядят следующим образом
На странице вывожу посты из нужных подкатегорий, в этом проблем нет.
Так же могу вывести посты из нужной категории.
Контроллер подкатегорий
Компонент подкатегорий
модель подкатегорий
в нужном месте вставляю виджет меню подкатегорий и соответсвенно получаю весь список подкатегорий и при выборе нужной, получаю посты из этой подкатегории.
По аналогии подкатегорий создал контроллер и модель категорий (City)
Теперь задача при выборе Города, выводить в меню подкатегорий только те, что есть в том или ином посте.
К примеру камера 1, двор, город 1, - Выбираю Город 1 и в меню подкатегорий соответсвенно только - Двор.
Надеюсь доходчиво смог донести )))) если что, извините, с мыслями так же туго как и с навыками в Yii
В базе имеется таблица постов post, таблица подкатегорий category, таблица категорий city.
таблицы выглядят следующим образом
Код: Выделить всё
CREATE TABLE IF NOT EXISTS `post` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`category_id` text NOT NULL,
`city_id` text NOT NULL,
`title` varchar(255) NOT NULL,
`screen` varchar(255) NOT NULL,
`screen2` varchar(255) NOT NULL,
`links` varchar(255) NOT NULL,
`location` varchar(255) NOT NULL,
`ltp` varchar(255) DEFAULT NULL,
`keywords` varchar(255) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
`created` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ;
INSERT INTO `post` (`id`, `category_id`, `city_id`, `title`, `screen`, `screen2`, `links`, `location`, `ltp`, `keywords`, `description`, `created`) VALUES
(1, '2', '1', 'Cam1', 'https://***/cam1/preview.mp4', 'https://***/cam1/preview.jpg', 'https://***/cam1/embed.html', 'Центральная площадь', '78.55747, 50.25281', 'Площадь', 'Площадь', '2022-01-01');
___________________________________________________________________________________________________
CREATE TABLE IF NOT EXISTS `City` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`keywords` varchar(255) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=601 ;
INSERT INTO `City` (`id`, `name`, `keywords`, `description`) VALUES
(1, 'Город-1', ' ', ' '),
(2, 'Город-2', ' ', ' '),
(3, 'Город-3', '', '');
___________________________________________________________________________________________________
CREATE TABLE IF NOT EXISTS `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`keywords` varchar(255) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
INSERT INTO `category` (`id`, `name`, `keywords`, `description`) VALUES
(1, 'Парки', ' ', 'Парк посёлка'),
Так же могу вывести посты из нужной категории.
Код: Выделить всё
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Post extends ActiveRecord
{
public function getCategory(){
return $this->hasOne(Category::className(), ['id' => 'category_id']);
$posts = Post::find()->with('category')->all();
}
public function getCity(){
return $this->hasOne(City::className(), ['id' => 'city_id']);
$posts = Post::find()->with('city')->all();
}
}
Код: Выделить всё
<?php
namespace app\controllers;
use app\models\Category;
use app\models\Post;
class CategoryController extends AppController{
public function actionView(){
$id = \Yii::$app->request->get('id');
$category = Category::findOne($id);
if(empty($category)){
throw new \yii\web\HttpException(404, 'Такой страницы нет...');
}
$query = Post::find()->select('id, title, links, screen, screen2, location')->where(['category_id' => $id]);
$pages = new \yii\data\Pagination(['totalCount' => $query->count(), 'pageSizeParam' => false, 'forcePageParam' => false]);
$posts = $query->offset($pages->offset)->limit($pages->limit)->all();
$this->setMeta($category->name, $category->keywords, $category->description);
return $this->render('view', compact('posts', 'pages'));
}
}
Код: Выделить всё
<?php
namespace app\components;
use yii\base\Widget;
class CatsWidget extends Widget{
public function run(){
$html = \Yii::$app->cache->get('catsMenu');
if(!$html){
$cats = \app\models\Category::find()->select('id, name')->asArray()->orderBy('name')->all();
$html = $this->render('cats', compact('cats'));
\Yii::$app->cache->set('catsMenu', $html, 60);
}
return $html;
}
}
Код: Выделить всё
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Category extends ActiveRecord{
public static function tableName() {
return 'category';
}
}
По аналогии подкатегорий создал контроллер и модель категорий (City)
Теперь задача при выборе Города, выводить в меню подкатегорий только те, что есть в том или ином посте.
К примеру камера 1, двор, город 1, - Выбираю Город 1 и в меню подкатегорий соответсвенно только - Двор.
Надеюсь доходчиво смог донести )))) если что, извините, с мыслями так же туго как и с навыками в Yii