* @author Stephan Wentz * @author Jordi Boggiano * @copyright Copyright (c) 2008, Jordi Boggiano * @license http://dwoo.org/LICENSE Modified BSD License * @link http://dwoo.org/ * @version 1.1.0 * @date 2009-07-18 * @package Dwoo */ class Dwoo_Adapters_ZendFramework_View extends Zend_View_Abstract { /** * @var Dwoo */ protected $_engine = null; /** * @var Dwoo_Data */ protected $_dataProvider = null; /** * @var Dwoo_Compiler */ protected $_compiler = null; /** * Changing Filter's scope to play nicely * * @var array */ protected $_filter = array(); /** * @var string */ protected $_templateFileClass = 'Dwoo_Template_File'; /** * @var array */ protected $_templateFileSettings = array(); /** * @var Dwoo_IPluginProxy */ protected $_pluginProxy = null; /** * Constructor method. * See setOptions for $opt details * * @see setOptions * @param array|Zend_Config List of options or Zend_Config instance */ public function __construct($opt = array()) { if (is_array($opt)) { $this->setOptions($opt); } elseif ($opt instanceof Zend_Config) { $this->setConfig($opt); } $this->init(); } /** * Set object state from options array * - engine = engine class name|engine object|array of options for engine * - dataProvider = data provider class name|data provider object|array of options for data provider * - compiler = compiler class name|compiler object|array of options for compiler * - templateFile = * * Array of options: * - type class name or object for engine, dataProvider or compiler * - any set* method (compileDir for setCompileDir ...) * * @param array $options * @return Dwoo_Adapters_ZendFramework_View */ public function setOptions(array $opt = array()) { // BC checks // TODO remove in 1.1 if (isset($opt['compileDir']) || isset($opt['compile_dir'])) { trigger_error('Dwoo ZF Adapter: the compile dir should be set in the $options[\'engine\'][\'compileDir\'] value the adapter settings', E_USER_WARNING); } if (isset($opt['cacheDir']) || isset($opt['cache_dir'])) { trigger_error('Dwoo ZF Adapter: the cache dir should be set in the $options[\'engine\'][\'cacheDir\'] value the adapter settings', E_USER_WARNING); } // end BC // Making sure that everything is loaded. $classes = array('engine', 'dataProvider', 'compiler'); // Setting options to Dwoo objects... foreach ($opt as $type => $settings) { if (!method_exists($this, 'set' . $type)) { throw new Dwoo_Exception("Unknown type $type"); } if (is_string($settings) || is_object($settings)) { call_user_func(array($this, 'set' . $type), $settings); } elseif (is_array($settings)) { // Set requested class if (array_key_exists('type', $settings)) { call_user_func(array($this, 'set' . $type), $settings['type']); } if (in_array($type, $classes)) { // Call get so that the class is initialized $rel = call_user_func(array($this, 'get' . $type)); // Call set*() methods so that all the settings are set. foreach ($settings as $method => $value) { if (method_exists($rel, 'set' . $method)) { call_user_func(array($rel, 'set' . $method), $value); } } } elseif ('templateFile' == $type) { // Remember the settings for the templateFile $this->_templateFileSettings = $settings; } } } } /** * Set object state from Zend_Config object * * @param Zend_Config $config * @return Dwoo_Adapters_ZendFramework_View */ public function setConfig(Zend_Config $config) { return $this->setOptions($config->toArray()); } /** * Called before template rendering * * Binds plugin proxy to the Dwoo. * * @see Dwoo_Adapters_ZendFramework_View::getPluginProxy(); * @see Dwoo::setPluginProxy(); */ protected function preRender() { $this->getEngine()->setPluginProxy($this->getPluginProxy()); } /** * Wraper for Dwoo_Data::__set() * allows to assign variables using the object syntax * * @see Dwoo_Data::__set() * @param string $name the variable name * @param string $value the value to assign to it */ public function __set($name, $value) { $this->getDataProvider()->__set($name, $value); } /** * Sraper for Dwoo_Data::__get() allows to read variables using the object * syntax * * @see Dwoo_Data::__get() * @param string $name the variable name * @return mixed */ public function __get($name) { return $this->getDataProvider()->__get($name); } /** * Wraper for Dwoo_Data::__isset() * supports calls to isset($dwooData->var) * * @see Dwoo_Data::__isset() * @param string $name the variable name */ public function __isset($name) { return $this->getDataProvider()->__isset($name); } /** * Wraper for Dwoo_Data::_unset() * supports unsetting variables using the object syntax * * @see Dwoo_Data::__unset() * @param string $name the variable name */ public function __unset($name) { $this->getDataProvider()->__unset($name); } /** * Catches clone request and clones data provider */ public function __clone() { $this->setDataProvider(clone $this->getDataProvider()); } /** * Returns plugin proxy interface * * @return Dwoo_IPluginProxy */ public function getPluginProxy() { if (!$this->_pluginProxy) { $this->_pluginProxy = new Dwoo_Adapters_ZendFramework_PluginProxy($this); } return $this->_pluginProxy; } /** * Sets plugin proxy * * @param Dwoo_IPluginProxy * @return Dwoo_Adapters_ZendFramework_View */ public function setPluginProxy(Dwoo_IPluginProxy $pluginProxy) { $this->_pluginProxy = $pluginProxy; return $this; } /** * Sets template engine * * @param string|Dwoo Object or name of the class */ public function setEngine($engine) { // if param given as an object if ($engine instanceof Dwoo) { $this->_engine = $engine; } // elseif (is_subclass_of($engine, 'Dwoo') || 'Dwoo' === $engine) { $this->_engine = new $engine(); } else { throw new Dwoo_Exception("Custom engine must be a subclass of Dwoo"); } } /** * Return the Dwoo template engine object * * @return Dwoo */ public function getEngine() { if (null === $this->_engine) { $this->_engine = new Dwoo(); } return $this->_engine; } /** * Sets Dwoo data object * * @param string|Dwoo_Data Object or name of the class */ public function setDataProvider($data) { if ($data instanceof Dwoo_IDataProvider) { $this->_dataProvider = $data; } elseif (is_subclass_of($data, 'Dwoo_Data') || 'Dwoo_Data' == $data) { $this->_dataProvider = new $data(); } else { throw new Dwoo_Exception("Custom data provider must be a subclass of Dwoo_Data or instance of Dwoo_IDataProvider"); } } /** * Return the Dwoo data object * * @return Dwoo_Data */ public function getDataProvider() { if (null === $this->_dataProvider) { $this->_dataProvider = new Dwoo_Data; } return $this->_dataProvider; } /** * Sets Dwoo compiler * * @param string|Dwoo_Compiler Object or name of the class */ public function setCompiler($compiler) { // if param given as an object if ($compiler instanceof Dwoo_ICompiler) { $this->_compiler = $compiler; } // if param given as a string elseif (is_subclass_of($compiler, 'Dwoo_Compiler') || 'Dwoo_Compiler' == $compiler) { $this->_compiler = new $compiler; } else { throw new Dwoo_Exception("Custom compiler must be a subclass of Dwoo_Compiler or instance of Dwoo_ICompiler"); } } /** * Return the Dwoo compiler object * * @return Dwoo_Data */ public function getCompiler() { if (null === $this->_compiler) { $this->_compiler = Dwoo_Compiler::compilerFactory(); } return $this->_compiler; } /** * Initializes Dwoo_ITemplate type of class and sets properties from _templateFileSettings * * @param string Template location * @return Dwoo_ITemplate */ public function getTemplateFile($template) { $templateFileClass = $this->_templateFileClass; $dwooTemplateFile = new $templateFileClass($template); if (!($dwooTemplateFile instanceof Dwoo_ITemplate)) { throw new Dwoo_Exception("Custom templateFile class must be a subclass of Dwoo_ITemplate"); } foreach ($this->_templateFileSettings as $method => $value) { if (method_exists($dwooTemplateFile, 'set' . $method)) { call_user_func(array($dwooTemplateFile, 'set' . $method), $value); } } return $dwooTemplateFile; } /** * Dwoo_ITemplate type of class * * @param string Name of the class * @return void */ public function setTemplateFile($tempateFileClass) { $this->_templateFileClass = $tempateFileClass; } /** * Passes data to Dwoo_Data object * * @see Dwoo_Data::assign() * @param array|string $name * @param mixed $val * @return Dwoo_Adapters_ZendFramework_View */ public function assign($name, $val = null) { $this->getDataProvider()->assign($name, $val); return $this; } /** * Return list of all assigned variables * * @return array */ public function getVars() { return $this->_dataProvider->getData(); } /** * Clear all assigned variables * * Clears all variables assigned to Zend_View either via {@link assign()} or * property overloading ({@link __get()}/{@link __set()}). * * @return void * @return Dwoo_Adapters_ZendFramework_View */ public function clearVars() { $this->getDataProvider()->clear(); return $this; } /** * Wraper for parent's render method so preRender method * can be called (that will bind the plugin proxy to the * engine. * * @see Zend_View_Abstract::render * @return string The script output. */ public function render($name) { $this->preRender(); return parent::render($name); } /** * Processes a view script and outputs it. Output is then * passed through filters. * * @param string $name The script script name to process. * @return string The script output. */ public function _run() { echo $this->_engine->get( $this->getTemplateFile(func_get_arg(0)), $this->getDataProvider(), $this->getCompiler() ); } /** * Add plugin path * * @param string $dir Directory * @return Dwoo_Adapters_ZendFramework_View */ public function addPluginDir($dir) { $this->getEngine()->getLoader()->addDirectory($dir); return $this; } /** * Set compile path * * @param string $dir Directory * @return Dwoo_Adapters_ZendFramework_View */ public function setCompileDir($dir) { $this->getEngine()->setCompileDir($dir); return $this; } /** * Set cache path * * @param string $dir Directory * @return Dwoo_Adapters_ZendFramework_View */ public function setCacheDir($dir) { $this->getEngine()->setCacheDir($dir); return $this; } /** * Set cache lifetime * * @param string $seconds Lifetime in seconds * @return Dwoo_Adapters_ZendFramework_View */ public function setCacheLifetime($seconds) { $this->getEngine()->setCacheTime($seconds); return $this; } /** * Set charset * * @param string $charset * @return Dwoo_Adapters_ZendFramework_View */ public function setCharset($charset) { $this->_engine->setCharset($charset); return $this; } }