Размещение исходных файлов
Размещение их в /protected/components
является естественным выбором.Если позже вы разработаете более общие классы, которые можно будет повторно использовать в разных проектах, вы можете подумать о том, чтобы поместить их в отдельный каталог.
Имена и структура каталогов
Это будет зависетьв масштабе вашего приложения.Если у вас нет большого количества компонентов (скажем, до 20), тогда IMHO вам не нужна какая-либо структура каталогов, каталог components
хорош для всех из них.Другой практический подход - поместить ваши бизнес-компоненты в один каталог, а ваши HTML-компоненты - в другой (например, widgets
).
Включая родительские классы
Ваш файл конфигурации долженесть такой раздел:
// autoloading model and component classes
'import'=>array(
'application.models.activerecord.*',
'application.models.forms.*',
'application.components.*',
'application.classes.*',
// etc
),
Этот раздел фактически приводит к вызову CModule::setImport
в вашем экземпляре приложения для регистрации классов, которые могут быть автоматически загружены.Если вы хотите расширить эти классы, вам не нужно ничего делать.
Если некоторые из ваших компонентов зависят от классов Yii, которые не импортируются, как описано выше, вам нужно явно импортировать их, используя Yiibase::import
до объявления вашего класса.Например:
Yii::import('zii.widgets.jui.CJuiSlider');
class MySlider extends CJuiSlider {
// class contents here
}
Регистрация псевдонимов для путей
Если вы хотите создать свои собственные псевдонимы для путей импорта (например, иметь путь myapp.components
, вы можетесправка при импорте классов), вы можете сделать это, используя Yiibase::setPathOfAlias
.Хорошим местом для этого является самый верх вашего файла конфигурации:
<?php
Yii::setPathOfAlias('myapp.components','components/my/');
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
// your whole app configuration is here, and you can now do this:
'import'=>array(
// ...other imports...
'myapp.components.*',
// ...other imports...
),
);