Yii2 Вывод списка подкатегорий

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
untercop
Сообщения: 1
Зарегистрирован: 2023.03.11, 15:48

Yii2 Вывод списка подкатегорий

Сообщение untercop »

Добрый день. Вопрос следующий: есть посты(post изображения камер), есть подкатегории(category месторасположение камер, двор, дорога и т.д.) и есть категории (city посёлок, город)

В базе имеется таблица постов 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
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Yii2 Вывод списка подкатегорий

Сообщение unknownby »

Посмотрите как вариант зависимые списки. Для примера ссылку на виджеты от картика, возможно сами что-то придумаете или используете готовое решение
https://demos.krajee.com/widget-details/depdrop
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Yii2 Вывод списка подкатегорий

Сообщение SiZE »

Вопрос следующий: есть посты(post изображения камер), есть подкатегории(category месторасположение камер, двор, дорога и т.д.) и есть категории (city посёлок, город)
А в чем вопрос?)
Ответить