Yii Framework Forum: urlManager разделение на backend и frontend - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

urlManager разделение на backend и frontend Rate Topic: -----

#1 User is offline   j0ker_ 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 44
  • Joined: 22-December 10
  • Location:Russia, Yaroslavl

Posted 20 January 2011 - 02:26 AM

Приветствую всех.
Решил разделить приложение на несколько частей (пока что на 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}


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

#2 User is offline   j0ker_ 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 44
  • Joined: 22-December 10
  • Location:Russia, Yaroslavl

Posted 20 January 2011 - 02:54 AM

Вроде разобрался:
Надо вместо:
<?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>',
                ),
            ),
        ),
    )
);

0

#3 User is offline   j0ker_ 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 44
  • Joined: 22-December 10
  • Location:Russia, Yaroslavl

Posted 20 January 2011 - 03:18 AM

В продолжении темы:
Есть страница 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?
0

#4 User is offline   andy_s 

  • Random Member Title
  • Yii
  • Group: Moderators
  • Posts: 1,526
  • Joined: 22-June 09
  • Location:Russia, Kostroma

Posted 20 January 2011 - 04:52 AM

Quote

При переходе 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,
            ),

0

#5 User is offline   j0ker_ 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 44
  • Joined: 22-December 10
  • Location:Russia, Yaroslavl

Posted 20 January 2011 - 05:43 AM

Прописал в 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...site/login.html или другой, то почему то показывает site/index.html
0

#6 User is offline   andy_s 

  • Random Member Title
  • Yii
  • Group: Moderators
  • Posts: 1,526
  • Joined: 22-June 09
  • Location:Russia, Kostroma

Posted 20 January 2011 - 07:25 AM

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

#7 User is offline   j0ker_ 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 44
  • Joined: 22-December 10
  • Location:Russia, Yaroslavl

Posted 20 January 2011 - 09:52 AM

View Postandy_s, on 20 January 2011 - 07:25 AM, said:

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


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

#8 User is offline   WhiteWhale 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 2
  • Joined: 18-April 14

Posted 26 April 2014 - 12:55 PM

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

Но если переходить по 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 не ясно,
так же не ясно как проверить работоспособность этих правил.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users