00001 <?php
00024 require_once 'Zend/View/Helper/Abstract.php';
00025
00034 class Zend_View_Helper_Action extends Zend_View_Helper_Abstract
00035 {
00039 public $defaultModule;
00040
00044 public $dispatcher;
00045
00049 public $request;
00050
00054 public $response;
00055
00063 public function __construct()
00064 {
00065 $front = Zend_Controller_Front::getInstance();
00066 $modules = $front->getControllerDirectory();
00067 if (empty($modules)) {
00068 require_once 'Zend/View/Exception.php';
00069 throw new Zend_View_Exception('Action helper depends on valid front controller instance');
00070 }
00071
00072 $request = $front->getRequest();
00073 $response = $front->getResponse();
00074
00075 if (empty($request) || empty($response)) {
00076 require_once 'Zend/View/Exception.php';
00077 throw new Zend_View_Exception('Action view helper requires both a registered request and response object in the front controller instance');
00078 }
00079
00080 $this->request = clone $request;
00081 $this->response = clone $response;
00082 $this->dispatcher = clone $front->getDispatcher();
00083 $this->defaultModule = $front->getDefaultModule();
00084 }
00085
00091 public function resetObjects()
00092 {
00093 $params = $this->request->getUserParams();
00094 foreach (array_keys($params) as $key) {
00095 $this->request->setParam($key, null);
00096 }
00097
00098 $this->response->clearBody();
00099 $this->response->clearHeaders()
00100 ->clearRawHeaders();
00101 }
00102
00114 public function action($action, $controller, $module = null, array $params = array())
00115 {
00116 $this->resetObjects();
00117 if (null === $module) {
00118 $module = $this->defaultModule;
00119 }
00120
00121
00122 $viewRendererObj = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
00123 Zend_Controller_Action_HelperBroker::addHelper(clone $viewRendererObj);
00124
00125 $this->request->setParams($params)
00126 ->setModuleName($module)
00127 ->setControllerName($controller)
00128 ->setActionName($action)
00129 ->setDispatched(true);
00130
00131 $this->dispatcher->dispatch($this->request, $this->response);
00132
00133
00134 Zend_Controller_Action_HelperBroker::addHelper($viewRendererObj);
00135
00136
00137 if (!$this->request->isDispatched()
00138 || $this->response->isRedirect())
00139 {
00140
00141 return '';
00142 }
00143
00144 $return = $this->response->getBody();
00145 $this->resetObjects();
00146 return $return;
00147 }
00148
00154 public function cloneView()
00155 {
00156 $view = clone $this->view;
00157 $view->clearVars();
00158 return $view;
00159 }
00160 }