Доброго дня! Помогите пожалуйста разобраться...
Есть 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 ошибку.
URL страниц и их категории из БД
URL страниц и их категории из БД
В тюрьме столько не сидят, сколько вы в Интернете...
- GreenJunior
- Сообщения: 43
- Зарегистрирован: 2014.07.20, 20:30
Re: URL страниц и их категории из БД
Для начала тебе нужно категорию и страницу передать в виде ГЕТ параметоров
пример:
затем внимательно читай доки по URL Manager http://www.yiiframework.com/doc-2.0/gui ... uting.html
Кроме того не забудь выставить свой конроллер, контроллером по-умолчанию, иначе будет что-то вроде:
В общем задача подъемная, будет сложнее если у тебя будет иерархия категорий
пример:
Код: Выделить всё
http://site.ru?category_id=12&page_id=33
Кроме того не забудь выставить свой конроллер, контроллером по-умолчанию, иначе будет что-то вроде:
Код: Выделить всё
http://site.ru/all-pages?category_id=12&page_id=33
Все когда-то начинали
Re: URL страниц и их категории из БД
Спасибо большое за направление в нужное русло. Буду пробовать разбираться.
Вложенности категорий не будет (так и задумывалось).
Вложенности категорий не будет (так и задумывалось).
В тюрьме столько не сидят, сколько вы в Интернете...
Re: URL страниц и их категории из БД
Перерыл много информации, но примеров не нашел, либо они не явные. Уже попёрла отсебятина... всё не то. =(
Мог бы кто чуть более подробно разжевать реализацию URL из БД?
Мог бы кто чуть более подробно разжевать реализацию URL из БД?
В тюрьме столько не сидят, сколько вы в Интернете...
Re: URL страниц и их категории из БД
MixJay, разжевать лень, но можете посмотреть как это сделано в https://github.com/devgroup-ru/dotplant2
Если кратко - делайте свои UrlRule, там разбирайте урл на части и ищите свои ЧПУ в базе.
Если нет - return false и yii2 пойдет по следующему правилу
Если кратко - делайте свои UrlRule, там разбирайте урл на части и ищите свои ЧПУ в базе.
Если нет - return false и yii2 пойдет по следующему правилу
Re: URL страниц и их категории из БД
Вернулся к этому вопросу...
Пока что набросал так:
Конфиг (web.php):
Далее создал папку components, а в ней файл PageUrl.php:
Вопросами пометил пока что неясные места (как и что передать)...
И пока не понял что именно должно быть в контроллере PageController. Пока что он стандартный:
Пока что набросал так:
Конфиг (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>',
],
],
Код: Выделить всё
<?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.');
}
}
}
В тюрьме столько не сидят, сколько вы в Интернете...