URLmanager

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

URLmanager

Сообщение wseomix »

Третий день мучаюсь с задачей ЧПУ...

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

<?php 
namespace common\components\seo;
use common\models\Vehicletypes;
use yii\base\Object;
use yii\web\UrlRuleInterface;
 
class SEOVehicles extends Object implements UrlRuleInterface
{
    public function createUrl($manager, $route, $params)
    {
        if ($route === 'kran') {
			if (isset($params['vehicletype_id'])) {
                return '/kran';
            }
        }
        return false;  // данное правило не применимо
    }

    public function parseRequest($manager, $request)
    {
		$url = trim($request->pathInfo, '/'); // удал¤ем слеши из начала и конца url	
        if (true) {
			return ['vehicles/index', ['vehicletype_id' => 1]];
        }
        return false;  // данное правило не применимо
    }

}
Необходимо, чтобы по ['label' => 'kran', 'url' => ['/kran']], отдавало return ['vehicles/index', ['vehicletype_id' => 1]];

Желаемого результата не получаю.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: URLmanager

Сообщение Dominus »

Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: URLmanager

Сообщение ElisDN »

Не срабатывает if (isset($params['vehicletype_id']))
wseomix
Сообщения: 28
Зарегистрирован: 2017.01.12, 15:13

Re: URLmanager

Сообщение wseomix »

Спасибо, поборол. Кому интересно:

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

<?php 
namespace common\components\seo;
use common\models\Vehicletypes;
use yii\base\Object;
use yii\web\UrlRuleInterface;
 
class SEOVehicles extends Object implements UrlRuleInterface
{
    public function createUrl($manager, $route, $params)
    {
     if ($route !== 'vehicles/index' || isset($params['vehicletype_id']) === false) { // провер¤ем, что это маршрут дл¤ страницы и нам передали id-записи
        return false; // return false сообщает UrlManager-у, что мы не смогли построить url и необходимо попробовать применить следующее правило
    } 
	

    $slug = Vehicletypes::find() // тут все просто. Ёто поиск записи в Ѕƒ.
        ->select('vehicletypeslug')
        ->where(
            [
                'id' => $params['vehicletype_id'],
            ]
        )
        ->scalar();
    if ($slug !== false) { // если поиск увенчалс¤ успехом, то неободимо вернуть найденный урл
        return $slug; // слеш в начале дает знать, что это абсолютный url
    }
    return false; // мы ничего не нашли в Ѕƒ :(
    }

    public function parseRequest($manager, $request)
    {
	$url = trim($request->pathInfo, '/'); // удал¤ем слеши из начала и конца url
	$page = Vehicletypes::find() // ищем запись по url
        ->where(
            [
                'vehicletypeslug' => $url,
            ]
        )
        ->one();
		if($page != null){
		$params['VehiclesSearch']['vehicletype_id']=$page->id;
		return ['vehicles/index', $params];}
        return false;  // данное правило не применимо
    }

}
Работает в обе стороны. Генерить урл можно по слагу из БД (url=>"/$slug"')
Ответить