понедельник, 6 июня 2011 г.

Красивые URL в Yii

Немного застопорившись в изучении Yii, и не совершив ничего выдающегося, напишу о не очень выдающимся. О том, как сделать красивые человекопонятные URL в Yii. О необходимости иметь красивые URL сказано в руководстве http://www.artlebedev.ru/kovodstvo/sections/48/ не стоит игнорировать этот совет, тем более, что это так легко сделать!
Для начала я почитал три отличные статьи про это:
http://yiiframework.ru/doc/guide/ru/topics.url
http://www.simplecoding.org/yii-php-framework-sozdayom-igrovoj-sajt-chast-11-chelovekoponyatnye-url.html
http://www.yiiframework.com/doc/api/1.1/CUrlManager

После этого легко сделал то, что надо для своего проекта http://psyhos.vnet.ee/catalog/
Первое:
В файле Z:\home\catalog.loc\www\protected\config\main.php настроил массив urlManager

'urlManager'=>array(
'urlFormat'=>'path',   
'rules'=>array(
'<_c:(assortiment|category)>/'=>'<_c>/view',
'assortiment/category='=>'assortiment/index', 
),
'showScriptName'=>false,

),
Я хочу, чтобы пользователь мог бы стереть с конца URL часть строки до косой черты и получил бы ожидаемый результат. Так и получилось:
http://psyhos.vnet.ee/catalog/ - корень моего сайта можно задать, чтобы отображалась любая страница (через файл Z:\home\catalog.loc\www\protected\config\main.php), сейчас отображается каталог (assortiment)

http://psyhos.vnet.ee/catalog/assortiment - корень моего каталога
http://psyhos.vnet.ee/catalog/assortiment/2 - обзор товара с id=2
http://catalog.loc/assortiment/category=3 – список товаров категории 3

Остальные страницы сайта я пока не трогаю. Ими потом займусь отдельно, напишу модуль управления «статичными страницами».
В разделе rules строка
'<_c:(assortiment|category)>/'=>'<_c>/view',
Часть строки до знака «=» означает: Именованный параметр _c принимает значение assortiment или category, затем идет GET параметр id равный любому числу. Это то, что будет видно в URL например assortiment\2. Мой сайт расшифрует это как _c (то есть assortiment или category), действие view и тот же параметр id равный любому числу. Тут в одном правиле я описал поведение сразу для двух контроллеров: assortiment и category. Это правило сработает, когда пользователь выберет просмотр конкретного товара или конкретной категории. Если же пользователь удалит циферку сзади строки, то попадет в корень каталога.
Второе правило для выбора по категориям, то есть когда отображаются только товары определенной категории.
'assortiment/category='=>'assortiment/index',
Когда в строке URL будет 'assortiment/category=любому числу сайт выполнит 'assortiment/index' GET[‘category’]=этому числу.

Взглянув на своей сайт со стороны (отойдя на два шага от монитора), понял, что моё меню breadcrumbs совсем не логичное! Его надо изменить.

В файле Z:\home\catalog.loc\www\protected\views\layouts\main.php

widget('zii.widgets.CBreadcrumbs', array(
'links'=>$this->breadcrumbs,
'homeLink'=>CHtml::link('Catalog','/catalog/assortiment' ),
 )); ?>


Homelink ведёт в 'Catalog','/assortiment'

В файле Z:\home\catalog.loc\www\protected\views\assortiment\index.php

$this->breadcrumbs = array($this->findCategory()->name);

findCategory() надо описать в контроллере Assortiment. Файл Z:\home\catalog.loc\www\protected\controllers\AssortimentController.php.
Создаём в нем функцию
/**
* Find category name by id.
* return array
*/ 
public function findCategory()
{ 
$model = Category::model()->findByPk((int)$_GET['category']); 
return $model; 

} 


Когда выбран конкретный товар, показывается, в какой он категории.

Вот, кажется и всё.
Продолжение следует.

1 комментарий: