Настройка Чпу

Доброе утро всем, эт снова я :D Помогите пожалуйста настроить ЧПУ. За основу взял yiiframework.com/extension/seo/, там первый абзац - SeoRecordBehavior. Все подключил вроде как нужно, но прикол в том что оно не работает, вообще… Т.е. никаких ошибок не выдает, но и ссылки вообще не меняются :blink:

По остальным пунктам настроил, а с этими ссылками гребаными никак. Modrewrite включен, серв настроен, т.е. изначально ЧПУ настроены, но сейчас они имеют вид site.ru/film/4.html, а хочется по чулавечески чтоб было, вроде этого -site.ru/film/Сайлент Хилл 2.html - к примеру. Очень надеюсь на вашу помощь, спасибо :(

Сразу оговорюсь что с этим модулем работать не приходилось.

Он точно обещает изменять ссылки? А как вы эти ссылки генерируете, через $this->createURL()?

А если вбить в браузер site.ru/film/Сайлент Хилл 2.html то получается 404 или идет правильный редирект action?

Спасибо что откликнулись, а то я уж думал на этом форуме вообще живых нет :)

http://localhost/film/Сайлент Хилл 2.html - пишет

Error 404

Системе не удалось найти запрашиваемое действие "СайлентХилл2".

http://localhost/film/СайлентХилл2.html - тоже самое. По идеи да, я не со всем уверен, но насколько я понял он вытаскивает название(в моем случае) из БД, а затем подставляет в url, точнее должен подставить. Но интерестно то что вообще ничего не происходит, ошибок нет, но и не работает, вообщем странно это :unsure:

Делаю так:

Прописываю в модели film (Заменил name на title, т.к. насколько я понял это столбцы БД, id, title - id и заголовок новости соответственно в моей таблице)




public function behaviors()

{

    return array(

        array(

            'class'=>'application.components.SeoRecordBehavior',

            'route'=>'model/view',

            'params'=>array('id'=>$this->id, 'name'=>$this->title),  

    );

}

Затем в UrlManager, файле main.php добавляю правило для ссылок


'model/<id:\d+>-<name>.html'=>'model/view',

Так, я понял, сорри за мою тупость,


$model->getUrl(array('foo'=>'bar')

нужно прописать в view.php, правильно ? Только вот я так понимаю значения foo, bar нужно на свои сменить, а вот на какие :blink: , буду благодарен, если подскажите :)

Вот только не пойму как вам репутацию поднять :)

Вы должны понимать что у ЧПУ как минимум две составляющие. Первая- трансляция адресной строки в имя контроллера и экшена, этим занимается UrlManager и правило


'model/<id:\d+>-<name>.html'=>'model/view' 

означает, что адрес /model/23-Silent+hill.html будет направлена в контроллер model действие view. Вам наверное будет правильнее написать правило:


'film/<id:\d+>-<name>.html'=>'film/view' 

и проверить в браузере ссылку /film/23-Silent+hill.html она не должна выдавать 404 а должна отрендерить film/view передав в него переменные $_GET[‘id’] (23) и $_GET[‘name’] (Silent hill)

Когда уже работает первый пункт, можно переходить к второму- програмной генерацией ссылок.


$model->getUrl(array('foo'=>'bar')

этот метод уже передает переменную id- берет её из модели, а вместо ‘foo’=>‘bar’ вам наверное надо ‘name’=>$model->title

Спасибо вам большое, сейчас обязательно попробую это сделать :)

Значит докладываю. В файле main.php прописал как вы и говорили:


'urlManager'=>array(

			'urlFormat'=>'path',

			'showScriptName'=>false,

           // 'urlSuffix'=>'.html',

			'rules'=>array(

				'<controller:\w+>/<id:\d+>'=>'<controller>/view',

				'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

				'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

				'film/<id:\d+>-<name>.html'=>'film/view', // Добавил правило как вы говорили

			),

		),



Затем в модели film.php прописал:




public function behaviors()

{

    return array(

        array(

            'class'=>'application.components.SeoRecordBehavior',

            'route'=>'film/view',

            'params'=>array('id'=>$this->id, 'name'=>$this->title),

        ),

    );

}



Ну и прописал в /views/film/view.php




$model->getUrl(array('name'=>$model->title));



Только ссылка это как вкопанная там так и висит


http://localhost/film/4

Проверил, как вы и говорили

  • вбиваем в строке браузера запрос обрабатывается корректно, т.е. все работает, если же перейти по ссылки с главной страницы, опять получаем

http://localhost/film/4

Я так пологаю здесь где-то ошибка, но что поправить не знаю, уже все перепробовал, как только можно


$model->getUrl(array('name'=>$model->title));

А попробуйте разместить правило ‘film/<id:\d+>…’ самым первым, перед ‘<controller:\w+>/<id:\d+>’=>’<controller>/view’

Тажа петрушка. Чет прям заколдованные ссылки эти :(

Вообщем не знаю насколько это верно, но. Убрав из view.php


$model->getUrl(array('name'=>$model->title));

И переделав заголовок в файле _view.php следующим образом


<a href="<? echo $data->getUrl(array('name'=>$data->title)); ?>"><?php echo $data->title ?></a>

Я получил то что хотел. На оригинальность, правильность не претендую, возможно мои мучения были не напрасны, и кому либо это пригодится. Все же хотел бы услышать что думаете вы по этому поводу, насколько это правильно/неправильно :blink:

ОГРОМНОЕ СПАСИБО Charger за помощь в оживлении данного расширения. Я спать…

Неясно. Лениво настраивать тестовый проект.

Может стукните мне в скайп или асю (в профиле указаны) и через TeamViewer вместе подебажим.

Добрый вечер, ок, добавил в скайп :)