diff --git a/core/server/data/meta/context_object.js b/core/server/data/meta/context_object.js index d8b7495497..f02cee95c6 100644 --- a/core/server/data/meta/context_object.js +++ b/core/server/data/meta/context_object.js @@ -16,14 +16,19 @@ function getContextObject(data, context) { // @TODO: meta layer is very broken, it's really hard to understand what it's doing // The problem is that handlebars root object is structured differently. Sometimes the object is flat on data // and sometimes the object is part of a key e.g. data.post. This needs to be prepared at the very first stage and not in each helper. - if (_.includes(context, 'page') || _.includes(context, 'amp') && data.post) { + if ((_.includes(context, 'page') || _.includes(context, 'amp')) && data.post) { chosenContext = data.post; } else if (_.includes(context, 'post') && data.post) { chosenContext = data.post; + } else if (_.includes(context, 'page') && data.page) { + chosenContext = data.page; } else if (data[context]) { // @NOTE: This is confusing as hell. It tries to get data[['author']], which works, but coincidence? chosenContext = data[context]; - } else { + } + + // Super fallback. + if (!chosenContext) { chosenContext = blog; } diff --git a/core/test/regression/site/site_spec.js b/core/test/regression/site/site_spec.js index 764032a685..de2464a943 100644 --- a/core/test/regression/site/site_spec.js +++ b/core/test/regression/site/site_spec.js @@ -2625,10 +2625,28 @@ describe('Integration - Web - Site', function () { }); }); - describe('collection with data key', function () { + describe('collection/routes with data key', function () { before(function () { sinon.stub(settingsService, 'get').returns({ - routes: {}, + routes: { + '/my-page/': { + data: { + query: { + page: { + controller: 'pagesPublic', + resource: 'pages', + type: 'read', + options: { + slug: 'static-page-test' + } + } + }, + router: { + pages: [{redirect: true, slug: 'static-page-test'}] + } + } + } + }, collections: { '/food/': { @@ -2759,6 +2777,20 @@ describe('Integration - Web - Site', function () { response.statusCode.should.eql(200); }); }); + + it('serve my-page', function () { + const req = { + secure: true, + method: 'GET', + url: '/my-page/', + host: 'example.com' + }; + + return testUtils.mocks.express.invoke(app, req) + .then(function (response) { + response.statusCode.should.eql(200); + }); + }); }); }); diff --git a/core/test/unit/data/meta/context_object_spec.js b/core/test/unit/data/meta/context_object_spec.js index 2efbad121e..8aa79388c2 100644 --- a/core/test/unit/data/meta/context_object_spec.js +++ b/core/test/unit/data/meta/context_object_spec.js @@ -46,6 +46,15 @@ describe('getContextObject', function () { contextObject.should.eql(data.post); }); + it('should return page', function () { + data = {page: {id: 2}}; + context = ['news', 'page']; + contextObject = getContextObject(data, context); + + should.exist(contextObject); + contextObject.should.eql(data.page); + }); + describe('override blog', function () { before(function () { sinon.stub(settingsCache, 'get').callsFake(function (key) { diff --git a/core/test/utils/fixtures/themes/test-theme-channels/default.hbs b/core/test/utils/fixtures/themes/test-theme-channels/default.hbs index e69de29bb2..5cfeecafe8 100644 --- a/core/test/utils/fixtures/themes/test-theme-channels/default.hbs +++ b/core/test/utils/fixtures/themes/test-theme-channels/default.hbs @@ -0,0 +1 @@ +{{ghost_head}} \ No newline at end of file