Reputation: 53603
I want to extend some built-in framework classes, but I there are some points I 'm not clear about:
Subfolder_ClassName
and the files like ClassName.php
?Right?
Upvotes: 4
Views: 8415
Reputation: 437424
Placement of source files
Putting them under /protected/components
is a natural choice. If you later develop more generic classes that can be reused across projects, you can think about putting those into a separate directory.
Naming and directory structure
This will depend on the scale of your app. If you don't have lots of components (say under 20) then IMHO you don't need any directory structure, the components
directory is good for all of them. Another practical approach is to put your business components into one directory and your HTML components into another (e.g. widgets
).
Including parent classes
Your configuration file should have a section like this:
// autoloading model and component classes
'import'=>array(
'application.models.activerecord.*',
'application.models.forms.*',
'application.components.*',
'application.classes.*',
// etc
),
This section actually results in CModule::setImport
being called on your application instance to register classes that can be autoloaded. If you want to extend these classes then you don't need to do anything.
If some of your components depend on Yii classes that don't get imported as above, you will need to explicitly import them using Yiibase::import
before declaring your class. For example:
Yii::import('zii.widgets.jui.CJuiSlider');
class MySlider extends CJuiSlider {
// class contents here
}
Registering aliases for paths
If you want to create your own aliases for import paths (e.g. to have a path myapp.components
you can reference when importing classes), you can do this using Yiibase::setPathOfAlias
. A good place for this is the very top of your configuration file:
<?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...
),
);
Upvotes: 5
Reputation: 1960
If you want to create a child class of a class in the yii-Framework, yeah you can place your class definition file within project/protected/components
. Depends on the best practices you want in place (i.e. will you be creating dozens of custom classes vs. just one or two that extend FW classes) but placing your file directly in components should be fine in terms of organization.
To inherit you can just create your file along these lines:
class MyNewClass extends CFrameworkClass
{
//All your stuff
}
Note that by convention the yii framwork classes have "C" in front of them (i.e. CController), I'm not adding the "C" there (CFramwork..) for any other reason than keeping with the convention.
Upvotes: 0