public static function noControllerResponse(XenForo_RouteMatch $routeMatch, Zend_Controller_Request_Http $request) { self::sendErrorPageHeaders(); if (XenForo_Application::debugMode()) { echo 'Failed to get controller response and reroute to error handler (' . $routeMatch->getControllerName() . '::action' . $routeMatch->getAction() . ')'; if ($request->getParam('_exception')) { echo self::getExceptionTrace($request->getParam('_exception')); } } else { echo self::_getPhrasedTextIfPossible('An unexpected error occurred. Please try again later.', 'unexpected_error_occurred'); } }
protected function _dispatch(array $widget, $controllerName, $controllerAction) { if (empty(WidgetFramework_Listener::$fc)) { return null; } $routeMatch = new XenForo_RouteMatch($controllerName, $controllerAction); // do not use `html` response type to avoid being redirected by // XenForo_Controller::canonicalizeRequestUrl $routeMatch->setResponseType(get_class($this)); try { $controllerResponse = WidgetFramework_Listener::$fc->dispatch($routeMatch); return $controllerResponse; } catch (Exception $e) { return null; } }
public static function frontControllerPreDispatch(XenForo_FrontController $fc, XenForo_RouteMatch &$routeMatch) { if (defined('DEVTOOLS_AUTOLOADER_SETUP') or self::$_checked or $routeMatch->getResponseType() != 'html') { return; } $paths = XenForo_Application::getInstance()->loadRequestPaths(); $url = $paths['fullBasePath'] . 'filesync.php'; if (class_exists('XenForo_Dependencies_Admin', false)) { $url .= '?admin=1'; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); ob_start(); curl_exec($ch); curl_close($ch); self::$_syncOutput = ob_get_contents(); $logs = explode('<pre>', self::$_syncOutput); $errors = array(); foreach ($logs as $log) { $lines = explode("\n", $log); foreach ($lines as $line) { if (strpos($line, 'E:') === 0) { $origLine = str_replace('E: ', '', $line); $line = '<strong>' . htmlspecialchars($origLine); $pos = strpos($line, ':'); $line = substr($line, 0, $pos) . '</strong><i>' . substr($line, $pos); $pos = strpos($line, ' in ' . DIRECTORY_SEPARATOR); // hacked him! $line = substr($line, 0, $pos) . '</i>' . substr($line, $pos); $errors[] = $line; DevTools_ChromePhp::error(trim($origLine)); } else { DevTools_ChromePhp::log(trim($line)); } } } ob_end_clean(); self::$_checked = true; self::$_errors = $errors; }
/** * Executes the controller dispatch loop. * * @param XenForo_RouteMatch $routeMatch * * @return XenForo_ControllerResponse_Abstract|null Null will only occur if error handling is broken */ public function dispatch(XenForo_RouteMatch &$routeMatch) { $reroute = array('controllerName' => $routeMatch->getControllerName(), 'action' => $routeMatch->getAction()); $allowReroute = true; do { if (isset($reroute['path'])) { $routeMatch = $this->route($reroute['path']); $reroute = array('controllerName' => $routeMatch->getControllerName(), 'action' => $routeMatch->getAction()); } $controllerResponse = null; $controllerName = $reroute['controllerName']; $action = str_replace(array('-', '/'), ' ', strtolower($reroute['action'])); $action = str_replace(' ', '', ucwords($action)); if ($action === '') { $action = 'Index'; } $reroute = false; $controller = $this->_getValidatedController($controllerName, $action, $routeMatch); if ($controller) { try { try { $controller->preDispatch($action, $controllerName); $controllerResponse = $controller->{'action' . $action}(); } catch (XenForo_ControllerResponse_Exception $e) { $controllerResponse = $e->getControllerResponse(); } $controller->postDispatch($controllerResponse, $controllerName, $action); $reroute = $this->_handleControllerResponse($controllerResponse, $controllerName, $action); } catch (Exception $e) { // this is a bit hacky, but it's a selective catch so it's a strange case if ($e instanceof XenForo_Exception && $e->isUserPrintable()) { $controllerResponse = $this->_getErrorResponseFromException($e); $controller->postDispatch($controllerResponse, $controllerName, $action); } else { if (!$allowReroute) { break; } $reroute = $this->_rerouteServerError($e); $allowReroute = false; XenForo_Error::logException($e); } } $responseType = $controller->getResponseType(); $this->_dependencies->mergeViewStateChanges($controller->getViewStateChanges()); } else { if (!$allowReroute) { break; } $reroute = $this->_rerouteNotFound($controllerName, $action); $allowReroute = false; } } while ($reroute); if ($controllerResponse instanceof XenForo_ControllerResponse_Abstract) { $controllerResponse->controllerName = $controllerName; $controllerResponse->controllerAction = $action; } return $controllerResponse; }
/** * Gets the type of response that has been requested. * * @return string */ public function getResponseType() { return $this->_routeMatch->getResponseType(); }
public static function controllerPreDispatch(XenForo_FrontController $fc, XenForo_RouteMatch &$routeMatch) { /* Listener - Execution order: #1 */ self::$_responseType = $routeMatch->getResponseType(); }
/** * @return bdSocialShare_Shareable_Abstract */ public function getShareableForRouteMatchAndRequest(XenForo_RouteMatch $routeMatch, Zend_Controller_Request_Http $request) { $shareable = null; switch ($routeMatch->getControllerName()) { case 'NFLJ_Showcase_ControllerPublic_Index': case 'NFLJ_Showcase_ControllerPublic_Showcase': $itemId = $request->getParam('item_id'); if (!empty($itemId)) { $shareable = bdSocialShare_Shareable_NFLJ_Showcase_Item::createFromId($itemId); } break; case 'sonnb_XenGallery_ControllerPublic_XenGallery_Photo': $contentId = $request->getParam('content_id'); if (!empty($contentId)) { $shareable = bdSocialShare_Shareable_sonnb_XenGallery_Photo::createFromId($contentId); } break; case 'sonnb_XenGallery_ControllerPublic_XenGallery_Video': $contentId = $request->getParam('content_id'); if (!empty($contentId)) { $shareable = bdSocialShare_Shareable_sonnb_XenGallery_Video::createFromId($contentId); } break; case 'XenForo_ControllerPublic_Post': $postId = $request->getParam('post_id'); if (!empty($postId)) { $shareable = bdSocialShare_Shareable_Post::createFromId($postId); } break; case 'XenForo_ControllerPublic_ProfilePost': $profilePostId = $request->getParam('profile_post_id'); if (!empty($profilePostId)) { $shareable = bdSocialShare_Shareable_ProfilePost::createFromId($profilePostId); } break; case 'XenForo_ControllerPublic_Thread': $threadId = $request->getParam('thread_id'); if (!empty($threadId)) { $thread = $this->getModelFromCache('XenForo_Model_Thread')->getThreadById($threadId); if (!empty($thread)) { $shareable = bdSocialShare_Shareable_Post::createFromId($thread['first_post_id']); } } break; case 'XenGallery_ControllerPublic_Media': $mediaId = $request->getParam('media_id'); if (!empty($mediaId)) { $shareable = bdSocialShare_Shareable_XenGallery_Media::createFromId($mediaId); } break; case 'XenResource_ControllerPublic_Resource': $resourceId = $request->getParam('resource_id'); if (!empty($resourceId)) { $shareable = bdSocialShare_Shareable_XenResource_Resource::createFromId($resourceId); } break; } return $shareable; }
protected function _actionGetParseLink_getControllerResponse($link, Zend_Controller_Request_Http $request, XenForo_RouteMatch $routeMatch) { switch ($routeMatch->getControllerName()) { case 'XenForo_ControllerPublic_Forum': $nodeId = $request->getParam('node_id'); if (empty($nodeId)) { $nodeName = $request->getParam('node_name'); if (!empty($nodeName)) { /* @var $nodeModel XenForo_Model_Node */ $nodeModel = $this->getModelFromCache('XenForo_Model_Node'); $node = $nodeModel->getNodeByName($nodeName, 'Forum'); if (!empty($node)) { $nodeId = $node['node_id']; } } } if (!empty($nodeId)) { $this->_request->setParam('forum_id', $nodeId); } return $this->responseReroute('bdApi_ControllerApi_Thread', 'get-index'); case 'XenForo_ControllerPublic_Thread': $threadId = $request->getParam('thread_id'); if (!empty($threadId)) { $this->_request->setParam('thread_id', $threadId); $linkFragment = parse_url($link, PHP_URL_FRAGMENT); if (!empty($linkFragment) and preg_match('#^post-(?<post_id>\\d+)$#', $linkFragment, $fragment)) { $this->_request->setParam('page_of_post_id', $fragment['post_id']); } return $this->responseReroute('bdApi_ControllerApi_Post', 'get-index'); } break; case 'XenForo_ControllerPublic_Post': $postId = $request->getParam('post_id'); if (!empty($postId)) { $this->_request->setParam('page_of_post_id', $postId); return $this->responseReroute('bdApi_ControllerApi_Post', 'get-index'); } break; } return null; }