URL страниц и их категории из БД

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
MixJay
Сообщения: 8
Зарегистрирован: 2015.02.19, 13:51

URL страниц и их категории из БД

Сообщение MixJay »

Доброго дня! Помогите пожалуйста разобраться...
Есть 2 таблицы. Конфигурация basic.
Таблица категорий (category):
category_id
category_title
category_url

Таблица страниц (page):
page_id
page_title
page_url
category_id

* category_url & page_url содержат только символы a-z, дефисы

Подскажите пожалуйста как вывести данные из таблицы page по такому принципу:
/category_url/page_url (example.com/news/novost-name-1)
Если же category_url для данной страницы не найден в таблице (без категории), то вывести:
/page_url (example.com/novost-name-1)
Если страницы в БД не существует и в базовом SiteController нет подобного Action, вывести 404 ошибку.
В тюрьме столько не сидят, сколько вы в Интернете...
Аватара пользователя
GreenJunior
Сообщения: 43
Зарегистрирован: 2014.07.20, 20:30

Re: URL страниц и их категории из БД

Сообщение GreenJunior »

Для начала тебе нужно категорию и страницу передать в виде ГЕТ параметоров
пример:

Код: Выделить всё

http://site.ru?category_id=12&page_id=33  
затем внимательно читай доки по URL Manager http://www.yiiframework.com/doc-2.0/gui ... uting.html
Кроме того не забудь выставить свой конроллер, контроллером по-умолчанию, иначе будет что-то вроде:

Код: Выделить всё

http://site.ru/all-pages?category_id=12&page_id=33  
В общем задача подъемная, будет сложнее если у тебя будет иерархия категорий
Все когда-то начинали
Аватара пользователя
MixJay
Сообщения: 8
Зарегистрирован: 2015.02.19, 13:51

Re: URL страниц и их категории из БД

Сообщение MixJay »

Спасибо большое за направление в нужное русло. Буду пробовать разбираться.
Вложенности категорий не будет (так и задумывалось).
В тюрьме столько не сидят, сколько вы в Интернете...
Аватара пользователя
MixJay
Сообщения: 8
Зарегистрирован: 2015.02.19, 13:51

Re: URL страниц и их категории из БД

Сообщение MixJay »

Перерыл много информации, но примеров не нашел, либо они не явные. Уже попёрла отсебятина... всё не то. =(
Мог бы кто чуть более подробно разжевать реализацию URL из БД?
В тюрьме столько не сидят, сколько вы в Интернете...
Аватара пользователя
Bethrezen
Сообщения: 42
Зарегистрирован: 2011.04.17, 15:06
Откуда: Tambov
Контактная информация:

Re: URL страниц и их категории из БД

Сообщение Bethrezen »

MixJay, разжевать лень, но можете посмотреть как это сделано в https://github.com/devgroup-ru/dotplant2
Если кратко - делайте свои UrlRule, там разбирайте урл на части и ищите свои ЧПУ в базе.
Если нет - return false и yii2 пойдет по следующему правилу
DotPlant 2 - Open-source yii2 e-commerce CMS :: GitHub | Official site | Made by DevGroup
Аватара пользователя
MixJay
Сообщения: 8
Зарегистрирован: 2015.02.19, 13:51

Re: URL страниц и их категории из БД

Сообщение MixJay »

Вернулся к этому вопросу...

Пока что набросал так:

Конфиг (web.php):

Код: Выделить всё

        'urlManager' => [
            'enablePrettyUrl' => true,    // def - false
            'showScriptName' => false,        // def - true
            'rules' => [
                '' => 'site/index',

                [
                    'class' => 'app\components\PageUrl',
                    'connectionID' => 'db',
                ],

                /* ------ общие правила ------ */
                '<controller:\w+>/<id:\d+>'=>'<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
            ],
        ],
 
Далее создал папку components, а в ней файл PageUrl.php:

Код: Выделить всё

<?php

namespace app\components;

use app\models\Page;
use app\models\Category;
use yii\web\UrlRule;
use Yii;

class PageUrl extends UrlRule
{
    public $connectionID = 'db';

    public function init()
    {
        if ($this->name === null) {
            $this->name = __CLASS__;
        }
    }

    public function createUrl($manager, $route, $params)
    {
        //if ($route === 'page/view' && isset($params['id']))
        if ($route === 'page/view')
        {
            if (isset($params['category_link'], $params['page_link'])) {
                return $params['category_link'] . '/' . $params['page_link'];
            }
            elseif (isset($params['page_link'])) {
                return $params['page_link'];
            }
        }
        return false;
    }

    public function parseRequest($manager, $request)
    {
        $pathInfo = $request->getPathInfo();

        if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches))
        {
            $iCount = count($matches);
            //echo $iCount; exit;   //test

            if ($iCount === 4)
            {
                $modelCat = Category::findOne(['category_link' => $matches[1]]);

                if ($modelCat !== null)
                {
                    $modelPage = Page::findOne(['page_link' => $matches[3]]);

                    if ($modelPage !== null)
                    {
                        $route = 'page/view'; // ???????????????
                        $params = ['page_link' => $modelPage, 'category_link' => $modelCat ];   // ???????????????

                        return [$route, $params];
                    }
                }
            }
            else if ($iCount === 2)
            {
                $modelPage = Page::findOne(['page_link' => $matches[1]]);

                if ($modelPage !== null)
                {
                    $route = 'page/view';   // ???????????????
                    $params = ['page_link' => $modelPage ];   // ???????????????

                    return [$route, $params];
                }
            }
        }
        return false;
    }
}
Вопросами пометил пока что неясные места (как и что передать)...
И пока не понял что именно должно быть в контроллере PageController. Пока что он стандартный:

Код: Выделить всё

<?php

namespace app\controllers;

use Yii;
use app\models\Category;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;

class PageController extends Controller
{
    public function actionIndex()
    {
        $searchModel = new Category();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

    public function actionView($id)
    {
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    protected function findModel($id)
    {
        if (($model = Category::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}
В тюрьме столько не сидят, сколько вы в Интернете...
Ответить