protected function load_content_info() { $type_instance = vB_Types::instance(); $class = $type_instance->getContentTypeClass($this->contenttypeid); $package = $type_instance->getContentTypePackage($this->contenttypeid); //this forces some of the fields we access to be loaded. $contentinfo = vBCms_Content::create($package, $class); //we have a contenttype and content id, but we need the nodeid. if ($record = vB::$vbulletin->db->query_first("SELECT nodeid FROM " . TABLE_PREFIX . "cms_node WHERE contenttypeid = " . $this->contenttypeid . " AND contentid = " . $this->contentid)) { $item = vB_Item_Content::create($package, $class, $this->nodeid = $record['nodeid']); $item->requireInfo($contentinfo->getViewInfoFlags(vB_Content::VIEW_PREVIEW)); $contentinfo->setContentItem($item); return $contentinfo; } return false; }
/** This function gets the article information based on the defined criteria * * @return array */ protected function getContent() { // First, compose the sql $sql = "SELECT node.contenttypeid, node.url, node.publishdate, node.userid, node.setpublish, node.publicpreview, info.title, user.username, node.showuser, node.nodeid, node.contenttypeid, thread.replycount FROM " . TABLE_PREFIX . "cms_node AS node INNER JOIN " . TABLE_PREFIX . "contenttype AS type on type.contenttypeid = node.contenttypeid INNER JOIN " . TABLE_PREFIX . "cms_nodeinfo AS info on info.nodeid = node.nodeid " . ( (($this->config['categories'] != '') AND ($this->config['categories'] != '0')) ? " INNER JOIN " . TABLE_PREFIX . "cms_nodecategory nc ON nc.nodeid = node.nodeid " : '') . " LEFT JOIN " . TABLE_PREFIX . "user AS user ON user.userid = node.userid LEFT JOIN " . TABLE_PREFIX . "thread AS thread ON thread.threadid = info.associatedthreadid WHERE type.isaggregator = '0' AND " . vBCMS_Permissions::getPermissionString() ; if (($this->config['categories'] != '') AND ($this->config['categories'] != '0') ) { $sql .= "\n AND nc.categoryid IN (" . $this->config['categories'] . ")\n"; } if (($this->config['sections'] != '') AND ($this->config['sections'] != '0')) { $sql .= "\n AND node.parentnode IN (" . $this->config['sections'] . ")\n"; } if (isset($this->config['days']) AND (intval($this->config['days'])) ) { $sql .= "\n AND node.publishdate > " . (TIMENOW - (86400 * $this->config['days'])) . "\n"; } $sql .= "\n ORDER BY node.publishdate DESC LIMIT " . $this->config['count']; $items = array(); //Execute if ($rst = vB::$db->query_read($sql)) { $current_record = array('contentid' => -1); //now build the results array while($item = vB::$db->fetch_array($rst)) { $item['categories'] = array(); $item['tags'] = array(); $class = vB_Types::instance()->getContentTypeClass($item['contenttypeid']); $package = vB_Types::instance()->getContentTypePackage($item['contenttypeid']); $node = vBCms_Content::create($package, $class, $item['nodeid']); $item['pagetext'] = $item['previewtext'] = ''; //get the avatar if (vB::$vbulletin->options['avatarenabled']) { $item['avatar'] = fetch_avatar_url($item['userid']); } if (method_exists($node, 'getPageText')) { $item['pagetext'] = fetch_censored_text($node->getPageText()); } if (method_exists($node, 'getPreviewText')) { $item['previewtext'] = fetch_censored_text($node->getPreviewText()); } else if (!empty($item['pagetext'])) { $item['previewtext'] = vB_Search_Searchtools::getSummary($item['pagetext'], 200); } if (method_exists($node, 'getPreviewImage')) { $item['pagetext'] = fetch_censored_text($node->getPageText()); } $items[$item['nodeid']] = $item; } //Let's get the tags and the categories // we can do that with one query each. if (count($articles)) { //first let's get categories $nodeids = implode(', ', array_keys($item)); $sql = "SELECT nc.nodeid, nc.categoryid, category.category FROM " . TABLE_PREFIX . "cms_nodecategory AS nc INNER JOIN " . TABLE_PREFIX . "cms_category AS category ON category.categoryid = nc.categoryid WHERE nc.nodeid IN ($nodeids)"; if ($rst = vB::$db->query_read($sql)) { while ($record = vB::$db->fetch_array($rst)) { $route_info = $record['categoryid'] . ($record['category'] != '' ? '-' . str_replace(' ', '-', $record['category']) : ''); $record['route_info'] = $route_info; $record['category_url'] = vB_Route::create('vBCms_Route_List', "category/" . $record['route_info'] . "/1")->getCurrentURL(); $items[$record['nodeid']]['categories'][$record['categoryid']] = $record; } } //next tags; $sql = "SELECT tag.tagid, node.nodeid, tag.tagtext FROM " . TABLE_PREFIX . "cms_node AS node INNER JOIN " . TABLE_PREFIX . "tagcontent AS tc ON (tc.contentid = node.contentid AND tc.contenttypeid = node.contenttypeid) INNER JOIN " . TABLE_PREFIX . "tag AS tag ON tag.tagid = tc.tagid WHERE node.nodeid IN ($nodeids) "; if ($rst = vB::$db->query_read($sql)) { while ($record = vB::$db->fetch_array($rst)) { $items[$record['nodeid']]['tags'][$record['tagid']] = $record['tagtext']; } } } } return $items; }
/** * Config Widget * * @return string - The final page output */ public function actionConfig($widget = false) { if (!$widget) { throw (new vB_Exception_404(new vB_Phrase('error', 'page_not_found'))); } // Setup the templater for xhtml vB_View::registerTemplater(vB_View::OT_XHTML, new vB_Templater_vB()); // Get the content controller $this->content = vBCms_Content::create($this->node->getPackage(), $this->node->getClass(), $this->node->getContentId()); // Add the node as content $this->content->castFrom($this->node); // Get Widget that we're configuring $widgets = vBCms_Widget::getWidgetCollection(array($widget), vBCms_Item_Widget::INFO_CONFIG, $this->node->getId()); $widgets = vBCms_Widget::getWidgetControllers($widgets, true, $this->content); if (!isset($widgets[$widget])) { throw (new vB_Exception_404()); } $widget = $widgets[$widget]; // Render the content's config view and return return $widget->getConfigView()->render(true); }
public function actionList($page_url) { //This is an aggregator. We can pull in three different modes as of this writing, // and we plan to add more. We can have passed on the url the following: // author=id, category=id, section=id, and format=id. "Format" should normally // be passed as for author only, and it defines a sectionid to be used for the format. global $vbphrase; //Load cached values as appropriate $metacache_key = 'vbcms_list_data_' . implode('_', $this->segments); vB_Cache::instance()->restoreCacheInfo($metacache_key); // Create the page view $view = new vB_View_Page('vbcms_page'); $view->page_url = $page_url; $view->base_url = VB_URL_BASE_PATH; $view->html_title = $this->title; $this->content = vBCms_Content::create('vBCms', 'Section', $this->displaysectionid); $sectionnode = new vBCms_Item_Content($this->displaysectionid, vBCms_Item_Content::INFO_CONFIG) ; //There are configuration settings on the section for items per page and // section layout. If they are set let's use them. First items per page. $this->config = $sectionnode->getConfig(); if (isset($this->config['items_perhomepage']) AND intval($this->config['items_perhomepage'])) { $this->perpage = $this->config['items_perhomepage']; } // Get layout $this->layout = new vBCms_Item_Layout($this->layoutid); $this->layout->requireInfo(vBCms_Item_Layout::INFO_CONFIG | vBCms_Item_Layout::INFO_WIDGETS); // Create the layout view $layout = new vBCms_View_Layout($this->layout->getTemplate()); $layout->contentcolumn = $this->layout->getContentColumn(); $layout->contentindex = $this->layout->getContentIndex(); // Get content controller $collection = new vBCms_Collection_Content(); $collection->setContentQueryWhere($this->query_filter . " AND node.contenttypeid <> " . vB_Types::instance()->getContentTypeID("vBCms_Section") ); $collection->setContentQueryJoins($this->joins); vB::$vbulletin->input->clean_array_gpc('r', array('page' => TYPE_INT)); if ((vB::$vbulletin->GPC_exists['page'] AND intval(vB::$vbulletin->GPC['page']))) { $current_page = intval(vB::$vbulletin->GPC['page']); } elseif (intval($this->segments['page'])) { $current_page = intval($this->segments['page']); } else { $current_page = 1; } $collection->paginate(); $collection->paginateQuantity($this->perpage); $collection->paginatePage($current_page); $results = array(); // Get the content view //Our templates assume a counter beginning at one, not zero. $counter = 0; foreach($collection as $id => $content) { //make sure we've loaded all the information we need $content->requireInfo(vBCms_Item_Content::INFO_NODE | vBCms_Item_Content::INFO_CONTENT | vBCms_Item_Content::INFO_PARENTS); // get the content controller $controller = vB_Types::instance()->getContentTypeController($content->getContentTypeId(), $content); // set preview length $controller->setPreviewLength(400); // get the aggregate view from the controller if ($result = $controller->getPreview()) { $counter++; $results[$counter] = $result; } } $recordcount = $collection->getCount(); $contentview->contenttypeid = vB_Types::instance()->getContentTypeID("vBCms_Section"); $contentview->contentid = $contentview->item_id = $contentview->nodeid = $this->displaysectionid; $contentview = new vB_View_Content('vbcms_content_list'); $contentview->package = 'vBCms'; $contentview->class = 'Section'; $contentview->result_type = $this->result_type; $contentview->rawtitle = $this->title; $contentview->title = $this->title; $contentview->current_page = $current_page; if (! $recordcount) { switch($this->segments['type']){ case 'author': $contentview->contents = array(1 => new vB_Phrase('vbcms', 'no_content_for_author_x', $this->title )); break; case 'section': $contentview->contents = array(1 => new vB_Phrase('vbcms', 'no_content_for_section_x', $this->title )); break; case 'category': $contentview->contents = array(1 => new vB_Phrase('vbcms', 'no_content_for_category_x', $this->title )); break; ; } // switch } else { if (isset($this->config['content_layout']) AND intval($this->config['content_layout']) AND (intval($this->config['content_layout']) < 7)) { $content_rendered = new vb_View('vbcms_content_section_type' . intval($this->config['content_layout'])); $content_rendered->contents = $results; $content_rendered->result_count = $counter; $contentview->content_rendered = $content_rendered; } else { $contentview->contents = $results; } if (intval($recordcount) > intval($this->perpage)) { $baseurl = vB_Route::create('vBCms_Route_List', $this->segments['type'] . '/' . intval($this->segments['value']) . ($this->urlstring == '' ? '' : '-' . $this->urlstring) . '/')->getCurrentURL(); $contentview->pagenav = construct_page_nav($current_page, $this->perpage, $recordcount, $baseurl); } else { $contentview->pagecount = 1; } } $layout->content = $contentview; // Get widget locations $layout->widgetlocations = $this->layout->getWidgetLocations(); if (count($layout->widgetlocations)) { $widgetids = $this->layout->getWidgetIds(); if (count($widgetids)) { // Get Widgets $widgets = vBCms_Widget::getWidgetCollection($widgetids, vBCms_Item_Widget::INFO_CONFIG, $this->displaysectionid); $widgets = vBCms_Widget::getWidgetControllers($widgets, true, $this->content); // Get the widget views $widget_views = array(); foreach($widgets AS $widgetid => $widget) { try { $widget_views[$widgetid] = $widget->getPageView(); } catch (vB_Exception $e) { if ($e->isCritical()) { throw ($e); } if (vB::$vbulletin->debug) { $widget_views[$widgetid] = 'Exception: ' . $e; } } } // Assign the widgets to the layout view $layout->widgets = $widget_views; } } // Assign the layout view to the page view $view->layout = $layout; // Add general page info $view->setPageTitle($this->content->getTitle()); $view->pagedescription = $this->content->getDescription(); $this->resolveWolPath(); vB_Cache::instance()->saveCacheInfo($metacache_key); // Render view and return return $view->render(); }
/** * Builds the toolbar view for managing the page. * * @param bool $edit_mode - Whether the user is currently in edit mode * @return vB_View */ protected function getToolbarView($edit_mode = false) { global $vbulletin; global $vbphrase; if (!$this->content->canCreate() AND !$this->content->canEdit() AND !$this->content->canPublish()) { return; } require_once DIR . '/includes/functions_databuild.php'; fetch_phrase_group('cpcms'); // Create view $view = new vB_View('vbcms_toolbar'); $view->edit_mode = $edit_mode; $view->page_url = vB_Router::getURL(); $view->access = ($this->content->publicCanView() ? $vbphrase['public'] : $vbphrase['public']); // Setup a new route to get URLs $route = new vBCms_Route_Content(); $route->node = $this->node->getURLSegment(); $view->view_url = $route->getCurrentURL(array('action' => vB_Router::getUserAction('vBCms_Controller_Content', 'View'))); $view->edit_url = $route->getCurrentURL(array('action' => vB_Router::getUserAction('vBCms_Controller_Content', 'EditPage'))); $view->edit_label = new vB_Phrase('vbcms', 'edit_this_page'); // New content options $view->add_url = $route->getCurrentURL(array('action' => vB_Router::getUserAction('vBCms_Controller_Content', 'AddNode'))); $view->add_label = new vB_Phrase('vbcms', 'create_new'); // Get placable contenttypes. TODO: This should be a method of vB_Types for reuse if (!($view->contenttypes = vB_Cache::instance()->read('vbcms_controller_content.place_nonaggs', true, true))) { $contenttype_collection = new vB_Collection_ContentType(); $contenttype_collection->filterPlaceable(true); $contenttype_collection->filterNonAggregators(true); $contenttypes = array(); $permissionsfrom = $this->content->getPermissionsFrom(); foreach ($contenttype_collection AS $contenttype) { $this_type = vBCms_Content::create($contenttype->getPackageClass(), $contenttype->getClass(), 0); if ($this_type->canCreateHere($permissionsfrom)) { $title = (string)$contenttype->getTitle(); $contenttypes[$title] = array('id' => $contenttype->getId(), 'title' => $title); }; unset($this_type); } ksort($contenttypes); $view->contenttypes = $contenttypes; unset($contenttype_collection, $contenttypes); vB_Cache::instance()->write('vbcms_controller_content.place_nonaggs', $view->contenttypes, false, vB_Types::instance()->getContentTypeCacheEvents()); } // Set the publish state description if ($this->node->isPublished()) { $view->publish_status = new vB_Phrase('vbcms', 'page_is_published'); } else if ($this->node->getPendingParentId()) { $pending_title = $this->node->getPendingParentTitle(); $pending_route = vB_Route::create('vBCms_Route_Content')->getCurrentURL(array('node' => $this->node->getPendingParentId())); $view->publish_status = new vB_Phrase('vbcms', 'section_x_not_published', $pending_route, $pending_title); } else if ($date = $this->node->getPublishDate()) { $date = vbdate(vB::$vbulletin->options['dateformat'], $date, true); $view->publish_status = new vB_Phrase('vbcms', 'page_will_be_published_x', $date); } else { $view->publish_status = new vB_Phrase('vbcms', 'page_not_published'); } $view->can_publish = $this->content->canPublish(); $view->can_edit = $this->content->canEdit(); $view->can_create = $this->content->canCreate(); // Add postid $this->addPostId($view); return $view; }
public static function fixNodeLR($sectionid = false, $nodeleft = 0, $sectiontypeid = false, $findmissing = true) { //We pull the list of items that are children of the current node. global $vbulletin; global $vbphrase; $result = ''; if (! intval($sectiontypeid)) { $sectiontypeid = vB_Types::instance()->getContentTypeID("vBCms_Section"); } //There can be nodes that don't have a valid parent. In that case, we make a //"lost and found" section and put them into it. If we do this first, then //we will automatically fix it. if ($findmissing) { if ($rst = $vbulletin->db->query_read("SELECT n1.nodeid FROM " . TABLE_PREFIX . "cms_node n1 LEFT JOIN " . TABLE_PREFIX . "cms_node n2 ON n2.nodeid = n1.parentnode AND n2.nodeid <> n1.nodeid AND n2.contenttypeid = $sectiontypeid WHERE n2.nodeid IS NULL AND n1.contenttypeid <> $sectiontypeid;")) { $orphans = array(); while($record = $record = $vbulletin->db->fetch_array($rst)) { $orphans[] = $record['nodeid']; } } //Do we have orphans? if (count($orphans)) { //We need to make a lost and found folder. $record = $vbulletin->db->query_first("SELECT node.nodeid FROM " . TABLE_PREFIX . "cms_node AS node WHERE node.parentnode IS NULL LIMIT 1"); //Now create a node. $vbulletin->GPC_exists['parentnode'] = $vbulletin->GPC_exists['sectionid'] = 1; $vbulletin->GPC['parentnode'] = $vbulletin->GPC['sectionid'] = $record['nodeid']; if ($content = vBCms_Content::create('vBCms', 'Section')) { require_once DIR . '/includes/functions_misc.php'; $nodedm = new vBCms_DM_Section(); $nodedm->set('parentnode', $record['nodeid']); $nodedm->set('contenttypeid', $sectiontypeid); vB::$vbulletin->GPC_exists['title'] = 1; vB::$vbulletin->GPC['title'] = fetch_phrase('lost_found', 'cpcms'); // create content handler $content = vBCms_Content::create('vBCms', 'Section'); $content->setParentNode( $record['nodeid']); if (! $sectionid = $content->createDefaultContent($nodedm)) { throw (new vB_Exception_DM('Could not create new node for content: ' . print_r($nodedm->getErrors()))); } $result = fetch_phrase('check_lost_found', 'cpcms'); } vB_Cache::instance()->event('sections_updated'); vB_Cache::instance()->cleanNow(); //We have everything we need. Let's update $vbulletin->db->query_write("UPDATE " . TABLE_PREFIX . "cms_node SET parentnode = $sectionid, permissionsfrom = 1 WHERE nodeid IN(" . implode(',', $orphans) . ")"); } self::fixNodeLR(false, 0, $sectiontypeid, false); return $result; } else { $rst = $vbulletin->db->query_read($sql = "SELECT node.nodeid, contenttypeid FROM " . TABLE_PREFIX . "cms_node AS node INNER JOIN " . TABLE_PREFIX . "cms_nodeinfo AS info ON info.nodeid = node.nodeid WHERE node.parentnode " . (intval($sectionid) ? "= $sectionid" : "IS NULL") . " ORDER BY nodeleft" ); $nodes = array(); while ($record = $vbulletin->db->fetch_array($rst)) { $nodes[] = $record; } $vbulletin->db->free_result($rst); $childnodeleft = intval($nodeleft) + 1; if ($sectionid) { //Find out if we should assign permissionsfrom for this record, or inherit from a parent. if ($permission_record = $vbulletin->db->query_first("SELECT * FROM " . TABLE_PREFIX . "cms_permissions WHERE nodeid = $sectionid LIMIT 1;" )) { $permissionsfrom = $sectionid; } else { $permission_record = $vbulletin->db->query_first("SELECT permissionsfrom FROM " . TABLE_PREFIX . "cms_node WHERE nodeid = $sectionid LIMIT 1;" ); $permissionsfrom = $permission_record['permissionsfrom']; } } else { //We are at the root. Our early code created orphan nodecategory records. Let's find and // remove any. $vbulletin->db->query_write("CREATE TEMPORARY TABLE cms_nc_orphans AS select nc.nodeid FROM " . TABLE_PREFIX . "cms_nodecategory nc LEFT JOIN " . TABLE_PREFIX . "cms_node AS node on node.nodeid = nc.nodeid WHERE node.nodeid IS NULL;"); $vbulletin->db->query_write("DELETE FROM " . TABLE_PREFIX . "cms_nodecategory WHERE nodeid IN (SELECT nodeid from cms_nc_orphans);"); $vbulletin->db->query_write("DROP TEMPORARY TABLE cms_nc_orphans"); $permissionsfrom = false; } foreach ($nodes as $node) { if (intval($node['contenttypeid']) == intval($sectiontypeid)) { if ($permissionsfrom) { $vbulletin->db->query_write("UPDATE " . TABLE_PREFIX . "cms_node SET permissionsfrom = $permissionsfrom WHERE nodeid = " . $node['nodeid']); } $childnodeleft = self::fixNodeLR($node['nodeid'], $childnodeleft, $sectiontypeid, false); } else { $rst = $vbulletin->db->query_write($sql = "UPDATE " . TABLE_PREFIX . "cms_node SET nodeleft = $childnodeleft, noderight = " . ($childnodeleft + 1) . ", permissionsfrom = $permissionsfrom WHERE nodeid = " . $node['nodeid'] ); $childnodeleft += 2; } } if (intval($sectionid)) { $rst = $vbulletin->db->query_write($sql = "UPDATE " . TABLE_PREFIX . "cms_node set nodeleft = $nodeleft, noderight = " . $childnodeleft . ($permissionsfrom ? ", permissionsfrom = $permissionsfrom" : '') . " WHERE nodeid = $sectionid " ); return $childnodeleft + 1; } } self::fixCategoryLR(); return $result; }