How to use Zend_Loader_Autoloader - zend-framework

I think this is a reasonably easy question however I just don't get autoloading in Zend framework.
Basically, I have the standard Zend project layout with application/models, application/controllers, application/views directories. I have also added an application/forms directory, and the classes that it contains will be named Application_Form_*
How do I register the new directory with the autoloader?
Thanks...
Kim

You don't need to register the new directory with the autoloader. If you create a form it should look something like like this:-
application/forms/Myform.php
class Application_Form_Myform extends Zend_Form
{
public function init()
{
//Put your code here
}
}
You can then instantiate your form like this (in your controller for example):-
$myform = new Application_Form_Myform();
Zend Framework will then autoload the class for you.
http://framework.zend.com/manual/en/learning.quickstart.create-form.html
There is an explanation of Autoloading in Zend Framework in the manual.
An extract from that:-
Zend Framework has borrowed an idea from ยป PEAR, whereby class names have a 1:1 relationship with the filesystem. Simply put, the underscore character ("_") is replaced by a directory separator in order to resolve the path to the file, and then the suffix ".php" is added. For example, the class "Foo_Bar_Baz" would correspond to "Foo/Bar/Baz.php" on the filesystem. The assumption is also that the classes may be resolved via PHP's include_path setting, which allows both include() and require() to find the filename via a relative path lookup on the include_path.
Which basically means that folders don't all need to be registered in the autoloader. It can quite happily find files in folders anywhere under the application or library/Zend folders so long as you follow the naming convention and proper casing.
The default folders under application/ that end with an 's' are special cases specifically dealt with in Zend_Application_Module_Autoloader::initDefaultResourceTypes() and should not be confused with the main autoloading mechanism.

Use $resourceLoader:
$resourceLoader->addResourceTypes(array(
'acl' => array(
'path' => 'acls/',
'namespace' => 'Acl',
),
'form' => array(
'path' => 'forms/',
'namespace' => 'Form',
),
'model' => array(
'path' => 'models/',
'namespace' => 'Model',
),
));
See: http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html

Related

Cakephp /Config/email.php into a Plugin

Hi i have a plugin called Contact and into it i have
/Config/email.php file.
Cake seems not to load that file.
In my main bootstrap.php file i tried this:
CakePlugin::loadAll(array('Contact'=>array('bootstrap'=>true, 'email'=>true, 'routes'=>true)));
the bootstrap.php and routes.php file are loaded, the email.php no
Thanks
That's not how CakePlugin::load/loadAll() works, there is no email option, only bootstrap, routes and ignoreMissing.
Check the coobook and the API documentation
http://book.cakephp.org/2.0/en/plugins.html#advanced-bootstrapping
http://api.cakephp.org/2.4/class-CakePlugin.html#_load
If you like to load more than one bootstrap file for a plugin. You can specify an array of files for the bootstrap configuration key...
So something like this should work for you:
CakePlugin::loadAll(array(
'Contact' => array(
'bootstrap' => array(
'bootstrap',
'email'
),
'routes'=>true
)
));
That would load the files /Plugin/Contact/Config/bootstrap.php and /Plugin/Contact/Config/email.php.
However it won't work in case that file contains an EmailConfig class definition and your app also loads the app/Config/email.php file where such a class definition already exists. In that case you should choose another way to define your email configuration settings.

TYPO3 new record appearing on wrong location in Backend List

I'm developing a new extension using ExtBase in TYPO3 (4.7) for a client.
I have however the strangest problem. In the back-end, my possible, new record types are - as usual - listed in the Insert new record Backend List. Usually each of these record-types are preceded by the module name (actually they are grouped right after the module name).. However, in my case, 1 or 2 of the record-types of any other extension appear within my extension's list as well.. I've been trying to figure out pretty much all that I can, I even copied the extension over to an entirely different TYPO3 installation, but the same problem persists..
If of any extension some records appear just below my extension's title, and I delete that particular extension, just some other record-types appear of another extension.
What's going on here??
Short & late answer:
i guess you have defined the title of your models in two different ways or with a non-existent languagefile in your ext_tables.php. Something like this:
Model1:
$TCA['tx_aaext_domain_model_one'] = array(
'ctrl' => array(
'title' => 'LLL:EXT:bn_news/Resources/Private/Language/locallang_db.xml:tx_bnnews_domain_model_categories',
Model2:
$TCA['tx_aaext_domain_model_two'] = array(
'ctrl' => array(
'title' => 'Static Title',
and/or your extension-name has an underscore like aa_extension, then this error can happen.
Make sure that both title-definitions are dynamic and begin with "LLL:EXT:" and point to an existing translation. Everything should be fine now.
Long answer will be to long :)

zendframework 2 - where to save custom library folder

In Zendframework-1, we usually save the customized code under library folder (parallel to application folder) almost using the same folder structure as zend framework (vendor) library to create plugin or extend core library.
In zend framework 2, folder structure is changed. zend vendor core library is moved under Vendor folder and application folder is moved into Module (root) folder.
My question is, which is the best place to save customized plugin/code based library folder in ZF2?
Anyone else have gone through this phase?
Depends on the purpose of your library
Case 1, used by many modules:
Place it in your vendor folder, make sure to be PSR-0 compliant, that makes autoloading easy.
Case 2, used by only one module:
Place it in under modules/your_module/src and edit the Module.phps getAutoloaderConfig() method to have it autoloaded.
....
class Module {
....
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php', // classmap for production usage
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, // your module's files autoloading (development usage and fallback)
'library_namespace' => __DIR__ . '/src/librarys_namespace/potential_subfolder', // your library files autoloading (development usage and fallback). eg: 'acme' => '/src/acme/library' for acme namespace
),
),
);
}
....
Case 3, your library is 3rd party module:
Place it within the vendor folder, for references look at ZfcUser
I think your use-case would most like be case 1, your library modifies behaviour of e.g. the Zend\Mvc\Controller\AbstractActionController or additional plugins.
But if a plugin is only used by one module you'll be better of placing it parallel to your Modules code as described in Case 2.
./vendor if your code has generic purposes (i.e.: Classes like StdClass, ArrayAccess, Iterator, etc...). In short, if those Classes are required for Modules to work, they should be inside vendor.
./module In case your Plugins/Code are meant for a specific purpose (and Standalone), you may evaluate if it's a module or not (i.e.: ZF-Commons 3rd Party Modules/Plugins like ZfcUser)

Zend framework Fatal error: Class 'Application_Model_DbTable_Albums' not found in

I am trying to learn Zend framework from "Getting Started with Zend Framework" By Rob Allen. I have used the same example that has been given, but getting the error -
Fatal error: Class 'Application_Model_DbTable_Albums' not found in /var/www/html/workbench/sreekantk/zf-tutorial/application/controllers/IndexController.php on line 14 .
I think I have to set path to models folder, but don't know how to do it. Could anyone please help me out of this.
This is my Bootstrap.php file.
// application/Bootstrap.php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initAutoload()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => APPLICATION_PATH.'/application/modules'));
return $autoloader;
}
}
Thanks Just H. It worked. Actually I changed the folder structure and after the again added appnamespace="Application" to the application.ini file. Thanks you all for your comments.
As long as you get to the controller your primary setup seems to be fine. So, if you have the class in a separate file the problem is probably a simple typo somewhere.
a) with all the following, look out for lower/upper case
b) note that the models folder is plural whereas the class is Model singular
c) make sure the class is named Application_Model_DbTable_Albums
d) make sure the file is named Albums.php and in a folder named application/models/DbTable
Good luck learning ZF
Since version 1.9.2, the default module will automatically initialise an autoloader for the namespace configured in appnamespace (defaults to "Application" on a vanilla install). You can remove your _initAutoload() method.
So long as your class exists in application/models/DbTable/Albums.php and is named Application_Model_DbTable_Albums, it should be able to autoload the class on first use.
Be mindful of path case sensitivity.
I'm following the same tutorial and what Adrian World said on Aug 9'11 at 13:26 helped me get rid of the error. My Bootstrap now is:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initAutoload()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => APPLICATION_PATH.'/application/models'));
return $autoloader;
}
}
Where the only thing that changed was going from modules to models
You should define Bootstrap class of the current Module. Then it will be fine.

Zend Autoloading models issue

Zend framework.
I want to autoload my models classes inside models folder, from within bootstrap class.
These models doesnt actually use any namespace (so I have Ex. User.php file's class named User and so on..).
If I understood correctly I should use the Zend_Loader_Autoloader_Resource and I tried:
function _initLoaderResource()
{
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => APPLICATION_PATH,//points to the "application" path where resides "models" folder
'namespace' =>''
));
$resourceLoader->addResourceType('models', 'models/');
}
And I receive following 'Zend_Loader_Exception' message:
'Initial definition of a resource type must include a namespace'
My questions are:
Is this the right way to autoload models?
How should I manage resource code that doesn't follow Zend Framework coding standard?
Actually you probably don't want to use the resource autoloader for this, since (as you've discovered) it requires a namespace. The standard autoloader (which loads models from the include path) has an option setFallbackAutoloader which tells ZF that that autoloader should be used for any class not matching a namespace covered by another. So all you need to do is ensure your models directory is on the include path and set this option to true.
You are probably already using the standard autoloader for loading the Zend classes, so you'll probably want to modify your application.ini file to add your model directory to the include path, and then set the fallback option either in application.ini or in your Bootstrap class:
protected function _initAutoloader()
{
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
return $autoloader;
}
Zend Autoloader uses namespaces to make sure you are not using the autoload process, on those classes you don't want. So you would have to choose a namespace for your classes.
You could start your classes with an application specific namespace, or a general one.
namespaces like 'My_' or 'App_' are general, yet for example if your application name is Job Board, you could use namespaces like 'JB_' in your class files.
You may also write your own autoloader (either a totally new one, or by extending the Zend autoloader) and register it as the SPL autoloader to bypass this.
Your class names does not have to follow the Zend Framework naming conventions, just make sure they have a namespace and register the namespace in the autoloader.
Here I attach a piece of my code that registers some resources to be autoloaded. I'm having multiple modules, and each module has a namespace regarding that module name. Please note that since there were many namespaces, I register them all in a loop.
$nameSpaceToPath = array(
'Application' => APPLICATION_PATH,
'Base' => APPLICATION_PATH . '/base',
'Store' => APPLICATION_PATH . '/modules/Store',
'Payment' => APPLICATION_PATH . '/modules/Payment',
'Admin' => APPLICATION_PATH . '/modules/Admin'
);
foreach($nameSpaceToPath as $ns => $path) {
$autoLoaderResource = new Zend_Loader_Autoloader_Resource(
array(
'basePath' => $path,
'namespace' => $ns
)
);
$autoLoaderResource->addResourceType('controller','controllers','Controller');
$autoLoaderResource->addResourceType('model','models','Model');
$autoLoaderResource->addResourceType('mapper','models/mappers','Model_Mapper');
$autoLoaderResource->addResourceType('service','services','Service');
// I'm using _Util_ in the name of my utility classes, I place them in 'utils' directory
$autoLoaderResource->addResourceType('util','utils','Util');
$autoLoaderResource->addResourceType('plugin','plugins','Plugin');
$autoLoaderResource->addResourceType('form','forms','Form');
// I'm using _Exception_ in the name of my module specific exception classes, I place them in 'exceptions' directory
$autoLoaderResource->addResourceType('exception','exceptions','Exception');
$autoLoader->pushAutoloader($autoLoaderResource);
}
When you are defining a resource type by calling:
$autoLoaderResource->addResourceType('service','services','Service');
You are actually telling Zend Autoloader that you have a type 'service' (1st param), which is placed in the directory named 'services' (2nd param), and you are using 'Service' token in the class names to specify classes of this type.
The above code tells Zend Autoloader to search for class Store_Service_Core in the path 'APPLICATION_PATH/modules/store/services/Core.php'.
As you can see I have registered the general 'Application' namespace for the APPLICATION_PATH path. This means that each class, starting with Application_ would be autoloaded from the APPLICATION_PATH. So forexample I have a class named Application_Init which uses some initialization tasks, and now Zend autoloads it from the path APPLICATION_PATH/Init.php.