PageRenderTime 42ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/DevApp/library/ServerLibraries/ZendFramework/1.7/library/Zend/Controller/Action/HelperBroker.php

http://firephp.googlecode.com/
PHP | 380 lines | 166 code | 40 blank | 174 comment | 14 complexity | ce3b9fb94d14ca39f64fa261d419eeff MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.0, MIT, Apache-2.0
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Controller
  17. * @subpackage Zend_Controller_Action
  18. * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. */
  21. /**
  22. * @see Zend_Controller_Action_HelperBroker_PriorityStack
  23. */
  24. require_once 'Zend/Controller/Action/HelperBroker/PriorityStack.php';
  25. /**
  26. * @see Zend_Loader
  27. */
  28. require_once 'Zend/Loader.php';
  29. /**
  30. * @category Zend
  31. * @package Zend_Controller
  32. * @subpackage Zend_Controller_Action
  33. * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
  34. * @license http://framework.zend.com/license/new-bsd New BSD License
  35. */
  36. class Zend_Controller_Action_HelperBroker
  37. {
  38. /**
  39. * $_actionController - ActionController reference
  40. *
  41. * @var Zend_Controller_Action
  42. */
  43. protected $_actionController;
  44. /**
  45. * @var Zend_Loader_PluginLoader_Interface
  46. */
  47. protected static $_pluginLoader;
  48. /**
  49. * $_helpers - Helper array
  50. *
  51. * @var Zend_Controller_Action_HelperBroker_PriorityStack
  52. */
  53. protected static $_stack = null;
  54. /**
  55. * Set PluginLoader for use with broker
  56. *
  57. * @param Zend_Loader_PluginLoader_Interface $loader
  58. * @return void
  59. */
  60. public static function setPluginLoader($loader)
  61. {
  62. if ((null !== $loader) && (!$loader instanceof Zend_Loader_PluginLoader_Interface)) {
  63. require_once 'Zend/Controller/Action/Exception.php';
  64. throw new Zend_Controller_Action_Exception('Invalid plugin loader provided to HelperBroker');
  65. }
  66. self::$_pluginLoader = $loader;
  67. }
  68. /**
  69. * Retrieve PluginLoader
  70. *
  71. * @return Zend_Loader_PluginLoader
  72. */
  73. public static function getPluginLoader()
  74. {
  75. if (null === self::$_pluginLoader) {
  76. require_once 'Zend/Loader/PluginLoader.php';
  77. self::$_pluginLoader = new Zend_Loader_PluginLoader(array(
  78. 'Zend_Controller_Action_Helper' => 'Zend/Controller/Action/Helper/',
  79. ));
  80. }
  81. return self::$_pluginLoader;
  82. }
  83. /**
  84. * addPrefix() - Add repository of helpers by prefix
  85. *
  86. * @param string $prefix
  87. */
  88. static public function addPrefix($prefix)
  89. {
  90. $prefix = rtrim($prefix, '_');
  91. $path = str_replace('_', DIRECTORY_SEPARATOR, $prefix);
  92. self::getPluginLoader()->addPrefixPath($prefix, $path);
  93. }
  94. /**
  95. * addPath() - Add path to repositories where Action_Helpers could be found.
  96. *
  97. * @param string $path
  98. * @param string $prefix Optional; defaults to 'Zend_Controller_Action_Helper'
  99. * @return void
  100. */
  101. static public function addPath($path, $prefix = 'Zend_Controller_Action_Helper')
  102. {
  103. self::getPluginLoader()->addPrefixPath($prefix, $path);
  104. }
  105. /**
  106. * addHelper() - Add helper objects
  107. *
  108. * @param Zend_Controller_Action_Helper_Abstract $helper
  109. * @return void
  110. */
  111. static public function addHelper(Zend_Controller_Action_Helper_Abstract $helper)
  112. {
  113. self::getStack()->push($helper);
  114. return;
  115. }
  116. /**
  117. * resetHelpers()
  118. *
  119. * @return void
  120. */
  121. static public function resetHelpers()
  122. {
  123. self::$_stack = null;
  124. return;
  125. }
  126. /**
  127. * Retrieve or initialize a helper statically
  128. *
  129. * Retrieves a helper object statically, loading on-demand if the helper
  130. * does not already exist in the stack. Always returns a helper, unless
  131. * the helper class cannot be found.
  132. *
  133. * @param string $name
  134. * @return Zend_Controller_Action_Helper_Abstract
  135. */
  136. public static function getStaticHelper($name)
  137. {
  138. $name = self::_normalizeHelperName($name);
  139. $stack = self::getStack();
  140. if (!isset($stack->{$name})) {
  141. self::_loadHelper($name);
  142. }
  143. return $stack->{$name};
  144. }
  145. /**
  146. * getExistingHelper() - get helper by name
  147. *
  148. * Static method to retrieve helper object. Only retrieves helpers already
  149. * initialized with the broker (either via addHelper() or on-demand loading
  150. * via getHelper()).
  151. *
  152. * Throws an exception if the referenced helper does not exist in the
  153. * stack; use {@link hasHelper()} to check if the helper is registered
  154. * prior to retrieving it.
  155. *
  156. * @param string $name
  157. * @return Zend_Controller_Action_Helper_Abstract
  158. * @throws Zend_Controller_Action_Exception
  159. */
  160. public static function getExistingHelper($name)
  161. {
  162. $name = self::_normalizeHelperName($name);
  163. $stack = self::getStack();
  164. if (!isset($stack->{$name})) {
  165. require_once 'Zend/Controller/Action/Exception.php';
  166. throw new Zend_Controller_Action_Exception('Action helper "' . $name . '" has not been registered with the helper broker');
  167. }
  168. return $stack->{$name};
  169. }
  170. /**
  171. * Return all registered helpers as helper => object pairs
  172. *
  173. * @return array
  174. */
  175. public static function getExistingHelpers()
  176. {
  177. return self::getStack()->getHelpersByName();
  178. }
  179. /**
  180. * Is a particular helper loaded in the broker?
  181. *
  182. * @param string $name
  183. * @return boolean
  184. */
  185. public static function hasHelper($name)
  186. {
  187. $name = self::_normalizeHelperName($name);
  188. return isset(self::getStack()->{$name});
  189. }
  190. /**
  191. * Remove a particular helper from the broker
  192. *
  193. * @param string $name
  194. * @return boolean
  195. */
  196. public static function removeHelper($name)
  197. {
  198. $name = self::_normalizeHelperName($name);
  199. $stack = self::getStack();
  200. if (isset($stack->{$name})) {
  201. unset($stack->{$name});
  202. }
  203. return false;
  204. }
  205. /**
  206. * Lazy load the priority stack and return it
  207. *
  208. * @return Zend_Controller_Action_HelperBroker_PriorityStack
  209. */
  210. public static function getStack()
  211. {
  212. if (self::$_stack == null) {
  213. self::$_stack = new Zend_Controller_Action_HelperBroker_PriorityStack();
  214. }
  215. return self::$_stack;
  216. }
  217. /**
  218. * Constructor
  219. *
  220. * @param Zend_Controller_Action $actionController
  221. * @return void
  222. */
  223. public function __construct(Zend_Controller_Action $actionController)
  224. {
  225. $this->_actionController = $actionController;
  226. foreach (self::getStack() as $helper) {
  227. $helper->setActionController($actionController);
  228. $helper->init();
  229. }
  230. }
  231. /**
  232. * notifyPreDispatch() - called by action controller dispatch method
  233. *
  234. * @return void
  235. */
  236. public function notifyPreDispatch()
  237. {
  238. foreach (self::getStack() as $helper) {
  239. $helper->preDispatch();
  240. }
  241. }
  242. /**
  243. * notifyPostDispatch() - called by action controller dispatch method
  244. *
  245. * @return void
  246. */
  247. public function notifyPostDispatch()
  248. {
  249. foreach (self::getStack() as $helper) {
  250. $helper->postDispatch();
  251. }
  252. }
  253. /**
  254. * getHelper() - get helper by name
  255. *
  256. * @param string $name
  257. * @return Zend_Controller_Action_Helper_Abstract
  258. */
  259. public function getHelper($name)
  260. {
  261. $name = self::_normalizeHelperName($name);
  262. $stack = self::getStack();
  263. if (!isset($stack->{$name})) {
  264. self::_loadHelper($name);
  265. }
  266. $helper = $stack->{$name};
  267. $initialize = false;
  268. if (null === ($actionController = $helper->getActionController())) {
  269. $initialize = true;
  270. } elseif ($actionController !== $this->_actionController) {
  271. $initialize = true;
  272. }
  273. if ($initialize) {
  274. $helper->setActionController($this->_actionController)
  275. ->init();
  276. }
  277. return $helper;
  278. }
  279. /**
  280. * Method overloading
  281. *
  282. * @param string $method
  283. * @param array $args
  284. * @return mixed
  285. * @throws Zend_Controller_Action_Exception if helper does not have a direct() method
  286. */
  287. public function __call($method, $args)
  288. {
  289. $helper = $this->getHelper($method);
  290. if (!method_exists($helper, 'direct')) {
  291. require_once 'Zend/Controller/Action/Exception.php';
  292. throw new Zend_Controller_Action_Exception('Helper "' . $method . '" does not support overloading via direct()');
  293. }
  294. return call_user_func_array(array($helper, 'direct'), $args);
  295. }
  296. /**
  297. * Retrieve helper by name as object property
  298. *
  299. * @param string $name
  300. * @return Zend_Controller_Action_Helper_Abstract
  301. */
  302. public function __get($name)
  303. {
  304. return $this->getHelper($name);
  305. }
  306. /**
  307. * Normalize helper name for lookups
  308. *
  309. * @param string $name
  310. * @return string
  311. */
  312. protected static function _normalizeHelperName($name)
  313. {
  314. if (strpos($name, '_') !== false) {
  315. $name = str_replace(' ', '', ucwords(str_replace('_', ' ', $name)));
  316. }
  317. return ucfirst($name);
  318. }
  319. /**
  320. * Load a helper
  321. *
  322. * @param string $name
  323. * @return void
  324. */
  325. protected static function _loadHelper($name)
  326. {
  327. try {
  328. $class = self::getPluginLoader()->load($name);
  329. } catch (Zend_Loader_PluginLoader_Exception $e) {
  330. require_once 'Zend/Controller/Action/Exception.php';
  331. throw new Zend_Controller_Action_Exception('Action Helper by name ' . $name . ' not found');
  332. }
  333. $helper = new $class();
  334. if (!$helper instanceof Zend_Controller_Action_Helper_Abstract) {
  335. require_once 'Zend/Controller/Action/Exception.php';
  336. throw new Zend_Controller_Action_Exception('Helper name ' . $name . ' -> class ' . $class . ' is not of type Zend_Controller_Action_Helper_Abstract');
  337. }
  338. self::getStack()->push($helper);
  339. }
  340. }