我希望使用Ghost来托管博客和静态网站,因此结构可能如下所示:

  • /:登录页面(而不是博客登录页面,不需要需要访问posts)
  • /blog/:博客登录页面(需要访问posts通常可以访问的index.hbs)
  • /page1/等:将根据需要使用page.hbspage-page1.hbs的静态页面
  • /blog-post-whatever/等:将使用post.hbs的博客帖子

  • 我唯一预见到的问题是,仅 index.hbs(据我所知)传递了posts模板变量(请参见code on GitHub here)。

    在我提交拉取请求之前,很高兴知道是否:
  • 是否存在访问posts中的page.hbs变量的现有方法?
  • 如果没有,是否值得为此提交拉取请求?
  • 如果是,我们真的要发送posts到所有页面吗?还是应该将拉取请求拆分为page.hbs并仅将其发送给那些请求?还是有更好的方法来做到这一点?
  • 最佳答案

    如果您不介意破解Ghost核心文件,则可以按照以下方法对当前版本的Ghost(0.7.4)进行操作。如果升级到新的Ghost版本,则需要重新创建此hack。

    首先创建模板文件(升级后不会更改):

    在以下位置创建主页模板:

    内容/主题/主题名称/home.hbs

    home.hbs 现在将取代 index.hbs 并将被呈现。

    还可以在以下位置创建博客模板文件:

    内容/主题/主题名称/blog.hbs

    添加分页帖子的handlebars元素是

    {{> "loop"}}
    

    因此它应该在 blog.hbs 文件中。

    同样,如果您升级到新版本的Ghost,则上述文件不会更改。

    现在,在core/server目录中编辑以下文件:



    /core/server/routes/frontend.js:

    前:
    indexRouter.route('/').get(frontend.index);
    indexRouter.route('/' + routeKeywords.page + '/:page/').get(frontend.index);
    

    后:
    indexRouter.route('/').get(frontend.index);
    indexRouter.route('/blog/').get(frontend.blog);
    indexRouter.route('/' + routeKeywords.page + '/:page/').get(frontend.index);
    

    这将调用Frontend Controller ,该 Controller 将以与“索引”和“主页”相同的数据级别呈现博客页面(默认为加载最近帖子的第一页),从而使我们能够在/中使用“循环”博客/页面。

    /core/server/controllers/frontend/index.js

    前:
    frontendControllers = {
        index: renderChannel('index'),
        tag: renderChannel('tag'),
    

    后:
    frontendControllers = {
        index: renderChannel('index'),
        blog: renderChannel('blog'),
        tag: renderChannel('tag'),
    

    /core/server/controllers/frontend/channel-config.js

    前:
    getConfig = function getConfig(name) {
        var defaults = {
            index: {
                name: 'index',
                route: '/',
                frontPageTemplate: 'home'
            },
            tag: {
    

    后:
    getConfig = function getConfig(name) {
        var defaults = {
            index: {
                name: 'index',
                route: '/',
                frontPageTemplate: 'home'
            },
            blog: {
                name: 'blog',
                route: '/blog/',
                frontPageTemplate: 'blog'
            },
            tag: {
    

    /core/server/controllers/frontend/channel-config.js
    前:
    indexPattern = new RegExp('^\\/' + config.routeKeywords.page + '\\/'),
    rssPattern = new RegExp('^\\/rss\\/'),
    homePattern = new RegExp('^\\/$');
    

    后:
    indexPattern = new RegExp('^\\/' + config.routeKeywords.page + '\\/'),
    rssPattern = new RegExp('^\\/rss\\/'),
    blogPattern = new RegExp('^\\/blog\\/'),
    homePattern = new RegExp('^\\/$');
    



    前:
     if (indexPattern.test(res.locals.relativeUrl)) {
            res.locals.context.push('index');
        } else if (homePattern.test(res.locals.relativeUrl)) {
            res.locals.context.push('home');
            res.locals.context.push('index');
        } else if (rssPattern.test(res.locals.relativeUrl)) {
            res.locals.context.push('rss');
        } else if (privatePattern.test(res.locals.relativeUrl)) {
            res.locals.context.push('private');
    

    后:
     if (indexPattern.test(res.locals.relativeUrl)) {
            res.locals.context.push('index');
        } else if (homePattern.test(res.locals.relativeUrl)) {
            res.locals.context.push('home');
            res.locals.context.push('index');
        } else if (blogPattern.test(res.locals.relativeUrl)) {
            res.locals.context.push('blog');
        } else if (rssPattern.test(res.locals.relativeUrl)) {
            res.locals.context.push('rss');
        } else if (privatePattern.test(res.locals.relativeUrl)) {
            res.locals.context.push('private');
    

    重新启动服务器,您应该会看到新的/blog/页面以及最近的博客文章列表

    关于node.js - 有没有办法让Ghost静态页面访问index.hbs传递的 'posts'变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23640333/

    10-13 09:31