From 78763834fe478c2538e8571d537c484dfd9c5719 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 30 Nov 2014 21:15:09 -0500 Subject: [PATCH] closed #2122 --- src/controllers/categories.js | 1 + src/controllers/topics.js | 1 + src/middleware/middleware.js | 52 +++++++++++++++++++++++++++++++++++ src/routes/index.js | 8 +++--- 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src/controllers/categories.js b/src/controllers/categories.js index a9928015d8..49890ab6f7 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -251,6 +251,7 @@ categoriesController.get = function(req, res, next) { } } + data.breadcrumbs = res.locals.breadcrumbs; res.render('category', data); }); }; diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 6d21aacb68..5aae9774cb 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -253,6 +253,7 @@ topicsController.get = function(req, res, next) { } } + data.breadcrumbs = res.locals.breadcrumbs; res.render('topic', data); }); }; diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index ad2b6eb408..ad14a86f2e 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -196,6 +196,58 @@ middleware.checkAccountPermissions = function(req, res, next) { }); }; +middleware.buildBreadcrumbs = function(req, res, next) { + var breadcrumbs = [], + findParents = function(cid) { + var currentCategory; + async.doWhilst(function(next) { + categories.getCategoryFields(currentCategory ? currentCategory.parentCid : cid, ['name', 'slug', 'parentCid'], function(err, data) { + if (err) { + return next(err); + } + + breadcrumbs.unshift({ + text: data.name, + url: nconf.get('relative_path') + 'category/' + data.slug + }); + + currentCategory = data; + next(); + }); + }, function() { + return !!currentCategory.parentCid && currentCategory.parentCid !== '0'; + }, function(err) { + if (err) { + winston.warn('[buildBreadcrumb] Could not build breadcrumbs: ' + err.message); + } + + // Home breadcrumb + translator.translate('[[global:home]]', meta.config.defaultLang || 'en_GB', function(translated) { + breadcrumbs.unshift({ + text: translated, + url: nconf.get('relative_path') + }); + + res.locals.breadcrumbs = breadcrumbs || []; + next(); + }); + }); + }; + + if (req.params.topic_id) { + topics.getTopicFields(parseInt(req.params.topic_id, 10), ['cid', 'title', 'slug'], function(err, data) { + breadcrumbs.unshift({ + text: data.title, + url: nconf.get('relative_path') + 'topic/' + data.slug + }); + + findParents(parseInt(data.cid, 10)); + }); + } else { + findParents(parseInt(req.params.category_id, 10)); + } +}; + middleware.buildHeader = function(req, res, next) { res.locals.renderHeader = true; diff --git a/src/routes/index.js b/src/routes/index.js index ba5062e89d..ff1d4f0eab 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -40,8 +40,8 @@ function staticRoutes(app, middleware, controllers) { function topicRoutes(app, middleware, controllers) { app.get('/api/topic/teaser/:topic_id', controllers.topics.teaser); - setupPageRoute(app, '/topic/:topic_id/:slug/:post_index?', middleware, [], controllers.topics.get); - setupPageRoute(app, '/topic/:topic_id/:slug?', middleware, [middleware.addSlug], controllers.topics.get); + setupPageRoute(app, '/topic/:topic_id/:slug/:post_index?', middleware, [middleware.buildBreadcrumbs], controllers.topics.get); + setupPageRoute(app, '/topic/:topic_id/:slug?', middleware, [middleware.buildBreadcrumbs, middleware.addSlug], controllers.topics.get); } function tagRoutes(app, middleware, controllers) { @@ -55,8 +55,8 @@ function categoryRoutes(app, middleware, controllers) { setupPageRoute(app, '/unread', middleware, [middleware.authenticate], controllers.categories.unread); app.get('/api/unread/total', middleware.authenticate, controllers.categories.unreadTotal); - setupPageRoute(app, '/category/:category_id/:slug/:topic_index', middleware, [], controllers.categories.get); - setupPageRoute(app, '/category/:category_id/:slug?', middleware, [middleware.addSlug], controllers.categories.get); + setupPageRoute(app, '/category/:category_id/:slug/:topic_index', middleware, [middleware.buildBreadcrumbs], controllers.categories.get); + setupPageRoute(app, '/category/:category_id/:slug?', middleware, [middleware.buildBreadcrumbs, middleware.addSlug], controllers.categories.get); } function accountRoutes(app, middleware, controllers) {