protected function _getParentIdsWithPost() { $db = DiscussHelper::getDBO(); $my = JFactory::getUser(); $query = 'select * from `#__discuss_category`'; $query .= ' where `published` = 1'; $query .= ' and `parent_id` = 0'; if ($my->id == 0) { $query .= ' and `private` = 0'; } $db->setQuery($query); $result = $db->loadObjectList(); $validCat = array(); if (count($result) > 0) { for ($i = 0; $i < count($result); $i++) { $item =& $result[$i]; $item->childs = null; DiscussHelper::buildNestedCategories($item->id, $item); $catIds = array(); $catIds[] = $item->id; DiscussHelper::accessNestedCategoriesId($item, $catIds); $item->cnt = $this->getTotalPostCount($catIds); if ($item->cnt > 0) { $validCat[] = $item->id; } } } return $validCat; }
public static function getPrivateCategories($acltype = DISCUSS_CATEGORY_ACL_ACTION_VIEW) { $db = DiscussHelper::getDBO(); $my = JFactory::getUser(); static $result = array(); $excludeCats = array(); $sig = (int) $my->id . '-' . (int) $acltype; if (!isset($result[$sig])) { if ($my->id == 0) { $catQuery = 'select distinct a.`id`, a.`private`'; $catQuery .= ' from `#__discuss_category` as a'; $catQuery .= ' left join `#__discuss_category_acl_map` as b on a.`id` = b.`category_id`'; $catQuery .= ' and b.`acl_id` = ' . $db->Quote($acltype); $catQuery .= ' and b.`type` = ' . $db->Quote('group'); $catQuery .= ' where a.`private` != ' . $db->Quote('0'); $gid = array(); $gids = ''; if (DiscussHelper::getJoomlaVersion() >= '1.6') { // $gid = JAccess::getGroupsByUser(0, false); $gid = DiscussHelper::getUserGroupId($my); } else { $gid = DiscussHelper::getUserGids(); } if (count($gid) > 0) { foreach ($gid as $id) { $gids .= empty($gids) ? $db->Quote($id) : ',' . $db->Quote($id); } $catQuery .= ' and a.`id` NOT IN ('; $catQuery .= ' SELECT c.category_id FROM `#__discuss_category_acl_map` as c '; $catQuery .= ' WHERE c.acl_id = ' . $db->Quote($acltype); $catQuery .= ' AND c.type = ' . $db->Quote('group'); $catQuery .= ' AND c.content_id IN (' . $gids . ') )'; } $db->setQuery($catQuery); $result = $db->loadObjectList(); } else { $result = self::getAclCategories($acltype, $my->id); } for ($i = 0; $i < count($result); $i++) { $item =& $result[$i]; $item->childs = null; DiscussHelper::buildNestedCategories($item->id, $item, true); $catIds = array(); $catIds[] = $item->id; DiscussHelper::accessNestedCategoriesId($item, $catIds); $excludeCats = array_merge($excludeCats, $catIds); } $result[$sig] = $excludeCats; } return $result[$sig]; }
/** * Displays a list of recent discussions from a particular category. * * @since 3.0 * @access public */ public function listings() { // Initialise variables $doc = JFactory::getDocument(); $my = JFactory::getUser(); $config = DiscussHelper::getConfig(); $app = JFactory::getApplication(); $registry = DiscussHelper::getRegistry(); $categoryId = JRequest::getInt('category_id', 0); // Try to detect if there's any category id being set in the menu parameter. $activeMenu = $app->getMenu()->getActive(); if ($activeMenu) { // Load menu params to the registry. $registry->loadString($activeMenu->params); // Set the active category id if exists. $categoryId = $registry->get('category_id') ? $registry->get('category_id') : $categoryId; } // Get the current logged in user's access. $acl = DiscussHelper::getHelper('ACL'); // Todo: Perhaps we should fix the confused naming of filter and sort to type and sort $activeFilter = JRequest::getString('filter', $registry->get('filter')); $sort = JRequest::getString('sort', $registry->get('sort')); // Get the pagination limit $limit = $registry->get('limit'); $limit = $limit == '-2' ? DiscussHelper::getListLimit() : $limit; $limit = $limit == '-1' ? DiscussHelper::getJConfig()->get('list_limit') : $limit; // Get the active category id if there is any $activeCategory = DiscussHelper::getTable('Category'); $activeCategory->load($categoryId); DiscussHelper::setPageTitle($activeCategory->title); // Add breadcrumbs for active category. if ($activeCategory->id != 0) { // Test if user is really allowed to access this category. if (!$activeCategory->canAccess()) { $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=index', false), JText::_('COM_EASYDISCUSS_SYSTEM_INSUFFICIENT_PERMISSIONS')); $app->close(); return; } // Add pathway for category here. DiscussHelper::getHelper('Pathway')->setCategoryPathway($activeCategory); } // Add view to this page. $this->logView(); // Set the meta of the page. DiscussHelper::setMeta(); $doc = JFactory::getDocument(); $doc->setMetadata('description', strip_tags($activeCategory->getDescription())); // Add rss feed into headers DiscussHelper::getHelper('Feeds')->addHeaders('index.php?option=com_easydiscuss&view=index'); // Get list of categories on the site. $catModel = $this->getModel('Categories'); // Pagination is by default disabled. $pagination = false; if ($categoryId) { $category = DiscussHelper::getTable('Category'); $category->load($categoryId); $categories[] = $category; } else { $categories = $catModel->getCategories($categoryId); if (count($categories) > 1) { $ids = array(); foreach ($categories as $row) { $ids[] = $row->id; } // iniCounts should only called in index page. $category = DiscussHelper::getTable('Category'); $category->initCounts($ids, true); } } // Get the model. $postModel = DiscussHelper::getModel('Posts'); $authorIds = array(); $topicIds = array(); for ($i = 0; $i < count($categories); $i++) { $category =& $categories[$i]; // building category childs lickage. $category->childs = null; $nestedLinks = ''; // In category page if ($config->get('layout_show_all_subcategories', '1')) { // By default show all the subcategories of the selected category DiscussHelper::buildNestedCategories($category->id, $category, false, true); } else { // Show one level of subcategories of the selected category only $category->childs = $catModel->getChildCategories($category->id); } DiscussHelper::accessNestedCategories($category, $nestedLinks, '0', '', 'listlink', ', '); $category->nestedLink = $nestedLinks; // Get featured posts from this particular category. $featured = $postModel->getDiscussions(array('pagination' => false, 'sort' => $sort, 'filter' => $activeFilter, 'category' => $category->id, 'limit' => $config->get('layout_featuredpost_limit', $limit), 'featured' => true)); // Get normal discussion posts. $posts = $postModel->getDiscussions(array('sort' => $sort, 'filter' => $activeFilter, 'category' => $category->id, 'limit' => $limit, 'featured' => false)); $tmpPostsArr = array_merge($featured, $posts); if (count($tmpPostsArr) > 0) { foreach ($tmpPostsArr as $tmpArr) { $authorIds[] = $tmpArr->user_id; $topicIds[] = $tmpArr->id; } } if ($categoryId) { $pagination = $postModel->getPagination(0, 'latest', '', $categoryId, false); } // Set these items into the category object. $category->featured = $featured; $category->posts = $posts; // Set active filter for the category $category->activeFilter = $activeFilter; $category->activeSort = $sort; } $lastReplyUser = $postModel->setLastReplyBatch($topicIds); $authorIds = array_merge($lastReplyUser, $authorIds); // load all author object 1st. $authorIds = array_unique($authorIds); $profile = DiscussHelper::getTable('Profile'); $profile->init($authorIds); $postLoader = DiscussHelper::getTable('Posts'); $postLoader->loadBatch($topicIds); $postTagsModel = DiscussHelper::getModel('PostsTags'); $postTagsModel->setPostTagsBatch($topicIds); // perform data formating here. for ($i = 0; $i < count($categories); $i++) { $category =& $categories[$i]; // perform data formating here. if ($category->featured) { $category->featured = DiscussHelper::formatPost($category->featured, false, true); } if ($category->posts) { $category->posts = DiscussHelper::formatPost($category->posts, false, true); } } // Let's render the layout now. $theme = new DiscussThemes(); $theme->set('activeFilter', $activeFilter); $theme->set('activeSort', $sort); $theme->set('categories', $categories); $theme->set('pagination', $pagination); echo $theme->fetch('frontpage.php'); }
/** * Retrieves the number of post count from a particular category. * * @since 3.0 * @access public */ public function getPostCount() { $db = DiscussHelper::getDBO(); $my = JFactory::getUser(); $queryExclude = ''; $excludeCats = array(); // We need to determine if the user is a guest. // If it is a guest, we need to retrieve all private categories. if (!$my->id) { $query = 'SELECT a.' . $db->nameQuote('id') . ',' . $db->nameQuote('private'); $query .= ' FROM ' . $db->nameQuote('#__discuss_category') . ' AS a'; $query .= ' WHERE a.' . $db->nameQuote('private') . '=' . $db->Quote(1); $db->setQuery($query); $result = $db->loadObjectList(); for ($i = 0; $i < count($result); $i++) { $item = $result[$i]; $item->childs = null; DiscussHelper::buildNestedCategories($item->id, $item); $catIds = array(); $catIds[] = $item->id; DiscussHelper::accessNestedCategoriesId($item, $catIds); $excludeCats = array_merge($excludeCats, $catIds); } } $model = DiscussHelper::getModel('Categories'); $childs = $model->getChildIds($this->id); $total = count($childs); $subcategories = array(); $subcategories[] = $this->id; if ($childs) { for ($i = 0; $i < $total; $i++) { $subcategories[] = $childs[$i]; } } $filtered = array_diff($subcategories, $excludeCats); if (empty($filtered)) { // just a temp fix when DiscussHelper::getPrivateCategories() // failed to get correct result and it will cause the following // query fails with error 500. return; } $allowedCategories = array(); foreach ($filtered as $filteredCategory) { if ($filteredCategory) { $allowedCategories[] = $db->Quote($filteredCategory); } } $query = 'SELECT COUNT(1) FROM ' . $db->nameQuote('#__discuss_posts') . ' ' . 'WHERE ' . $db->nameQuote('category_id') . ' IN (' . implode(',', $allowedCategories) . ') ' . 'AND ' . $db->nameQuote('parent_id') . '=' . $db->Quote(0) . ' ' . 'AND ' . $db->nameQuote('published') . '=' . $db->Quote(DISCUSS_ID_PUBLISHED); $db->setQuery($query); $count = $db->loadResult(); return $count; }