protected function _postDelete() { if ($this->get('node_id') == WidgetFramework_Option::get('indexNodeId')) { WidgetFramework_Option::setIndexNodeId(0); } $this->_deleteWidgets(); }
public function actionSave() { $this->_assertPostOnly(); if ($this->_input->filterSingle('delete', XenForo_Input::STRING)) { return $this->responseReroute(__CLASS__, 'deleteConfirm'); } $data = $this->_input->filter(array('title' => XenForo_Input::STRING, 'description' => XenForo_Input::STRING, 'node_name' => XenForo_Input::STRING, 'node_type_id' => XenForo_Input::BINARY, 'parent_node_id' => XenForo_Input::UINT, 'display_order' => XenForo_Input::UINT, 'display_in_list' => XenForo_Input::UINT, 'style_id' => XenForo_Input::UINT, 'options' => XenForo_Input::ARRAY_SIMPLE)); if (!$this->_input->filterSingle('style_override', XenForo_Input::UINT)) { $data['style_id'] = 0; } $nodeId = $this->_input->filterSingle('node_id', XenForo_Input::UINT); // save page $dw = $this->_getNodeDataWriter(); if ($nodeId) { $dw->setExistingData($nodeId); } $dw->bulkSet($data); $dw->save(); if ($this->_input->filterSingle('is_index', XenForo_Input::UINT)) { WidgetFramework_Option::setIndexNodeId($dw->get('node_id')); } elseif (WidgetFramework_Option::get('indexNodeId') == $dw->get('node_id')) { WidgetFramework_Option::setIndexNodeId(0); } $response = $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, XenForo_Link::buildAdminLink('nodes') . $this->getLastHash($dw->get('node_id'))); if (XenForo_Application::isRegistered('nodesAsTabsAPI')) { call_user_func(array('NodesAsTabs_API', 'actionSave'), $response, $this); } return $response; }
protected function _render(array $widget, $positionCode, array $params, XenForo_Template_Abstract $renderTemplateObject) { if (WidgetFramework_Option::get('layoutEditorEnabled')) { return new XenForo_Phrase('wf_widget_empty_layout_editor_explain'); } return self::RENDERED; }
public function actionWfLayoutEditor() { if (!XenForo_Application::isRegistered('session')) { return $this->responseNoPermission(); } $session = XenForo_Application::getSession(); $visitor = XenForo_Visitor::getInstance(); if (!$visitor->hasAdminPermission('style')) { return $this->responseNoPermission(); } $session->set('_WidgetFramework_layoutEditor', !WidgetFramework_Option::get('layoutEditorEnabled')); return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, $this->getDynamicRedirect()); }
public function match($routePath, Zend_Controller_Request_Http $request, XenForo_Router $router) { $indexNodeId = WidgetFramework_Option::get('indexNodeId'); if (empty($indexNodeId)) { return false; } if (preg_match('#^page-(\\d+)($|/)#i', $routePath, $matches)) { $match = $router->getRouteMatch(); $match->setModifiedRoutePath(sprintf('widget-page-index/page-%d', $matches[1])); return $match; } return false; }
public function buildLink($originalPrefix, $outputPrefix, $action, $extension, $data, array &$extraParams) { $action = XenForo_Link::getPageNumberAsAction($action, $extraParams); if (!empty($data['node_id']) and $data['node_id'] == WidgetFramework_Option::get('indexNodeId')) { if (XenForo_Application::$versionId > 1020000 and !empty($action) and preg_match('#^page-(\\d+)$#i', $action)) { // support http://domain.com/xenforo/page-2/ uris // XenForo 1.2.0 and up only return WidgetFramework_Helper_Index::buildBasicLink($action, '', $extension); } elseif (empty($action)) { return new XenForo_Link(XenForo_Link::buildPublicLink('widget-page-index', null, $extraParams)); } } return XenForo_Link::buildBasicLinkWithStringParam($outputPrefix, $action, $extension, $data, 'node_name'); }
public static function rebuildChildNodesCache() { $nodeModel = XenForo_Model::create('XenForo_Model_Node'); $nodeId = WidgetFramework_Option::get('indexNodeId'); $childNodes = array(); if ($nodeId > 0) { $widgetPage = $nodeModel->getNodeById($nodeId); if (!empty($widgetPage)) { $childNodes = $nodeModel->getChildNodes($widgetPage, true); XenForo_Application::setSimpleCacheData(self::SIMPLE_CACHE_CHILD_NODES, $childNodes); } } return $childNodes; }
public function render(array $widget, $positionCode, array $params, XenForo_Template_Abstract $template, &$output) { $html = false; $containerData = array(); $requiredExternals = array(); try { if (!$this->_testConditional($widget, $params)) { // expression failed, stop rendering... if (WidgetFramework_Option::get('layoutEditorEnabled')) { $html = new XenForo_Phrase('wf_layout_editor_widget_conditional_failed'); } else { $html = ''; } } } catch (Exception $e) { // problem while testing conditional, stop rendering... if (WidgetFramework_Core::debugMode() or WidgetFramework_Option::get('layoutEditorEnabled')) { $html = $e->getMessage(); } else { $html = ''; } } // add check for mobile (user agent spoofing) // since 2.2.2 if (!empty($widget['options']['deactivate_for_mobile'])) { if (XenForo_Visitor::isBrowsingWith('mobile')) { $html = ''; } } // check for cache // since 1.2.1 $cacheId = false; $useUserCache = false; $useLiveCache = false; $lockId = ''; if ($html === false and $this->useCache($widget)) { // sondh@2013-04-02 // please keep this block of code in-sync'd with its copycat // implemented in WidgetFramework_WidgetRenderer::prepare $cacheId = $this->_getCacheId($widget, $positionCode, $params); $useUserCache = $this->useUserCache($widget); $useLiveCache = $this->useLiveCache($widget); $cached = WidgetFramework_Core::loadCachedWidget($cacheId, $useUserCache, $useLiveCache); if (!empty($cached) and is_array($cached)) { if ($this->isCacheUsable($cached, $widget)) { // found fresh cached html, use it asap $this->_restoreFromCache($cached, $html, $containerData, $requiredExternals); } else { // cached html has expired: try to acquire lock $lockId = $this->_acquireLock($widget, $positionCode, $params); if ($lockId === false) { // a lock cannot be acquired, an expired cached html is the second best choice $this->_restoreFromCache($cached, $html, $containerData, $requiredExternals); } } } else { // no cache found $lockId = $this->_acquireLock($widget, $positionCode, $params); } } if ($html === false and $lockId === false) { // a lock is required but we failed to acquired it // also, a cached could not be found // stop rendering $html = ''; } // conditional executed just fine if ($html === false) { $renderTemplate = $this->_getRenderTemplate($widget, $positionCode, $params); if (!empty($renderTemplate)) { $renderTemplateObject = $template->create($renderTemplate, array_merge($params, array('widget' => $widget))); // reset required externals $existingRequiredExternals = WidgetFramework_Template_Extended::WidgetFramework_getRequiredExternals(); WidgetFramework_Template_Extended::WidgetFramework_setRequiredExternals(array()); $html = $this->_render($widget, $positionCode, $params, $renderTemplateObject); // get container data (using template_post_render listener) $containerData = self::_getContainerData($widget); // get widget required externals $requiredExternals = WidgetFramework_Template_Extended::WidgetFramework_getRequiredExternals(); WidgetFramework_Template_Extended::WidgetFramework_setRequiredExternals($existingRequiredExternals); } else { $html = $this->_render($widget, $positionCode, $params, $template); } $html = trim($html); if ($cacheId !== false) { $extraData = array(); if (!empty($containerData)) { $extraData[self::EXTRA_CONTAINER_DATA] = $containerData; } if (!empty($requiredExternals)) { $extraData[self::EXTRA_REQUIRED_EXTERNALS] = $requiredExternals; } WidgetFramework_Core::preSaveWidget($widget, $positionCode, $params, $html); WidgetFramework_Core::saveCachedWidget($cacheId, $html, $extraData, $useUserCache, $useLiveCache); } } $this->_releaseLock($lockId); if (!empty($containerData)) { // apply container data WidgetFramework_Template_Extended::WidgetFramework_mergeExtraContainerData($containerData); } if (!empty($requiredExternals)) { // register required external foreach ($requiredExternals as $type => $requirements) { foreach ($requirements as $requirement) { $template->addRequiredExternal($type, $requirement); } } } return $html; }
public static function template_hook($hookName, &$contents, array $hookParams, XenForo_Template_Abstract $template) { if (defined('WIDGET_FRAMEWORK_LOADED')) { WidgetFramework_Core::getInstance()->renderWidgetsForHook($hookName, $hookParams, $template, $contents); if ($hookName == 'moderator_bar') { $ourTemplate = $template->create('wf_hook_moderator_bar', $template->getParams()); $contents .= $ourTemplate->render(); } elseif (in_array($hookName, array('page_container_breadcrumb_top', 'page_container_content_title_bar'))) { if (!!$template->getParam('widgetPageOptionsBreakContainer')) { $contents = ''; } } static $ignoredHooks = array('ad_sidebar_top', 'body', 'footer_links', 'footer_links_legal', 'moderator_bar', 'navigation_tabs_forums', 'navigation_visitor_tabs_start', 'navigation_visitor_tabs_middle', 'navigation_visitor_tabs_end', 'page_container_head', 'quick_search'); if (WidgetFramework_Option::get('revealEnabled')) { if (!in_array($hookName, $ignoredHooks)) { $contentsTrim = trim($contents); if (!empty($contentsTrim)) { // show a revealer with negative display order $params = array('type' => 'hook', 'positionCode' => 'hook:' . $hookName, 'displayOrder' => '-10'); $revealerTemplate = $template->create('wf_revealer', $params); $contents = $revealerTemplate->render() . $contents; } $params = array('type' => 'hook', 'positionCode' => 'hook:' . $hookName); $revealerTemplate = $template->create('wf_revealer', $params); $contents .= $revealerTemplate->render(); // $ignoredHooks[] = $hookName; // render the revealer once for each hook name } elseif ($hookName == 'ad_sidebar_top' and $template->getTemplateName() == 'PAGE_CONTAINER') { $templateParams = $template->getParams(); $params = array('type' => 'template', 'positionCode' => $templateParams['contentTemplate']); $revealerTemplate = $template->create('wf_revealer', $params); $contents .= $revealerTemplate->render(); } } } }
protected function _loadCachedWidget($cacheId, $useUserCache, $useLiveCache) { // disable cache in debug environment... if (self::debugMode() or WidgetFramework_Option::get('layoutEditorEnabled')) { return false; } $cacheModel = $this->_getModelCache(); $permissionCombinationId = $this->_getPermissionCombinationId($useUserCache); if ($useLiveCache) { return $cacheModel->getLiveCache($cacheId, $permissionCombinationId); } else { $cachedWidgets = $cacheModel->getCachedWidgets($cacheId, $permissionCombinationId); if (isset($cachedWidgets[$cacheId])) { return $cachedWidgets[$cacheId]; } else { return false; } } }
protected function _isCacheInvalidated($cacheId, array $cacheData) { $invalidatedCache = $this->_getInvalidatedCacheInfo(); // there is a global cutoff for cached widgets // any widget older than this global cutoff will be considered invalidated // we are doing this to make sure no out of date cache exists // since 1.3 $globalCacheCutoff = XenForo_Application::$time - WidgetFramework_Option::get('cacheCutoffDays') * 86400; $parts = explode('_', $cacheId); $widgetId = array_pop($parts); if (isset($invalidatedCache[$widgetId])) { if ($invalidatedCache[$widgetId] > $cacheData[self::KEY_TIME]) { // the cache is invalidated sometime after it's built // it's no longer valid now return true; } elseif ($globalCacheCutoff > $cacheData[self::KEY_TIME]) { // look like a staled cache return true; } } return false; }
public static function getSessionActivityDetailsForList(array $activities) { $nodeIds = array(); $nodeNames = array(); foreach ($activities as $activity) { if (!empty($activity['params']['node_id'])) { $nodeIds[$activity['params']['node_id']] = intval($activity['params']['node_id']); } else { if (!empty($activity['params']['node_name'])) { $nodeNames[$activity['params']['node_name']] = $activity['params']['node_name']; } } } if ($nodeNames) { /** @var XenForo_Model_Node $nodeModel */ $nodeModel = XenForo_Model::create('XenForo_Model_Node'); $nodeNames = $nodeModel->getNodeIdsFromNames($nodeNames); foreach ($nodeNames as $nodeName => $nodeId) { $nodeIds[$nodeName] = $nodeId; } } $widgetPageData = array(); $indexNodeId = WidgetFramework_Option::get('indexNodeId'); if ($nodeIds) { /* @var $widgetPageModel WidgetFramework_Model_WidgetPage */ $widgetPageModel = XenForo_Model::create('WidgetFramework_Model_WidgetPage'); $visitor = XenForo_Visitor::getInstance(); $permissionCombinationId = $visitor['permission_combination_id']; $widgetPages = $widgetPageModel->getWidgetPages(array('node_id' => $nodeIds), array('permissionCombinationId' => $permissionCombinationId)); foreach ($widgetPages as $widgetPage) { $visitor->setNodePermissions($widgetPage['node_id'], $widgetPage['node_permission_cache']); if ($widgetPageModel->canViewWidgetPage($widgetPage)) { $widgetPageData[$widgetPage['node_id']] = array('title' => $widgetPage['title'], 'url' => XenForo_Link::buildPublicLink('widget-pages', $widgetPage)); } } } $output = array(); foreach ($activities as $key => $activity) { $nodeId = 0; $widgetPage = false; if (!empty($activity['params']['node_id'])) { $nodeId = $activity['params']['node_id']; if (isset($widgetPageData[$nodeId])) { $widgetPage = $widgetPageData[$nodeId]; } } elseif (!empty($activity['params']['node_name'])) { $nodeName = $activity['params']['node_name']; if (isset($nodeNames[$nodeName])) { $nodeId = $nodeNames[$nodeName]; if (isset($widgetPageData[$nodeId])) { $widgetPage = $widgetPageData[$nodeId]; } } } if ($widgetPage) { if ($nodeId == $indexNodeId) { $output[$key] = new XenForo_Phrase('wf_viewing_home_page'); } else { $output[$key] = array(new XenForo_Phrase('wf_viewing_widget_page'), $widgetPage['title'], $widgetPage['url'], false); } } else { $output[$key] = new XenForo_Phrase('wf_viewing_widget_page'); } } return $output; }
public function actionSave() { $this->_assertPostOnly(); if ($this->_input->filterSingle('delete', XenForo_Input::STRING)) { return $this->responseReroute(__CLASS__, 'deleteConfirm'); } $data = $this->_input->filter(array('title' => XenForo_Input::STRING, 'description' => XenForo_Input::STRING, 'node_name' => XenForo_Input::STRING, 'node_type_id' => XenForo_Input::BINARY, 'parent_node_id' => XenForo_Input::UINT, 'display_order' => XenForo_Input::UINT, 'display_in_list' => XenForo_Input::UINT, 'style_id' => XenForo_Input::UINT, 'options' => XenForo_Input::ARRAY_SIMPLE)); $widgetsInput = $this->_input->filterSingle('widgets', XenForo_Input::ARRAY_SIMPLE); $toggler = $this->_input->filterSingle('toggler', XenForo_Input::ARRAY_SIMPLE); if (!$this->_input->filterSingle('style_override', XenForo_Input::UINT)) { $data['style_id'] = 0; } $nodeId = $this->_input->filterSingle('node_id', XenForo_Input::UINT); // save page $dw = $this->_getNodeDataWriter(); if ($nodeId) { $dw->setExistingData($nodeId); } $dw->bulkSet($data); $dw->save(); if ($this->_input->filterSingle('is_index', XenForo_Input::UINT)) { WidgetFramework_Option::setIndexNodeId($dw->get('node_id')); } elseif (WidgetFramework_Option::get('indexNodeId') == $dw->get('node_id')) { WidgetFramework_Option::setIndexNodeId(0); } // save widgets $widgets = $this->_getWidgetModel()->getWidgetPageWidgets($dw->get('node_id')); $widgetOptionsChanged = 0; $preferStaying = 0; foreach ($widgets as $widget) { $changed = 0; $newOptions = $widget['options']; $newValues = array(); if (!empty($widgetsInput[$widget['widget_id']])) { $inputRef =& $widgetsInput[$widget['widget_id']]; if (isset($inputRef['layout_row']) and (!isset($widget['options']['layout_row']) or $inputRef['layout_row'] != $widget['options']['layout_row'])) { $changed++; $widgetOptionsChanged++; $newOptions['layout_row'] = $inputRef['layout_row']; } if (isset($inputRef['layout_col']) and (!isset($widget['options']['layout_col']) or $inputRef['layout_col'] != $widget['options']['layout_col'])) { $changed++; $widgetOptionsChanged++; $newOptions['layout_col'] = $inputRef['layout_col']; } if (isset($inputRef['layout_sizeRow']) and (!isset($widget['options']['layout_sizeRow']) or $inputRef['layout_sizeRow'] != $widget['options']['layout_sizeRow'])) { $changed++; $widgetOptionsChanged++; $newOptions['layout_sizeRow'] = $inputRef['layout_sizeRow']; } if (isset($inputRef['layout_sizeCol']) and (!isset($widget['options']['layout_sizeCol']) or $inputRef['layout_sizeCol'] != $widget['options']['layout_sizeCol'])) { $changed++; $widgetOptionsChanged++; $newOptions['layout_sizeCol'] = $inputRef['layout_sizeCol']; } } if (!empty($toggler['exists'][$widget['widget_id']])) { $widgetActive = empty($toggler['id'][$widget['widget_id']]) ? 0 : intval($toggler['id'][$widget['widget_id']]); if ($widgetActive != $widget['active']) { $changed++; $preferStaying++; $newValues['active'] = $widgetActive; } } if ($changed > 0) { $widgetDw = XenForo_DataWriter::create('WidgetFramework_DataWriter_Widget'); $widgetDw->setExistingData($widget, true); $widgetDw->set('options', $newOptions); $widgetDw->bulkSet($newValues); $widgetDw->save(); } } $link = XenForo_Link::buildAdminLink('widget-pages/edit', $dw->getMergedData()); if ($widgetOptionsChanged == 0 and $preferStaying > 0 and $this->_noRedirect()) { // skip redirect $link = false; } if ($link !== false) { $response = $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, $link); } else { $response = $this->responseMessage(new XenForo_Phrase('redirect_changes_saved_successfully')); } if (XenForo_Application::isRegistered('nodesAsTabsAPI')) { NodesAsTabs_API::actionSave($response, $this); } return $response; }
public static function front_controller_post_view(XenForo_FrontController $fc, &$output) { if (defined('WIDGET_FRAMEWORK_LOADED')) { $core = WidgetFramework_Core::getInstance(); if (!empty($_REQUEST['_getRender']) && !empty($_REQUEST['_renderedIds'])) { $controllerResponse = new XenForo_ControllerResponse_View(); $controllerResponse->viewName = 'WidgetFramework_ViewPublic_Widget_Render'; $controllerResponse->params = $_REQUEST; $viewRenderer = $fc->getDependencies()->getViewRenderer($fc->getResponse(), 'json', $fc->getRequest()); $output = $fc->renderView($controllerResponse, $viewRenderer); } if (WidgetFramework_Option::get('layoutEditorEnabled')) { foreach (array_keys(self::$_layoutEditorRendered) as $key) { $fc->getResponse()->setHeader('X-Widget-Framework-Rendered', $key, false); } } $core->shutdown(); } }