проблема выноса экшена в отдельный класс для МОДУЛЯ

Приветствую Всех!

Решил навести порядок в своем Yii проекте и в частности "разгрузить" контроллер модуля от экшенов.

И вот здесь наткнулся на подводный камень (((

Проект создавался на основе ранее сделанной заготовки в которой уже использовался вынос экшенов в отдельный класс, НО экшены выносились из контроллера находящегося в ОСНОВНОЙ папке проекта (main_project\protected\controllers\MainController.php) и там все работает.

Но вот подобный подход "под копирку" если использовать этоже в модуле = не прокатило!!!

А именно из экшена вынесенного в отдельный класс (внутри директории модуля) не видится представления контроллера модуля находящиеся в пределах директории модуля.

Вот что у меня сейчас имеется:

Фрагмент файла конфигурации проекта:

Файл:(main_project\protected\config\main.php)




//...

//общие настройки для сайта

$arraySettingsAll = array(

	//...

	 //автозагрузка моделей и компонентов приложения

	'import'=>array(

		'application.models.*', //классы моделей приложения 

		'application.components.*', //компоненты приложения

		'application.modules.ClsfObjects.models.*', //классы моделей модуля ClsfObjects

	),


	//подключение модулей приложения

	'modules'=>array(

		//подключение модуля ClsfObjects

		'clsfobjects'=>array(

		  'class' => 'application.modules.ClsfObjects.ClsfObjectsModule', // без использования пространства имён

		),

	),


	//...

);

//...



Фрагмент файла Контроллера модуля ClsfObjects:

Файл:(main_project\protected\modules\ClsfObjects\controllers\Clsf_formsController.php)




class Clsf_formsController extends СController

{

	public function __construct($id, $module=null)

	{

		parent::__construct($id,$module=null);

	}

	

	/**

	 * Список экшенов для контроллера вынесенных в классы (в отдельную папку модуля) 

	 */

	public function actions()

	{

		return array(

 			//...

			'requirements_level' => 'application.modules.ClsfObjects.actions.RequirementsLevelAction',

 			//...

		);

	}

	

	/**

	 * Персональный Экшен для контроллера (перреобределяет общий экшен)

	 */

	public function actionIndex() {

		$this->render('index', array('arrayData' => array()) );

	}


        //...

}



Фрагмент файла Экшена модуля ClsfObjects вынесенного в класс :

Файл:(main_project\protected\modules\ClsfObjects\actions\RequirementsLevelAction.php)




//...

class RequirementsLevelAction extends Action

{

	public function run()

	{

		//...

		//вызываем  представление для экшена		

		$this->act->render('requirements_level',array('arrayData' => array()));

				

		//...		

		

	}


//...



Фрагмент файла Контроллера приложения:

Файл:(main_project\protected\controllers\AdmintableController.php)




class AdmintableController extends СController

{

	public function __construct($id, $module=null)

	{

		parent::__construct($id,$module=null);

	}

	

	/**

	 * Список экшенов для контроллера вынесенных в классы (в отдельную папку модуля) 

	 */

	public function actions()

	{

		return array(

 			//...

			'table_view' => 'application.actions.TableViewAction',

 			//...

		);

	}

	

	/**

	 * Персональный Экшен для контроллера (перреобределяет общий экшен)

	 */

	public function actionIndex() {

		$this->render('index', array('arrayData' => array()) );

	}


        //...

}



Фрагмент файла Экшена для контроллера приложенеия вынесенного в класс:

Файл:(main_project\protected\actions\TableViewAction.php)




//...

class TableViewAction extends Action

{

	public function run()

	{

		//...

		//вызываем  представление для экшена

		$this->act->render('table_view',array());		

		//...			

	}


//...



Фрагмент файла общего класса для Экшенов, обеспечивающий подключение класса текущего контроллера иначе без него, в частности, метод render при $this->render() - не видится! (это вычитал в инете)

Файл:(main_project\protected\components\Action.php)




class Action extends CAction

{

	protected $act;

	public function __construct($controller,$id)

	{

		

		parent::__construct($controller,$id);

		$this->act = $controller;

	}

}



Фрагмент файла представления для экшена RequirementsLevelAction

(main_project\protected\modules\ClsfObjects\views\clsf_forms\requirements_level.php)




//...	

//Имя текущего контроллера

$nameController =  Yii::app()->controller->id;

echo $nameController;

//...



Фрагмент файла представления для экшена TableViewAction

(main_project\protected\views\admintable\table_view.php)




//...	

//Имя текущего контроллера

$nameController =  Yii::app()->controller->id;

echo $nameController;

//...



и вот при таком раскладе:

при выполнении скриптов для экшена TableViewAction

(URL вызова: http://domen_name/admintable/table_view)

выдается на экран имя текущего контроллера (admintable)

а при выполнении скриптов для экшена RequirementsLevelAction

(URL вызова: http://domen_name/clsfobjects/clsf_forms/requirements_level)

НЕ выдается на экран имя текущего контроллера (clsf_forms), и при этом выдается ошибка:

< Контроллер Clsf_formsController не может найти представление "requirements_level". >

пробовал явно указать путь к представлению в экшене:

$this->act->render(‘application.modules.ClsfObjects.views.clsf_forms.requirements_level’,array());

в этом случае экшен находит представление, но тогда в самом представлении начинаются чудеса невидимости классов, JS библиотек и т п. такое ощущение что представление не видит часть данныхх которые доступны если представление было вызвано из экщена находящегося внутри контроллера а не вынесенного в отдельный клас (((

Я так подозреваю что в данном случае:

  1. Надо в самом представлении где то указывать? что оно находится в папках модуля а не общей папке view всего приложения?

  2. Возможно надо принудительно гдето подключать недостающие классы не видимые из представления при таком подходе?

  3. Возможно где то в общих настройках или классах прописать автоматическое подключение путей (кроме тех что уже прописаны для модуля)?

В инете находил несколько примеров как выносить экшены в отдельные классы, но они приведены для контроллеров находящихся в ОСНОВНОЙ папке (… \protected\controllers\…). А для случая использования этого же принципа в модуле не описано нигде (мне не попалось). Очевидно для такого случая есть особенности.

Вообщем нужна помощь…

Вау решение нашлось неожиданно (случайно)!

Оказалось что на странности влияет конструктор класса!

учитывая что он фактически ничего не делает повторяя действия родительского класса в контроллере, я решил его убрать и все заработало!!!

было:




class Clsf_formsController extends СController

{

        public function __construct($id, $module=null)

        {

                parent::__construct($id,$module=null);

        }

        //.....



стало:




class Clsf_formsController extends СController

{

        //public function __construct($id, $module=null)

        //{

                //parent::__construct($id,$module=null);

        //}

        //.....



Честно говоря не совсем понял почему он влиял но задача решена ))))

Хотя предполагаю что при инициализации класса Clsf_formsController как раз он и нарушал работу системы…