Приветствую Всех!
Решил навести порядок в своем 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 библиотек и т п. такое ощущение что представление не видит часть данныхх которые доступны если представление было вызвано из экщена находящегося внутри контроллера а не вынесенного в отдельный клас (((
Я так подозреваю что в данном случае:
-
Надо в самом представлении где то указывать? что оно находится в папках модуля а не общей папке view всего приложения?
-
Возможно надо принудительно гдето подключать недостающие классы не видимые из представления при таком подходе?
-
Возможно где то в общих настройках или классах прописать автоматическое подключение путей (кроме тех что уже прописаны для модуля)?
В инете находил несколько примеров как выносить экшены в отдельные классы, но они приведены для контроллеров находящихся в ОСНОВНОЙ папке (… \protected\controllers\…). А для случая использования этого же принципа в модуле не описано нигде (мне не попалось). Очевидно для такого случая есть особенности.
Вообщем нужна помощь…