Вызов контроллера модуля в контроллере приложения

Допустим имеем контроллер Admin и имеем модуль test, в котором есть контроллер AdminTest. Как в контроллере приложения Admin вызват контроллер из модуля?

Прописать в методе контроллера actions внешнее действие с путем до контроллера очень негибко получается, т.е что-то типа:




 public function actions() {

    return array(

      'modulController' => 'application.modules.tes.controllers.admintest'

    );

  }


 public function somfFunc() {

   $this->run('modulController')

 }



Как еще можно взаимодействовать разным контроллерам?

Как раз отписал о подобном в соседней теме.

Для определенности приведу пример ещё раз ниже:




// создаём контроллер, основываясь на нашем роуте

$p      = Yii::app()->createController('module/controller/index');

// берем функцию           

$result = $p[0]->someFunction($params);

// или экшен

$r      = $p[0]->actionIndex();



to Bethrezen

зашел в тупик :slight_smile: ситуация следующая:

описаннім Вами способом запускаю action из другого контроллера. Все прекрасно работало до момента пока не решил єтот єкшн оформить в виде отдельного класса.

создаю в отдельном файле класс действия


class ActionContact extends CAction {

	public function run() {

		... код action

	}

}

переопределяю метод actions() в классе контроллера


class SiteController extends CController {

	public function actions(){

		return array(

	           'contact' => 'application.controllers.content.actioncontact',

		);

	}

}

затем в нужном мне месте візіваю єтот єкшн (в конкретном случае єтопроисходит из view


$p = Yii::app()->createController('site/controller/contact');

$r = $p[0]->contact();

и в итоге получаем ошибку

причем если обратиться из браузера site/contact - все прекрасно работает

пробовал вызывать как метод класса $r = $p[0]->actionContact(); - результат тот же.

не подскажете где нужно "подпилить"?

Я делал вот так:




$act = $this->createAction('contact');

$act->run();



То есть, в Вашем случае будет так:




$p = Yii::app()->createController('site/controller/contact');

$r = $p[0]->createAction('contact')->run();



Не хочу создавать новую тему. Кто знает как, например, контроллеры админки поместить в /controllers/admin/ ?

попробуйте так как написано в cookbook

Organize directories for applications with front-end and back-end

Спасибо, ето то что нужно. Но как потом сделать backend доступным по адресу somesite/admin?

в примере у тебя обращение к админу будет somesite/backend.php

т.е. ті делаешь "две точки входа" index.php и backend.php

Я думаю можно в .htaccess правило написать. Сейчас с такой же проблемой столкнулся…отпишу потом…

И еще…я сделал админку сайта так же, как описано в Organize directories for applications with front-end and back-end. Теперь получается, что чтобы пользователю попасть в админку, ему придется авторизовываться через backend.php. Естественно если этот пользователь имеет доступ к админке он войдет. А если помимо админки пользователю необходимо авторизоваться и на самом сайте, получается, что придется логиниться и там и там…Это не очень хорошо, с точки зрения сквозной авторизации. И думаю выхода из этой ситуации нет, так как имеем две разные точки входа…

UPD: Вот что надо указать в .htaccess, чтобы сделать backend доступным по адресу somesite/admin




AddDefaultCharset UTF-8


Options +FollowSymLinks

RewriteEngine On


RewriteBase /

RewriteRule ^admin$ backend.php [L]

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !admin$

RewriteRule . index.php [L]