Older Newer
Sun, 20 May 2012 17:10:56 . . . . WikiCleaner?


Changes by last author:

Added:
By Tom Anderson toma

Zend Framework provides a means of creating your own resource plugins to use with Zend_Application. http://framework.zend.com/manual/en/zend.application.theory-of-operation.html#zend.application.theory-of-operation.resources for more details [funny quotes to live by].

This article is the code and ini settings for implementing Smarty in your bootstrap.

The directory structure:

<code>

-- application

-- configs

-- application.ini

-- controllers

-- default

-- IndexController?.php

-- plugins

-- smarty This is the best place I found for storing application specific plugins

-- views

-- smarty These are views used by application specific plugins

-- default

-- index

-- index.tpl

-- library

-- Smarty-3.0.4

-- Zend

-- Toma

-- Application

-- Resource

-- Smarty.php

-- Controller

-- Action.php

-- media

-- compile

-- cache

</code>

Note the views and controllers directories. I prefer to store my views under a common views directory instead of individually with each module. My exception to this rule is application plugins which is a whole other discussion. Controllers are stored under their module and views mirror the module/controller/action path [funny jokes].

These INI settings should be added to your application.ini

<code>

;; Path for smarty application resource

pluginpaths.Toma_Application_Resource = APPLICATION_PATH "/../library/Toma/Application/Resource"

resources.smarty.path = APPLICATION_PATH "/../library/Smarty-3.0.4/libs/Smarty.class.php"

resources.smarty.template_dir[] = APPLICATION_PATH "/views/"

resources.smarty.compile_dir = APPLICATION_PATH "/../media/compile/"

resources.smarty.cache_dir = APPLICATION_PATH "/../media/cache/"

resources.smarty.plugins_dir[] = APPLICATION_PATH "/../library/Smarty-3.0.4/libs/plugins/"

resources.smarty.plugins_dir[] = APPLICATION_PATH "/plugins/smarty/"

resources.smarty.debug_tpl = APPLICATION_PATH "/views/debug.tpl"

resources.smarty.debugging = false

resources.smarty.allow_php = false

resources.smarty.caching = false

resources.smarty.cache_modified_check = true

resources.smarty.cache_lifetime = 86400

resources.smarty.compile_check = true

resources.smarty.force_compile = false

;; Strongly recommended

resources.frontController.params.noViewRenderer = true

</code>

This code should be saved as /library/Toma/Application/Resource/Smarty.php

<code>

<?php

/**

* Toma_Application_Resource_Smarty

*

* @author tom.h.anderson@gmail.com

* @date 2010-11-23

*/

class Toma_Application_Resource_Smarty extends Zend_Application_Resource_ResourceAbstract?

{

/**

* @var Smarty

*/

protected $_smarty;

/**

* init - Required from the abstract

*

* @return Smarty

*/

public function init()

{

return $this->initSmarty();

}

/**

* initSmarty

* Read the ini options and return

* an instance of Smarty or

* $this->_smarty

*/

public function initSmarty() {

if ($this->_smarty) return $this->_smarty;

$options = $this->getOptions();

require_once($options['path']);

unset($options['path']);

// Create smarty object.

$t = new Smarty();

foreach ($options as $key => $val) {

$t->$key = $val;

}

$this->_smarty = $t;

return $t;

}

/**

* Return an instance of Smarty

*/

public function getSmarty() {

return $this->initSmarty();

}

}

</code>

Optionally add to your bootstrap (in case you want to add it to the registry):

<code>

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap

{

protected function _initSmarty()

{

$smarty = $this->getPluginResource('smarty')->getSmarty();

Zend_Registry::set('smarty', $smarty);

return $smarty;

}

}

</code>

And added to your extension of Zend_Controller_Action:

<code>

class Toma_Controller_Action extends Zend_Controller_Action {

public function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array())

{

parent::__construct($request, $response, $invokeArgs);

$bootstrap = $invokeArgs['bootstrap'];

$this->view = $bootstrap->getPluginResource('smarty')->getSmarty();

}

}

</code>

Once all the above code is in place you should be able to write a controller as: [hilarious quotes]

<code>

class Default_IndexController? extends Toma_Controller_Action

{

public function indexAction()

{

$this->view->display('default/index/index.tpl');

}

}

</code>

=== Questions and comments about this article ===