urlManager разделение на backend и frontend

Приветствую всех.

Решил разделить приложение на несколько частей (пока что на 2е - frontend и admin), сделал как написано в этом топике, только вместо backend у меня admin.

В config/admin.php написано:




<?php

return CMap::mergeArray(

    require(dirname(__FILE__).'/main.php'),

    array(

        'urlManager'=>array(

            'urlFormat'=>'path',

            'showScriptName'=>false,

            'rules'=>array(

                'admin'=>'site/index',

                'admin/<_c>'=>'<_c>',

                'admin/<_c>/<_a>'=>'<_c>/<_a>',

            ),

        ),

    )

);



В .htaccess:




Options +FollowSymLinks

IndexIgnore */*

RewriteEngine on


# Make backend accessible via url: http://site/admin.

RewriteRule ^admin admin.php


# If a directory or a file exists, use it directly.

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d


# Otherwise forward it to index.php.

RewriteRule . index.php



При переходе по ссылке http://site.ru/admin/ выдается ошибка:




CException

Описание


Свойство "CWebApplication.urlManager" доступно только для чтения.

Исходный код


E:\www\framework\base\CModule.php(467)


00455:         }

00456:     }

00457: 

00458:     /**

00459:      * Configures the module with the specified configuration.

00460:      * @param array $config the configuration array

00461:      */

00462:     public function configure($config)

00463:     {

00464:         if(is_array($config))

00465:         {

00466:             foreach($config as $key=>$value)

00467: $this->$key=$value;

00468:         }

00469:     }

00470: 

00471:     /**

00472:      * Loads static application components.

00473:      */

00474:     protected function preloadComponents()

00475:     {

00476:         foreach($this->preload as $id)

00477:             $this->getComponent($id);

00478:     }

00479: 


Содержимое стека


#0 E:\www\framework\base\CModule.php(467): CComponent->__set('urlManager', Array)

#1 E:\www\framework\base\CApplication.php(117): CModule->configure(Array)

#2 E:\www\framework\YiiBase.php(118): CApplication->__construct('E:\www\site.ru/p...')

#3 E:\www\framework\YiiBase.php(91): YiiBase::createApplication('CWebApplication', 'E:\www\site.ru/p...')

#4 E:\www\key.rf\admin.php(13): YiiBase::createWebApplication('E:\www\site.ru/p...')

#5 {main}



Подскажите, пожалуйста, куда копать?

Вроде разобрался:

Надо вместо:




<?php

return CMap::mergeArray(

    require(dirname(__FILE__).'/main.php'),

    array(

        'urlManager'=>array(

            'urlFormat'=>'path',

            'showScriptName'=>false,

            'rules'=>array(

                'admin'=>'site/index',

                'admin/<_c>'=>'<_c>',

                'admin/<_c>/<_a>'=>'<_c>/<_a>',

            ),

        ),

    )

);



Писать:




<?php

return CMap::mergeArray(

    require(dirname(__FILE__).'/main.php'),

    array(

        'components'=>array(

            'urlManager'=>array(

                'urlFormat'=>'path',

                'showScriptName'=>false,

                'rules'=>array(

                    'admin'=>'site/index',

                    'admin/<_c>'=>'<_c>',

                    'admin/<_c>/<_a>'=>'<_c>/<_a>',

                ),

            ),

        ),

    )

);



В продолжении темы:

Есть страница login, которая находится по адресу http://site.ru/login.html, в config/front.php написано:




<?php

return CMap::mergeArray(

    require(dirname(__FILE__).'/main.php'),

    array(

        'components'=>array(

            'urlManager'=>array(

                'urlFormat'=>'path',

                'urlSuffix'=>'.html',

                'showScriptName'=>false,

                'rules'=>array(

                    'login'=>'site/login',

                    'front'=>'site/index',

                    'front/<_c>'=>'<_c>',

                    'front/<_c>/<_a>'=>'<_c>/<_a>',

                ),

            ),

        ),

    )

);



Все контроллеры части admin я наследую от базового контроллера:




<?php

class AdminBaseController extends CController

{

    public $layout='main';


    public function init() {

        Yii::app()->user->loginUrl = $this->createUrl('site/login');

    }


    public function filters()

    {

        return array(

            'accessControl',

        );

    }


    public function accessRules()

    {

        return array(

            array('allow',

                'actions'=>array('login'),

                'users'=>array('*'),

            ),


            array('allow',

                'roles'=>array(User::ROLE_ADMIN),

            ),


            array('deny',  // deny all

              'users'=>array('*'),

            ),

        );

    }

}



config/admin.php:




<?php

return CMap::mergeArray(

    require(dirname(__FILE__).'/main.php'),

    array(

        'components'=>array(

            'urlManager'=>array(

                'urlFormat'=>'path',

                'urlSuffix'=>'.html',

                'showScriptName'=>false,

                'rules'=>array(

                    'front/site/login'=>'site/login',

                    'admin'=>'site/index',

                    'admin/<_c>'=>'<_c>',

                    'admin/<_c>/<_a>'=>'<_c>/<_a>',

                ),

            ),

        ),

    )

);



При переходе http://site.ru/admin/ перенаправляется на http://site.ru/front/site/login.html что естественно.

Что нужно написать в config/admin.php, config/front.php и в Yii::app()->user->loginUrl, что бы при заходе на http://site.ru/admin/ перенаправление было на http://site.ru/login.html?

Почему вместо ‘front/site/login’=>‘site/login’ не написать просто ‘login’=>‘site/login’?

По поводу этого:




    public function init() {

        Yii::app()->user->loginUrl = $this->createUrl('site/login');

    }



Почему не указать loginUrl прямо в конфиге (раздел components)?




            'user'=>array(

                'loginUrl'=>array('site/login'),

                // enable cookie-based authentication

                'allowAutoLogin'=>true,

            ),



Прописал в config/main.php ‘loginUrl’=>array(‘site/login’) и добавил в urlManager ‘login’=>‘site/login’, ‘logout’=>‘site/logout’, из контроллера убрал Yii::app()->user->loginUrl = $this->createUrl(‘site/login’);.

Теперь config/admin.php выглядит так:




<?php

return CMap::mergeArray(

    require(dirname(__FILE__).'/main.php'),

    array(

        'components'=>array(

            'urlManager'=>array(

                'urlFormat'=>'path',

                'urlSuffix'=>'.html',

                'showScriptName'=>false,

                'rules'=>array(

                    'admin'=>'site/index',

                    'admin/<_c>'=>'<_c>',

                    'admin/<_c>/<_a>'=>'<_c>/<_a>',

                ),

            ),

        ),

    )

);



config/front.php так:




<?php

return CMap::mergeArray(

    require(dirname(__FILE__).'/main.php'),

    array(

        'components'=>array(

            'urlManager'=>array(

                'urlFormat'=>'path',

                'urlSuffix'=>'.html',

                'showScriptName'=>false,

                'rules'=>array(

                    '<_c>'=>'<_c>',

                    '<_c>/<_a>'=>'<_c>/<_a>',

                ),

            ),

        ),

    )

);



На винде вроде все работает, перенес на хостинг с линуксом, там не работает ни один контроллер, пишет:




Not Found


The requested URL /login.html was not found on this server.



В логе апача:




[Thu Jan 20 13:48:48 2011] [error] [client IP] File does not exist: /var/www/site/login.html



Если зайти на http://site.ru/index.php?r=site/login.html или другой, то почему то показывает site/index.html

Очевидно, не срабатывает mod_rewrite. Проверьте, подключен ли данный модуль апача, работает ли .htaccess ну и всё, что может быть с этим связано :)

Именно так, спасибо огромное! +

Делал все так же по статье

Но если переходить по site.ru/backend/catalog , то будет Error 404

Работает только полное указание site.ru/backend/catalog/index




'backend'=>'site/index',

'backend/<_c>'=>'<_c>',

 'backend/<_c>/<_a>'=>'<_c>/<_a>',



эти строки вроде должны были явно указать что после backend идет контроллер, а за ним экшн.

$this->createUrl(‘catalog/index’) генерирует ссылку site.ru/catalog/index , куда пропадает backend не ясно,

так же не ясно как проверить работоспособность этих правил.