protected function _postDelete()
 {
     if ($this->get('node_id') == WidgetFramework_Option::get('indexNodeId')) {
         WidgetFramework_Option::setIndexNodeId(0);
     }
     $this->_deleteWidgets();
 }
Exemplo n.º 2
0
 public static function get($key)
 {
     if (self::$_options === null) {
         self::$_options = XenForo_Application::get('options');
     }
     switch ($key) {
         case 'applicationVersionId':
             return XenForo_Application::$versionId;
         case 'cacheCutoffDays':
             return 7;
         case 'indexTabId':
             return 'WidgetFramework_home';
         case 'layoutEditorEnabled':
             if (self::$_layoutEditorEnabled === null) {
                 if (!XenForo_Application::isRegistered('session')) {
                     // no session yet...
                     return false;
                 }
                 $session = XenForo_Application::getSession();
                 self::$_layoutEditorEnabled = $session->get('_WidgetFramework_layoutEditor') === true;
                 if (!self::$_layoutEditorEnabled and !empty($_REQUEST['_layoutEditor'])) {
                     $visitor = XenForo_Visitor::getInstance();
                     if ($visitor->hasAdminPermission('style')) {
                         self::$_layoutEditorEnabled = true;
                     }
                 }
             }
             // use the cached value
             return self::$_layoutEditorEnabled;
     }
     return self::$_options->get('wf_' . $key);
 }
 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;
 }
Exemplo n.º 4
0
 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;
 }
Exemplo n.º 5
0
 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());
 }
Exemplo n.º 6
0
 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');
 }
Exemplo n.º 8
0
 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;
 }
Exemplo n.º 9
0
 public static function get($key)
 {
     $options = XenForo_Application::get('options');
     switch ($key) {
         case 'applicationVersionId':
             return XenForo_Application::$versionId;
         case 'cacheCutoffDays':
             return 7;
         case 'indexTabId':
             return 'WidgetFramework_home';
         case 'revealEnabled':
             if (self::$_revealEnabled === null) {
                 $session = XenForo_Application::get('session');
                 if (empty($session)) {
                     // no session yet...
                     return false;
                 }
                 self::$_revealEnabled = $session->get('_WidgetFramework_reveal') == true;
             }
             // use the cached value
             return self::$_revealEnabled;
     }
     return $options->get('WidgetFramework_' . $key);
 }
 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;
 }
Exemplo n.º 11
0
 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();
             }
         }
     }
 }
Exemplo n.º 12
0
 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;
         }
     }
 }
Exemplo n.º 13
0
 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;
 }
Exemplo n.º 14
0
 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;
 }
Exemplo n.º 15
0
 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;
 }
Exemplo n.º 16
0
 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();
     }
 }