From b8fc0bc37692cb86738d77c65c9b616766fb985b Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Tue, 25 Aug 2015 19:32:41 +0930 Subject: [PATCH] Make discussion slug URL parameter optional --- js/forum/src/components/DiscussionPage.js | 6 ++++-- js/forum/src/initializers/routes.js | 14 ++++---------- src/Forum/Actions/DiscussionAction.php | 2 +- src/Forum/ForumServiceProvider.php | 2 +- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/js/forum/src/components/DiscussionPage.js b/js/forum/src/components/DiscussionPage.js index ca9033f18..e66fbe2be 100644 --- a/js/forum/src/components/DiscussionPage.js +++ b/js/forum/src/components/DiscussionPage.js @@ -62,7 +62,9 @@ export default class DiscussionPage extends mixin(Component, evented) { // cancel the unloading of this controller and instead prompt the post // stream to jump to the new 'near' param. if (this.discussion) { - if (m.route.param('id') === this.discussion.id()) { + const idParam = m.route.param('id'); + + if (idParam && idParam.split('-')[0] === this.discussion.id()) { e.preventDefault(); const near = Number(m.route.param('near')) || 1; @@ -143,7 +145,7 @@ export default class DiscussionPage extends mixin(Component, evented) { } else { const params = this.requestParams(); - app.store.find('discussions', m.route.param('id'), params) + app.store.find('discussions', m.route.param('id').split('-')[0], params) .then(this.init.bind(this)); } diff --git a/js/forum/src/initializers/routes.js b/js/forum/src/initializers/routes.js index abd2c7ff1..cd16b3081 100644 --- a/js/forum/src/initializers/routes.js +++ b/js/forum/src/initializers/routes.js @@ -15,9 +15,8 @@ export default function(app) { 'index': {path: '/all', component: IndexPage.component()}, 'index.filter': {path: '/:filter', component: IndexPage.component()}, - 'discussion.id': {path: '/d/:id', component: DiscussionPage.component()}, - 'discussion': {path: '/d/:id/:slug', component: DiscussionPage.component()}, - 'discussion.near': {path: '/d/:id/:slug/:near', component: DiscussionPage.component()}, + 'discussion': {path: '/d/:id', component: DiscussionPage.component()}, + 'discussion.near': {path: '/d/:id/:near', component: DiscussionPage.component()}, 'user': {path: '/u/:username', component: PostsUserPage.component()}, 'user.posts': {path: '/u/:username', component: PostsUserPage.component()}, @@ -36,8 +35,7 @@ export default function(app) { */ app.route.discussion = (discussion, near) => { return app.route(near > 1 ? 'discussion.near' : 'discussion', { - id: discussion.id(), - slug: discussion.slug(), + id: discussion.id() + '-' + discussion.slug(), near: near > 1 ? near : undefined }); }; @@ -49,11 +47,7 @@ export default function(app) { * @return {String} */ app.route.post = post => { - return app.route('discussion.near', { - id: post.discussion().id(), - slug: post.discussion().slug(), - near: post.number() - }); + return app.route.discussion(post.discussion(), post.number()); }; /** diff --git a/src/Forum/Actions/DiscussionAction.php b/src/Forum/Actions/DiscussionAction.php index 1de63268b..b4f66abc1 100644 --- a/src/Forum/Actions/DiscussionAction.php +++ b/src/Forum/Actions/DiscussionAction.php @@ -16,7 +16,7 @@ class DiscussionAction extends ClientAction $page = max(1, array_get($queryParams, 'page')); $params = [ - 'id' => array_get($routeParams, 'id'), + 'id' => (int) array_get($routeParams, 'id'), 'page' => [ 'near' => array_get($routeParams, 'near'), 'offset' => ($page - 1) * 20, diff --git a/src/Forum/ForumServiceProvider.php b/src/Forum/ForumServiceProvider.php index 78879dd6f..211ea899a 100644 --- a/src/Forum/ForumServiceProvider.php +++ b/src/Forum/ForumServiceProvider.php @@ -57,7 +57,7 @@ class ForumServiceProvider extends ServiceProvider ); $routes->get( - '/d/{id:\d+}[/{slug}[/{near}]]', + '/d/{id:\d+(?:-[^/]*)?}[/{near}]', 'flarum.forum.discussion', $this->action('Flarum\Forum\Actions\DiscussionAction') );