Yii urlmanager сумасшедшие правила - PullRequest
0 голосов
/ 08 января 2012

доброе утро,

У меня есть еще одна проблема с моим сайтом.Я разработал сайт, который похож на yellowpages.com (ну, не очень похож, но просто для того, чтобы иметь представление)

, теперь они попросили меня сделать некоторые сумасшедшие вещи с SEO и переписыванием URL.

Я начну с моего main.php

'urlManager'=>array(
        'urlFormat'=>'path',
                    'showScriptName'=>false,
        'rules'=>array( 
                            'surf/category/<id:[0-9]+>/page/<page:[0-9]+>'=>'naviga/categoria/',
                            'surf/subcategory/<id:[0-9]+>/page/<page:[0-9]+>'=>'naviga/sottocategoria/',
                            'surf/page/<page:[0-9]+>'=>'surf/',
                            'contact' =>'site/contact/',
                            'write-mail/<id:[0-9]+>' =>'site/contact/',
                            'privacy' =>'site/page/view/privacy',
                            'register'=>'site/page/view/register',

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

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

                        ),
    ),

Теперь запрос ..... T_T они хотят, чтобы URL-адрес был что-то вроде этого:

http://domain.com/category-name/ вместо http://domain.com/surf/category/3 (ex.)

http://domain.com/category-name/sub-category-name/ вместо http://domain.com/surf/subcategory/3

http://domain.com/category-name/sub-category-name/society-name/ вместо http://domain.com/detail/2

и, очевидно, остальная часть ссылки должна работать с последними 3 правилами контроллера .... кто-нибудь может мне помочь ???я нахожусь в очень затруднительном положении .... они надуют мне задницу, если я не смогу найти решение для вторника .....

T_T

заранее спасибо запомощь.

1 Ответ

8 голосов
/ 08 января 2012

То, что вы хотите, выходит за рамки основных правил yii на основе регулярных выражений.То, что вам нужно, это ваши собственные классы правил URL-адресов.

В конфигурации:

'rules'=>array( 
    array(
        'class'=>'application.components.CategoryUrlRule'
    ),
)

В защищенных / components / CategoryUrlRule.php:

class CategoryUrlRule extends CBaseUrlRule { 
    public function createUrl($manager,$route,$params,$ampersand) {
        if ($route==='naviga/categoria') {
            return $params['categoryname'];
        }elseif ($route==='naviga/sottocategoria') {
            return $params['categoryname'].'/'.$params['subcategoryname'];
        }else{
            return false;  // this rule does not apply
        }
    }

    public function parseUrl($manager,$request,$pathInfo,$rawPathInfo) {
        if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) {
            $category=$matches[1];
            if(!empty($matches[2])
                $subcategory=$matches[2];

            // Check in db
            Yii:app()->db-> //...

            if(){ // There is a match from db check above
                if(isset($subcategory)){
                    $_GET['subcategory']=$subcategory;
                    return 'naviga/sottocategoria';
                }else{
                    $_GET['category']=$category;
                    return 'naviga/categoria';
                }
            }
        }
    }
}

Использование пользовательских классов правил URL

...