PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/library/Zend/Controller/Action/HelperBroker.php

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