CategoriesController::index PHP Method

index() public method

Show all discussions in a particular category.
Since: 2.0.0
public index ( string $CategoryIdentifier = '', $Page = '0' )
$CategoryIdentifier string Unique category slug or ID.
    public function index($CategoryIdentifier = '', $Page = '0')
    {
        // Figure out which category layout to choose (Defined on "Homepage" settings page).
        $Layout = c('Vanilla.Categories.Layout');
        if ($CategoryIdentifier == '') {
            switch ($Layout) {
                case 'mixed':
                    $this->View = 'discussions';
                    $this->discussions();
                    break;
                case 'table':
                    $this->table();
                    break;
                default:
                    $this->View = 'all';
                    $this->all('', CategoryModel::getRootDisplayAs());
                    break;
            }
            return;
        } else {
            $Category = CategoryModel::categories($CategoryIdentifier);
            if (empty($Category)) {
                throw notFoundException();
            }
            $Category = (object) $Category;
            Gdn_Theme::section($Category->CssClass);
            // Load the breadcrumbs.
            $this->setData('Breadcrumbs', CategoryModel::getAncestors(val('CategoryID', $Category)));
            $this->setData('Category', $Category, true);
            $this->title(htmlspecialchars(val('Name', $Category, '')));
            $this->description(val('Description', $Category), true);
            switch ($Category->DisplayAs) {
                case 'Flat':
                case 'Heading':
                case 'Categories':
                    $stopHeadings = val('Depth', $Category) > CategoryModel::instance()->getNavDepth();
                    CategoryModel::instance()->setStopHeadingsCalculation($stopHeadings);
                    if ($this->SyndicationMethod != SYNDICATION_NONE) {
                        // RSS can't show a category list so just tell it to expand all categories.
                        saveToConfig('Vanilla.ExpandCategories', true, false);
                    } else {
                        // This category is an overview style category and displays as a category list.
                        switch ($Layout) {
                            case 'mixed':
                                $this->View = 'discussions';
                                $this->discussions($CategoryIdentifier);
                                break;
                            case 'table':
                                $this->table($CategoryIdentifier, $Category->DisplayAs);
                                break;
                            default:
                                $this->View = 'all';
                                $this->All($CategoryIdentifier, $Category->DisplayAs);
                                break;
                        }
                        return;
                    }
                    break;
            }
            Gdn_Theme::section('DiscussionList');
            // Figure out which discussions layout to choose (Defined on "Homepage" settings page).
            $Layout = c('Vanilla.Discussions.Layout');
            switch ($Layout) {
                case 'table':
                    if ($this->SyndicationMethod == SYNDICATION_NONE) {
                        $this->View = 'table';
                    }
                    break;
                default:
                    // $this->View = 'index';
                    break;
            }
            $this->setData('CategoryTree', $this->getCategoryTree($CategoryIdentifier, val('DisplayAs', $Category)));
            // Add a backwards-compatibility shim for the old categories.
            $this->categoriesCompatibilityCallback = function () use($CategoryIdentifier) {
                $categories = CategoryModel::getSubtree($CategoryIdentifier, false);
                return $categories;
            };
            // Setup head
            $this->Menu->highlightRoute('/discussions');
            if ($this->Head) {
                $this->addJsFile('discussions.js');
                $this->Head->addRss(categoryUrl($Category) . '/feed.rss', $this->Head->title());
            }
            // Set CategoryID
            $CategoryID = val('CategoryID', $Category);
            $this->setData('CategoryID', $CategoryID, true);
            // Add modules
            $this->addModule('NewDiscussionModule');
            $this->addModule('DiscussionFilterModule');
            $this->addModule('CategoriesModule');
            $this->addModule('BookmarkedModule');
            // Get a DiscussionModel
            $DiscussionModel = new DiscussionModel();
            $DiscussionModel->setSort(Gdn::request()->get());
            $DiscussionModel->setFilters(Gdn::request()->get());
            $this->setData('Sort', $DiscussionModel->getSort());
            $this->setData('Filters', $DiscussionModel->getFilters());
            $CategoryIDs = array($CategoryID);
            if (c('Vanilla.ExpandCategories')) {
                $CategoryIDs = array_merge($CategoryIDs, array_column($this->data('Categories'), 'CategoryID'));
            }
            $Wheres = array('d.CategoryID' => $CategoryIDs);
            $this->setData('_ShowCategoryLink', count($CategoryIDs) > 1);
            // Check permission
            $this->permission('Vanilla.Discussions.View', true, 'Category', val('PermissionCategoryID', $Category));
            // Set discussion meta data.
            $this->EventArguments['PerPage'] = c('Vanilla.Discussions.PerPage', 30);
            $this->fireEvent('BeforeGetDiscussions');
            list($Offset, $Limit) = offsetLimit($Page, $this->EventArguments['PerPage']);
            if (!is_numeric($Offset) || $Offset < 0) {
                $Offset = 0;
            }
            $Page = PageNumber($Offset, $Limit);
            // Allow page manipulation
            $this->EventArguments['Page'] =& $Page;
            $this->EventArguments['Offset'] =& $Offset;
            $this->EventArguments['Limit'] =& $Limit;
            $this->fireEvent('AfterPageCalculation');
            // We want to limit the number of pages on large databases because requesting a super-high page can kill the db.
            $MaxPages = c('Vanilla.Categories.MaxPages');
            if ($MaxPages && $Page > $MaxPages) {
                throw notFoundException();
            }
            $CountDiscussions = $DiscussionModel->getCount($Wheres);
            if ($MaxPages && $MaxPages * $Limit < $CountDiscussions) {
                $CountDiscussions = $MaxPages * $Limit;
            }
            $this->setData('CountDiscussions', $CountDiscussions);
            $this->setData('_Limit', $Limit);
            // We don't wan't child categories in announcements.
            $Wheres['d.CategoryID'] = $CategoryID;
            $AnnounceData = $DiscussionModel->getAnnouncements($Wheres, $Offset, $Limit);
            $this->AnnounceData = $this->setData('Announcements', $AnnounceData);
            $Wheres['d.CategoryID'] = $CategoryIDs;
            // RSS should include announcements.
            if ($this->SyndicationMethod !== SYNDICATION_NONE) {
                $Wheres['Announce'] = 'all';
            }
            $this->DiscussionData = $this->setData('Discussions', $DiscussionModel->getWhereRecent($Wheres, $Limit, $Offset));
            // Build a pager
            $PagerFactory = new Gdn_PagerFactory();
            $url = CategoryUrl($CategoryIdentifier);
            $this->EventArguments['PagerType'] = 'Pager';
            $this->fireEvent('BeforeBuildPager');
            if (!$this->data('_PagerUrl')) {
                $this->setData('_PagerUrl', $url . '/{Page}');
            }
            $queryString = DiscussionModel::getSortFilterQueryString($DiscussionModel->getSort(), $DiscussionModel->getFilters());
            $this->setData('_PagerUrl', $this->data('_PagerUrl') . $queryString);
            $this->Pager = $PagerFactory->GetPager($this->EventArguments['PagerType'], $this);
            $this->Pager->ClientID = 'Pager';
            $this->Pager->configure($Offset, $Limit, $CountDiscussions, $this->data('_PagerUrl'));
            $this->Pager->Record = $Category;
            PagerModule::current($this->Pager);
            $this->setData('_Page', $Page);
            $this->setData('_Limit', $Limit);
            $this->fireEvent('AfterBuildPager');
            // Set the canonical Url.
            $this->canonicalUrl(categoryUrl($Category, pageNumber($Offset, $Limit)));
            // Change the controller name so that it knows to grab the discussion views
            $this->ControllerName = 'DiscussionsController';
            // Pick up the discussions class
            $this->CssClass = 'Discussions Category-' . val('UrlCode', $Category);
            // Deliver JSON data if necessary
            if ($this->_DeliveryType != DELIVERY_TYPE_ALL) {
                $this->setJson('LessRow', $this->Pager->toString('less'));
                $this->setJson('MoreRow', $this->Pager->toString('more'));
                $this->View = 'discussions';
            }
            // Render default view.
            $this->fireEvent('BeforeCategoriesRender');
            $this->render();
        }
    }

Usage Example

Beispiel #1
0
    HelloWorldController::hallinto();
});
$routes->post('/hallinto', function () {
    TopicController::searchTopicsMessages();
});
$routes->get('/', function () {
    HelloWorldController::index();
});
$routes->get('/kategoria', function () {
    HelloWorldController::kategoria();
});
$routes->get('/keskustelu', function () {
    HelloWorldController::keskustelu();
});
$routes->get('/foorumi', function () {
    CategoriesController::index();
});
$routes->get('/kategoria-:id', function ($id) {
    CategoriesController::category($id);
});
$routes->get('/kirjaudu', function () {
    UserController::login();
});
$routes->post('/kirjaudu', function () {
    UserController::login();
});
$routes->get('/kirjauduulos', function () {
    UserController::logout();
});
$routes->get('/keskustelu-:id', function ($id) {
    TopicController::messages($id);