Пример #1
0
    /**
     * Retrieve rendered contents of a controller action
     *
     * If the action results in a forward or redirect, returns empty string.
     *
     * @param  string $action
     * @param  string $controller
     * @param  string $module Defaults to default module
     * @param  array $params
     * @return string
     */
    public function action($action, $controller, $module = null, array $params = array())
    {
        $this->resetObjects();
        if (null === $module) {
            $module = $this->defaultModule;
        }

        // clone the view object to prevent over-writing of view variables
        $viewRendererObj = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
        Zend_Controller_Action_HelperBroker::addHelper(clone $viewRendererObj);

        $this->request->setParams($params)
                      ->setModuleName($module)
                      ->setControllerName($controller)
                      ->setActionName($action)
                      ->setDispatched(true);

        $this->dispatcher->dispatch($this->request, $this->response);

        // reset the viewRenderer object to it's original state
        Zend_Controller_Action_HelperBroker::addHelper($viewRendererObj);


        if (!$this->request->isDispatched()
            || $this->response->isRedirect())
        {
            // forwards and redirects render nothing
            return '';
        }

        $return = $this->response->getBody();
        $this->resetObjects();
        return $return;
    }
Пример #2
0
 public function postDispatch(Zend_Controller_Request_Abstract $request)
 {
     if (!$request->isDispatched()) {
         return;
     }
     $view = $this->_view;
     if (count($view->headTitle()->getValue()) == 0) {
         $view->headTitle($view->title);
     }
     $view->headTitle()->setSeparator(' - ');
     $view->headTitle('Places to take the monsters!');
 }
Пример #3
0
 /**
  * postDispatch() plugin hook -- render layout
  *
  * @param  Zend_Controller_Request_Abstract $request
  * @return void
  */
 public function postDispatch(Zend_Controller_Request_Abstract $request)
 {
     $layout = $this->getLayout();
     $helper = $this->getLayoutActionHelper();
     // Return early if forward detected
     if (!$request->isDispatched() || $this->getResponse()->isRedirect() || $layout->getMvcSuccessfulActionOnly() && (!empty($helper) && !$helper->isActionControllerSuccessful())) {
         return;
     }
     // Return early if layout has been disabled
     if (!$layout->isEnabled() or !$this->getLayout()->isLoaded()) {
         return;
     }
     $response = $this->getResponse();
     $content = $response->getBody(true);
     $contentKey = $layout->getContentKey();
     if (isset($content['default'])) {
         $content[$contentKey] = $content['default'];
     }
     if ('default' != $contentKey) {
         unset($content['default']);
     }
     $layout->assign($content);
     $fullContent = null;
     $obStartLevel = ob_get_level();
     try {
         $fullContent = $layout->render();
         $response->setBody($fullContent);
     } catch (Exception $e) {
         while (ob_get_level() > $obStartLevel) {
             $fullContent .= ob_get_clean();
         }
         $request->setParam('layoutFullContent', $fullContent);
         $request->setParam('layoutContent', $layout->content);
         $response->setBody(null);
         if (Zend_Controller_Front::getInstance()->throwExceptions()) {
             throw $e;
         } else {
             $this->getResponse()->setException($e);
         }
     }
     return $this;
 }
Пример #4
0
 /**
  * postDispatch() plugin hook -- check for actions in stack, and dispatch if any found
  *
  * @param  Zend_Controller_Request_Abstract $request
  * @return void
  */
 public function postDispatch(Zend_Controller_Request_Abstract $request)
 {
     // Don't move on to next request if this is already an attempt to
     // forward
     if (!$request->isDispatched()) {
         return;
     }
     $this->setRequest($request);
     $stack = $this->getStack();
     if (empty($stack)) {
         return;
     }
     $next = $this->popStack();
     if (!$next) {
         return;
     }
     $this->forward($next);
 }
Пример #5
0
 /**
  * Dispatch an HTTP request to a controller/action.
  *
  * @param Zend_Controller_Request_Abstract|null $request
  * @param Zend_Controller_Response_Abstract|null $response
  * @return void|Zend_Controller_Response_Abstract Returns response object if returnResponse() is true
  */
 public function dispatch(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null)
 {
     if (!$this->getParam('noErrorHandler') && !$this->_plugins->hasPlugin('Zend_Controller_Plugin_ErrorHandler')) {
         // Register with stack index of 100
         #require_once 'Zend/Controller/Plugin/ErrorHandler.php';
         $this->_plugins->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(), 100);
     }
     if (!$this->getParam('noViewRenderer') && !Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) {
         #require_once 'Zend/Controller/Action/Helper/ViewRenderer.php';
         Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-80, new Zend_Controller_Action_Helper_ViewRenderer());
     }
     /**
      * Instantiate default request object (HTTP version) if none provided
      */
     if (null !== $request) {
         $this->setRequest($request);
     } elseif (null === $request && null === ($request = $this->getRequest())) {
         #require_once 'Zend/Controller/Request/Http.php';
         $request = new Zend_Controller_Request_Http();
         $this->setRequest($request);
     }
     /**
      * Set base URL of request object, if available
      */
     if (is_callable(array($this->_request, 'setBaseUrl'))) {
         if (null !== $this->_baseUrl) {
             $this->_request->setBaseUrl($this->_baseUrl);
         }
     }
     /**
      * Instantiate default response object (HTTP version) if none provided
      */
     if (null !== $response) {
         $this->setResponse($response);
     } elseif (null === $this->_response && null === ($this->_response = $this->getResponse())) {
         #require_once 'Zend/Controller/Response/Http.php';
         $response = new Zend_Controller_Response_Http();
         $this->setResponse($response);
     }
     /**
      * Register request and response objects with plugin broker
      */
     $this->_plugins->setRequest($this->_request)->setResponse($this->_response);
     /**
      * Initialize router
      */
     $router = $this->getRouter();
     $router->setParams($this->getParams());
     /**
      * Initialize dispatcher
      */
     $dispatcher = $this->getDispatcher();
     $dispatcher->setParams($this->getParams())->setResponse($this->_response);
     // Begin dispatch
     try {
         /**
          * Route request to controller/action, if a router is provided
          */
         /**
          * Notify plugins of router startup
          */
         $this->_plugins->routeStartup($this->_request);
         $router->route($this->_request);
         /**
          * Notify plugins of router completion
          */
         $this->_plugins->routeShutdown($this->_request);
         /**
          * Notify plugins of dispatch loop startup
          */
         $this->_plugins->dispatchLoopStartup($this->_request);
         /**
          *  Attempt to dispatch the controller/action. If the $this->_request
          *  indicates that it needs to be dispatched, move to the next
          *  action in the request.
          */
         do {
             $this->_request->setDispatched(true);
             /**
              * Notify plugins of dispatch startup
              */
             $this->_plugins->preDispatch($this->_request);
             /**
              * Skip requested action if preDispatch() has reset it
              */
             if (!$this->_request->isDispatched()) {
                 continue;
             }
             /**
              * Dispatch request
              */
             try {
                 $dispatcher->dispatch($this->_request, $this->_response);
             } catch (Exception $e) {
                 if ($this->throwExceptions()) {
                     throw $e;
                 }
                 $this->_response->setException($e);
             }
             /**
              * Notify plugins of dispatch completion
              */
             $this->_plugins->postDispatch($this->_request);
         } while (!$this->_request->isDispatched());
     } catch (Exception $e) {
         if ($this->throwExceptions()) {
             throw $e;
         }
         $this->_response->setException($e);
     }
     /**
      * Notify plugins of dispatch loop completion
      */
     try {
         $this->_plugins->dispatchLoopShutdown();
     } catch (Exception $e) {
         if ($this->throwExceptions()) {
             throw $e;
         }
         $this->_response->setException($e);
     }
     if ($this->returnResponse()) {
         return $this->_response;
     }
     $this->_response->sendResponse();
 }
Пример #6
0
 /**
  * postDispatch() plugin hook -- check for actions in stack, and dispatch if any found
  *
  * @param  Zend_Controller_Request_Abstract $request
  * @return void
  */
 public function postDispatch(Zend_Controller_Request_Abstract $request)
 {
     // Don't move on to next request if this is already an attempt to
     // forward
     if (!$request->isDispatched()) {
         return;
     }
     if ($this->_enabled) {
         $helper = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
         if (!$this->_isStackInit) {
             $this->_scriptPaths = $helper->view->getScriptPaths();
             $this->_scriptName = $helper->getViewScript();
             $this->initStack($request);
             $this->_vars['content'] = $helper->view->getVars();
             $this->_vars['widgets'] = array();
         } else {
             $vars = $helper->view->getVars();
             $module = Zend_Filter::filterStatic($request->getModuleName(), $this->_options['nameFilter']);
             $controller = Zend_Filter::filterStatic($request->getControllerName(), $this->_options['nameFilter']);
             $action = Zend_Filter::filterStatic($request->getActionName(), $this->_options['nameFilter']);
             $this->_checkStructure($module, $controller);
             $this->_vars['widgets'][$module][$controller][$action] = $vars;
         }
         $helper->view->clearVars();
         $next = $this->popStack();
         if ($next) {
             $this->forward($next);
         }
     }
 }
Пример #7
0
 /**
  * postDispatch() plugin hook -- render layout
  *
  * @param  Zend_Controller_Request_Abstract $request
  * @return void
  */
 public function postDispatch(Zend_Controller_Request_Abstract $request)
 {
     $layout = $this->getLayout();
     $helper = $this->getLayoutActionHelper();
     // Return early if forward detected
     if (!$request->isDispatched() || $this->getResponse()->isRedirect() || $layout->getMvcSuccessfulActionOnly() && (!empty($helper) && !$helper->isActionControllerSuccessful())) {
         $layout->setLayout(null);
         return;
     }
     // Return early if layout has been disabled
     if (!$layout->isEnabled()) {
         return;
     }
     // two logic mix
     $layoutName = $layout->getLayout();
     if (Axis_Area::isFrontend()) {
         $this->_initPages();
         if (empty($layoutName)) {
             $layoutName = $this->_getLayoutName();
         }
         $this->_initBlockAssigns();
     } elseif (empty($layoutName)) {
         $layoutName = 'layout';
     }
     $layout->setLayout($layoutName, false);
     $response = $this->getResponse();
     $content = $response->getBody(true);
     $contentKey = $layout->getContentKey();
     if (isset($content['default'])) {
         $content[$contentKey] = $content['default'];
     }
     if ('default' != $contentKey) {
         unset($content['default']);
     }
     $layout->assign($content);
     $fullContent = null;
     $obStartLevel = ob_get_level();
     try {
         $fullContent = $layout->render();
         $response->setBody($fullContent);
     } catch (Exception $e) {
         while (ob_get_level() > $obStartLevel) {
             $fullContent .= ob_get_clean();
         }
         $request->setParam('layoutFullContent', $fullContent);
         $request->setParam('layoutContent', $layout->content);
         $response->setBody(null);
         throw $e;
     }
 }
Пример #8
0
 /**
  * Returns TRUE if the Zend_Controller_Request_Abstract object can be dispatched to a controller.
  * This only verifies that the Zend_Controller_Action can be dispatched and does not
  * guarantee that the action will be accepted by the Zend_Controller_Action.
  *
  * @param Zend_Controller_Request_Abstract $action
  * @return unknown
  */
 public function isDispatchable(Zend_Controller_Request_Abstract $request)
 {
     if ($request->isDispatched()) {
         return false;
     }
     return $this->_dispatch($request, false);
 }
 /**
  * Hook 12: Called after an action is dispatched by \Zend_Controller_Dispatcher.
  *
  * This callback allows for proxy or filter behavior. By altering the
  * request and resetting its dispatched flag (via {@link
  * \Zend_Controller_Request_Abstract::setDispatched() setDispatched(false)}),
  * a new action may be specified for dispatching.
  *
  * \Zend_Layout_Controller_Plugin_Layout uses this event to change the output
  * of the $response with the rendering of the layout. As the Layout plugin
  * has a priority of 99, this Escort event will take place before the layout
  * is rendered, unless $this->run() was called with a stackIndex lower than zero.
  *
  * Previous hook: controllerAfterAction()
  * Actions since: ob_get_clean(); $response->appendBody()
  * Actions after: while (! Request->isDispatched()) or back to Hook 8 preDispatch()
  * Next hook: dispatchLoopShutdown()
  *
  * @param  \Zend_Controller_Request_Abstract $request
  * @return void
  */
 public function postDispatch(\Zend_Controller_Request_Abstract $request)
 {
     if ($request->isDispatched()) {
         $response = \Zend_Controller_Front::getInstance()->getResponse();
         $response->setHeader('X-UA-Compatible', 'IE=edge,chrome=1', true);
         if ($this->project->offsetExists('x-frame')) {
             $response->setHeader('X-Frame-Options', $this->project->offsetGet('x-frame'), true);
         }
         // Only when we need to render the layout, we run the layout prepare
         if (\Zend_Controller_Action_HelperBroker::hasHelper('layout') && \Zend_Controller_Action_HelperBroker::getExistingHelper('layout')->isEnabled()) {
             // Per project layout preparation
             if (isset($this->project->layoutPrepare)) {
                 foreach ($this->project->layoutPrepare as $prepare => $type) {
                     if ($type) {
                         $function = '_layout' . ucfirst($prepare);
                         if (isset($this->project->layoutPrepareArgs, $this->project->layoutPrepareArgs[$prepare])) {
                             $args = $this->project->layoutPrepareArgs[$prepare];
                         } else {
                             $args = array();
                         }
                         $result = $this->{$function}($args);
                         // When a result is returned, add it to the view,
                         // according to the type method
                         if (null !== $result) {
                             if (is_numeric($type)) {
                                 $this->view->{$prepare} = $result;
                             } else {
                                 if (!isset($this->view->{$type})) {
                                     $this->view->{$type} = new \MUtil_Html_Sequence();
                                 }
                                 $sequence = $this->view->{$type};
                                 $sequence[$prepare] = $result;
                             }
                         }
                     }
                 }
             }
         }
         // For AJAX calls we sometimes need to add JQuery onload scripts since otherwise they won't get rendered:
         // We expect JQuery to be loaded in the master page, since the call is probably made using JQuery
         if ($request instanceof \Zend_Controller_Request_Http && $request->isXmlHttpRequest()) {
             \MUtil_JQuery::enableView($this->view);
             $scripts = $this->view->jQuery()->getOnLoadActions();
             $content = '';
             foreach ($scripts as $script) {
                 $content .= "<script type='text/javascript'>{$script}</script>\n";
             }
             $content .= $this->view->inlineScript();
             // Now cleanup the rendered content (just to make sure)
             $this->view->jQuery()->clearOnLoadActions();
             $this->view->inlineScript()->exchangeArray(array());
             if (!empty($content)) {
                 $response->appendBody($content);
             }
         }
     }
 }
Пример #10
0
 /**
  * 加载模块布局
  * 
  * @see Zend_Layout_Controller_Plugin_Layout::postDispatch()
  * @return void
  */
 public function postDispatch(Zend_Controller_Request_Abstract $request)
 {
     if ($this->_layout->getMvcSuccessfulActionOnly() && (!empty($this->_layoutActionHelper) && !$this->_layoutActionHelper->isActionControllerSuccessful()) || !$this->_layout->isEnabled() || !$request->isDispatched() || $this->_response->isRedirect()) {
         return;
     }
     if ($this->hasModuleLayout($module = $request->getModuleName())) {
         $content = $this->_response->getBody(true);
         if (isset($content['default'])) {
             $content[$this->_layout->getContentKey()] = $content['default'];
         }
         if ('default' != $this->_layout->getContentKey()) {
             unset($content['default']);
         }
         $this->_layout->assign($content);
         try {
             $this->_response->setBody($this->_layout->render(self::$_moduleLayout[$module]));
         } catch (Exception $e) {
             $this->_response->setBody(null);
             throw $e;
         }
     }
     parent::postDispatch($request);
 }