/** * Creates the view renderer for a specified response type. If an invalid * type is specified, false is returned. * * @param Zend_Controller_Response_Http Response object * @param string Type of response * @param Zend_Controller_Request_Http Request object * * @return XenForo_ViewRenderer_Abstract|false */ public function getViewRenderer(Zend_Controller_Response_Http $response, $responseType, Zend_Controller_Request_Http $request) { $renderer = parent::getViewRenderer($response, $responseType, $request); if (!$renderer) { $renderer = new XenForo_ViewRenderer_HtmlInstall($this, $response, $request); } return $renderer; }
/** * Renders the view. * * @param XenForo_ControllerResponse_Abstract Controller response object from last controller * @param XenForo_ViewRenderer_Abstract View renderer for specified response type * @param array Extra container params (probably "sections" from routing) * * @return string View output */ public function renderView(XenForo_ControllerResponse_Abstract $controllerResponse, XenForo_ViewRenderer_Abstract $viewRenderer, array $containerParams = array(), $innerContent = "", $newParams = array()) { $this->_dependencies->preRenderView($controllerResponse); $this->_response->setHeader('Last-Modified', gmdate('D, d M Y H:i:s') . ' GMT', true); if ($controllerResponse->responseCode) { $this->_response->setHttpResponseCode($controllerResponse->responseCode); } /* if ($controllerResponse instanceof XenForo_ControllerResponse_Error) { $innerContent = $viewRenderer->renderError($controllerResponse->errorText); } else if ($controllerResponse instanceof XenForo_ControllerResponse_Message) { $innerContent = $viewRenderer->renderMessage($controllerResponse->message); } else if ($controllerResponse instanceof XenForo_ControllerResponse_View) { $innerContent = $viewRenderer->renderView( $controllerResponse->viewName, $controllerResponse->params, $controllerResponse->templateName, $controllerResponse->subView ); } else if ($controllerResponse instanceof XenForo_ControllerResponse_Redirect) { $target = XenForo_Link::convertUriToAbsoluteUri($controllerResponse->redirectTarget); $innerContent = $viewRenderer->renderRedirect( $controllerResponse->redirectType, $target, $controllerResponse->redirectMessage, $controllerResponse->redirectParams ); } else { // generally shouldn't happen $innerContent = false; } if ($innerContent === false || $innerContent === null) { $innerContent = $viewRenderer->renderUnrepresentable(); } */ if ($viewRenderer->getNeedsContainer()) { $specificContainerParams = XenForo_Application::mapMerge($containerParams, $controllerResponse->containerParams); $containerParams = $this->_dependencies->getEffectiveContainerParams($specificContainerParams, $this->_request); return $viewRenderer->renderContainer($innerContent, $containerParams, $newParams); } else { return $innerContent; } }
/** * Intercept a request for a link redirect * * @param string|bool $error If non-false, an error that occurred when validating the request */ protected function _outputLinkRedirect($error) { if ($error === 'invalid_url') { header('Content-Type: text/html; utf-8', true, 500); die('Invalid URL'); } if (empty(XenForo_Application::getOptions()->imageLinkProxy['links'])) { $error = 'disabled'; } if (!$error) { /* @var $proxyModel XenForo_Model_LinkProxy */ $proxyModel = XenForo_Model::create('XenForo_Model_LinkProxy'); $linkId = $proxyModel->logVisit($this->_url); if ($linkId && !empty(XenForo_Application::getOptions()->imageLinkProxyReferrer['enabled']) && $this->_referrer) { $proxyModel->logLinkReferrer($linkId, $this->_referrer); } if ($this->_json) { header('Content-type: application/json; charset=UTF-8'); echo json_encode(array('logged' => true)); exit; } // this used to redirect, but we don't take this approach any longer, so we display an intersitial } $request = new Zend_Controller_Request_Http(); XenForo_Session::startPublicSession($request); $this->_dependencies->preRenderView(); if (!preg_match('#^https?://#i', $this->_url)) { throw new Exception('Unsafe proxy URL: ' . $this->_url); } $printable = urldecode($this->_url); if (!preg_match('/./u', $printable)) { $printable = $this->_url; } $renderer = new XenForo_ViewRenderer_HtmlPublic($this->_dependencies, $this->_response, $request); $contents = $renderer->createTemplateObject('link_redirect', array('url' => $this->_url, 'printable' => $printable, 'parts' => parse_url($this->_url))); $containerParams = $this->_dependencies->getEffectiveContainerParams(array(), $request); $output = $renderer->renderContainer($contents, $containerParams); $extraHeaders = XenForo_Application::gzipContentIfSupported($output); foreach ($extraHeaders as $extraHeader) { $this->_response->setHeader($extraHeader[0], $extraHeader[1], $extraHeader[2]); } $this->_response->setHeader('X-Proxy-Error', $error); $this->_response->sendHeaders(); echo $output; }
/** * Performs any pre-view rendering setup, such as getting style information and * ensuring the correct data is registered. * * @param XenForo_ControllerResponse_Abstract|null $controllerResponse */ public function preRenderView(XenForo_ControllerResponse_Abstract $controllerResponse = null) { parent::preRenderView($controllerResponse); XenForo_Template_Abstract::setLanguageId(XenForo_Phrase::getLanguageId()); $properties = XenForo_Application::get('adminStyleProperties'); XenForo_Template_Helper_Core::setStyleProperties($properties); $this->_defaultTemplateParams['_styleModifiedDate'] = XenForo_Application::get('adminStyleModifiedDate'); }
/** * * @param string $action */ protected function _upgradeAddOns() { $template = new XenForo_Template_Admin('PAGE_CONTAINER_SIMPLE', array('jQuerySource' => XenForo_Dependencies_Abstract::getJquerySource(), 'xenOptions' => XenForo_Application::get('options')->getOptions(), '_styleModifiedDate' => XenForo_Application::get('adminStyleModifiedDate'))); $template->setLanguageId(1); $template->setParam('title', 'Upgrading Add-ons...'); $addOns = array_keys(self::getUpgradeAddOns(true)); $addOnModel = XenForo_Model::create('XenForo_Model_AddOn'); $nextAddOnId = ''; if (count($addOns)) { $next = self::$_controller->getInput()->filterSingle('next', XenForo_Input::STRING); if ($next) { $addOn = $next; } else { $addOn = reset($addOns); } for ($i = 0; $i < count($addOns); $i++) { if ($addOns[$i] != $addOn) { unset($addOns[$i]); continue; } break; } $fileName = XenForo_Application::getInstance()->getRootDir() . '/install/data/addon-' . $addOn . '.xml'; try { $caches = $addOnModel->installAddOnXmlFromFile($fileName, $addOn); $template->setParam('contents', '<form action="' . XenForo_Link::buildAdminLink('add-ons/upgrade-all-from-xml') . '" class="xenForm formOverlay CacheRebuild" method="post"> <p id="ProgressText">Upgrading... <span class="RebuildMessage"></span> <span class="DetailedMessage"></span></p> <p id="ErrorText" style="display: none">' . new XenForo_Phrase('error_occurred_or_request_stopped') . '</p> <input type="submit" class="button" value="Continue Upgrading" /> <input type="hidden" name="_xfToken" value="' . XenForo_Visitor::getInstance()->get('csrf_token_page') . '" /> </form>'); } catch (Exception $e) { if (count($addOns) == 1) { $template->setParam('contents', 'Upgrade error (' . $addOn . '). Please use the <a href="' . XenForo_Link::buildAdminLink('add-ons/upgrade', array('addon_id' => $addOn)) . '">standard upgrade tool</a> and report any error messages to the developer.'); } else { unset($addOns[array_search($addOn, $addOns)]); $nextAddOnId = reset($addOns); $template->setParam('contents', '<form action="' . XenForo_Link::buildAdminLink('add-ons/upgrade-all-from-xml') . '" class="xenForm formOverlay CacheRebuild" method="post"> <p id="ProgressText">Upgrading... <span class="RebuildMessage"></span> <span class="DetailedMessage"></span></p> <p id="ErrorText" style="display: none">' . new XenForo_Phrase('error_occurred_or_request_stopped') . '</p> <input type="submit" class="button" value="Continue Upgrading" /> <input type="hidden" name="next" value="' . $nextAddOnId . '" /> <input type="hidden" name="_xfToken" value="' . XenForo_Visitor::getInstance()->get('csrf_token_page') . '" /> </form>'); } } } else { $caches = $addOnModel->rebuildAddOnCaches(); } if (!count($addOns) && (isset($caches) || XenForo_Application::$versionId > 1020000)) { if (self::$_controller->getRouteMatch()->getResponseType() == 'json') { header('Content-Type: application/json; charset=UTF-8'); echo json_encode(array('_redirectTarget' => XenForo_Link::buildAdminLink('index'))); } else { header('Location: ' . XenForo_Link::buildAdminLink('index')); } } elseif (count($addOns) == 1 && (isset($caches) || XenForo_Application::$versionId > 1020000)) { if (XenForo_Application::$versionId > 1020000) { $url = XenForo_Link::buildAdminLink('tools/run-deferred'); } else { $url = XenForo_Link::buildAdminLink('tools/cache-rebuild', null, array('caches' => json_encode($caches))); } if (self::$_controller->getRouteMatch()->getResponseType() == 'json') { header('Content-Type: application/json; charset=UTF-8'); echo json_encode(array('_redirectTarget' => $url)); } else { header('Location: ' . $url); } } else { if (self::$_controller->getRouteMatch()->getResponseType() == 'json') { echo json_encode(array('_redirectTarget' => XenForo_Link::buildAdminLink('add-ons/upgrade-all-from-xml', array(), array('next' => $nextAddOnId)))); } else { $output = $template->render(); $output = str_replace("<!--XenForo_Require:JS-->", '<script src="js/xenforo/cache_rebuild.js"></script>', $output); echo $output; } } exit; }
/** * Preloads a template with the template handler for use later. * * @param string Template name */ public function preloadTemplate($templateName) { return $this->_dependencies->preloadTemplate($templateName); }
/** * Gets the effective set of container params. This includes combining * and specific container params with any global ones. For example, a specific * container param may refer to the section the page is in, so this function * could load the other options that are specific to this section. * * @param array $params Container params from the controller/view * @param Zend_Controller_Request_Http $request * * @return array */ public function getEffectiveContainerParams(array $params, Zend_Controller_Request_Http $request) { $options = XenForo_Application::get('options'); $visitor = XenForo_Visitor::getInstance(); $params['canSearch'] = $visitor->canSearch(); $params['canUploadAvatar'] = $visitor->canUploadAvatar(); $params['canEditSignature'] = $visitor->canEditSignature(); $params['canEditProfile'] = $visitor->canEditProfile(); $params['canUpdateStatus'] = $visitor->canUpdateStatus(); $params['canStartConversation'] = $visitor->canStartConversations(); $params['canViewProfilePosts'] = $visitor->canViewProfilePosts(); $params['isAwaitingEmailConfirmation'] = $visitor['user_id'] && in_array($visitor['user_state'], array('email_confirm', 'email_confirm_edit')); $params['isEmailBouncing'] = $visitor['user_id'] && $visitor['user_state'] == 'email_bounce'; $params['tosUrl'] = self::getTosUrl(); $params['jQuerySource'] = self::getJquerySource(); $params['jQuerySourceLocal'] = self::getJquerySource(true); $params['javaScriptSource'] = XenForo_Application::$javaScriptUrl; $params['showBoardClosedNotice'] = !$options->boardActive && XenForo_Visitor::getInstance()->get('is_admin'); $params['showCookieNotice'] = $options->showFirstCookieNotice && XenForo_Helper_Cookie::getCookie('session') === false && XenForo_Helper_Cookie::getCookie('user') === false; $requestPaths = XenForo_Application::get('requestPaths'); $params['isIndexPage'] = $requestPaths['fullUri'] == XenForo_Link::buildPublicLink('full:index'); $params = XenForo_Application::mapMerge($params, parent::getEffectiveContainerParams($params, $request), $this->_getCronContainerParams(), $this->_getStyleLanguageChangerParams($request), $this->_getNavigationContainerParams(empty($params['majorSection']) ? '' : $params['majorSection'])); if ($options->enableNotices) { $this->_preloadNoticeTemplates($params, $request); } XenForo_CodeEvent::fire('container_public_params', array(&$params, $this)); return $params; }
/** * Gets the effective set of container params. This includes combining * and specific container params with any global ones. For example, a specific * container param may refer to the section the page is in, so this function * could load the other options that are specific to this section. * * @param array $params Container params from the controller/view * @param Zend_Controller_Request_Http $request * * @return array */ public function getEffectiveContainerParams(array $params, Zend_Controller_Request_Http $request) { $options = XenForo_Application::get('options'); $visitor = XenForo_Visitor::getInstance(); $params['canSearch'] = $visitor->canSearch(); $params['canUploadAvatar'] = $visitor->canUploadAvatar(); $params['canEditSignature'] = $visitor->canEditSignature(); $params['canUpdateStatus'] = $visitor->canUpdateStatus(); $params['isAwaitingEmailConfirmation'] = $visitor['user_id'] && in_array($visitor['user_state'], array('email_confirm', 'email_confirm_edit')); $params['tosUrl'] = self::getTosUrl(); $params['jQuerySource'] = self::getJquerySource(); $params['jQuerySourceLocal'] = self::getJquerySource(true); $params['javaScriptSource'] = $options->javaScriptSource; $params['showBoardClosedNoticed'] = !$options->boardActive && XenForo_Visitor::getInstance()->get('is_admin'); $params = XenForo_Application::mapMerge($params, parent::getEffectiveContainerParams($params, $request), $this->_getCronContainerParams(), $this->_getStyleLanguageChangerParams($request), $this->_getNavigationContainerParams(empty($params['majorSection']) ? '' : $params['majorSection'])); XenForo_CodeEvent::fire('container_public_params', array(&$params, $this)); return $params; }