Ghost实现遍历指定标签的文章的条目数量

Ghost目前提供的Helper,仅可以实现遍历所有文章,和遍历指定标签中的所有文章。而没有控制文章的遍历数量。

我使用Ghost搭建公司的网站,在首页想显示“资讯动态”的文章,因为有很多其他的文章栏目,所以“资讯动态”栏目不可能把该标签的文章全部展示出来,要“资讯动态”标签里有100条文章,那简直是噩梦。所以需要想办法限制它的显示数量。

QQ图片20160623161909.png


这里foreach中的 num属性,是用来控制遍历的数量。

num参数是自己写的,所以需要修改Helper。
在\core\server\helpers目录中找到foreach.js

然后修改代码:
// # Foreach Helper
// Usage: `{{#foreach data}}{{/foreach}}`
//
// Block helper designed for looping through posts
var hbs             = require('express-hbs'),
_               = require('lodash'),
errors          = require('../errors'),

hbsUtils        = hbs.handlebars.Utils,
foreach;

var content = new Array();
var filters = new Array();
var i = 0;

foreach = function (context, options) {
if (!options) {
    errors.logWarn('Need to pass an iterator to #foreach');
}

var fn = options.fn,
    inverse = options.inverse,
    columns = options.hash.columns,
    length = _.size(context),
    limit = parseInt(options.hash.limit, 10) || length,
    num = parseInt(options.hash.num, 10) || length,
    shows = '',
    data,
    contextPath;

if (options.data && options.ids) {
    contextPath = hbsUtils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';
}

if (hbsUtils.isFunction(context)) {
    context = context.call(this);
}

if (options.data) {
    data = hbs.handlebars.createFrame(options.data);
}

function execIteration(field, index, last) {
    if (data) {
        data.key = field;
        data.index = index;
        data.number = index + 1;
        data.first = index === 0;
        data.last = !!last;
        data.even = index % 2 === 1;
        data.odd = !data.even;
        data.rowStart = index % columns === 0;
        data.rowEnd = index % columns === (columns - 1);

        if (contextPath) {
            data.contextPath = contextPath + field;
        }
    }

    content[field] = fn(context[field], {
        data: data,
        blockParams: hbsUtils.blockParams([context[field], field], [contextPath + field, null])
    });

    if(content[field] != ""){
        filters[i] = content[field];

        if(i<num){
            shows = shows + filters[i];
        }
        i++;
    }
}

function iterateCollection(context) {
    var count = 1;

    _.each(context, function (item, key) {
        if (count <= limit) {
            execIteration(key, count - 1, count === limit);
        }
        count += 1;
    });
    i=0;
}

if (context && typeof context === 'object') {
    iterateCollection(context);
}

if (length === 0) {
    output = inverse(this);
}

return shows;
};

module.exports = foreach;

注意的是:如果修改num="" 中的值,需要重启Ghost服务,才能生效。

5 个评论

我记得有limit 限制数量来着
{{#foreach posts limit="10"}} 中的limit是限制了循环的次数,比如posts中有100篇,而用limit之后,你只循环出前10篇文章,这10篇文章中,可能会有不同标签的文章。加入{{#has tag="标签名"}}后,会显示出来该标签的文章,但是仍然存在问题,因为并没有把不属于该标签的文章真正的过滤掉,只是做了隐藏。所以我就写了这个num属性。你可以调试下,就明白了。
我给代码 做了注释
如果是指定tag 建议使用API的browser方法或者helper里的findPage 这样简单直接

include里加上tags
0.8.0里 设置一下filter

filter不能用的话 就再往下层一点 使用对数据查询的相关方法就好 以前的记得有个where什么的设置
好吧,我用的还是0.7

要回复文章请先登录注册