【问题标题】:Apostrophe CMS: filtering the Result of apostrophe-pieces-widgetsApostrophe CMS:过滤 apostrophe-pieces-widgets 的结果
【发布时间】:2020-12-09 02:28:50
【问题描述】:

我的模板中目前有两行代码

{{ apos.singleton(data.page, 'productsLimitedBy12', 'products',{...someoptions}) }}
...
{{ apos.singleton(data.page, 'singleproduct', 'products',{...someoptions}) }}

两者都是我在 'apostrophe-pieces-widgets' 的帮助下声明的同一个小部件。

我想在撇号将加载的片段限制为数字 12 和 1 之前过滤它们。如果我在 self.load 上过滤片段,我将只有 12 - filtered_pieces。但数量应该是静态的,如果数据库中符合黑名单和白名单标准的件数少于 12 个,则数量应少于 12 个。

基本上我想要一个黑白名单,选项“对 XYZ 可见,对 XYZ 不可见,对所有人可见”

例子:

  1. 在数组“company1, company2”中具有以下属性的用户 ABC 应该会看到指定为对 company1 或 company2 可见的每个片段,或者对所有人可见的片段。
  2. 在数组“notCompany1, notCompany2”中具有以下属性的用户 DEF 应该可以看到不是来自 company1 或 company2 的每一块。

我怎样才能做到这一点?是否可以在每次请求来自特定小部件的片段时包含将添加到查询中的过滤器?

EDIT-1:

用于指定数字 1 或 12 的确切含义。如果我登录时可以访问上下文菜单并单击小部件,我会得到以下选项: 选择(可以是全部、按标签或单独) 和显示的最大值。对于第一个产品小部件,我想要 12 件,其他只有 1 件。

如果您指的是代码中的字符串,这些只是为了理解我有两行我有相同的小部件但有不同的限制,我对其进行了调整以便更好地理解。

快速总结我的工作流程:

  1. 我通过上下文菜单给一些产品一些白名单和黑名单的公司
  2. 这些公司是通过连接添加到作品中的
  3. 我过滤 products-widget/index.js 中的片段;但问题是过滤发生在撇号选择 12 或 1 件之后。我想过滤,然后用撇号来限制碎片。

这是我的 product/index.js(当然是修剪过的):

module.exports = {
    extend: 'apostrophe-pieces',
    name: 'product',
    label: 'product',
    pluralLabel: 'products',
    contextual: true,
    addFields: [
        {
            name: 'title',
            label: 'Title',
            type: 'string',
            required: true
        },
        {
            name: '_companySelection',
            withType: 'company',
            label: 'Company-Selection',
            type: 'joinByArray',
            filters: {
                areas: false,
                joins: false,
                projection: {
                    _id: 1,
                    title: 1
                }
            }
        },
        {
            name: '_companySelectionNOT',
            withType: 'company',
            label: 'Company-Selection NOT',
            type: 'joinByArray',
            filters: {
                areas: false,
                joins: false,
                projection: {
                    _id: 1,
                    title: 1
                }
            }
        },

    ],

    arrangeFields: [
        {}
    ],
    construct: function (self, options) {
        self.beforeSave = function (req, piece, options, callback) {
            // foo()
            return callback();
        };
    }
};

这是我保存在 aposDocs 中的数据库对象(当然是修剪过的):

{
    "_id": "ckfwbczu5002035ziaa8a2pzp",
    "priority": 100000,
    "validFrom": "2020-10-01",
    "validUntil": "2020-12-31",
    "trash": false,
    "title": "EXAMPLE",
    "createdAt": {
        "$date": "2020-10-05T09:10:16.685Z"
    },
    "updatedAt": {
        "$date": "2020-12-04T11:21:29.692Z"
    },
    "companySelectionIds": ['ck2q9raez01i04kous6fo59hj'],
    "companySelectionNOTIds": ["cjn0e31up02ydm8otk4h4uhwq"],

}

这是我的 products-widgets/index.js(当然是修剪过的)

module.exports = {
    extend: 'apostrophe-pieces-widgets',
    filters: {
        projection: {
            ...projectobj
        }
    },
    label: 'Product Widget',
    alias: 'products',
    construct: function (self, options) {
        var superLoad = self.load;
        self.addHelpers({...helpers})
        self.load = function (req, widgets, callback) {
            var currentUser = req.data.user;
            return superLoad(req, widgets, function (err) {
                if (err) return callback(err);
                else {
                    widgets._pieces = filtered(user,widgets._pieces);
                    callback()
                }
            });
        };
    }
};

也为了快速了解我的案例:

  • 用户应该看到他/她的数据匹配的每个产品 companySelectionIds 或 companySelectionIds 数组为空。
  • 用户不应该看到他/她的数据与 companySelectionNOTIds 数组匹配或与 companySelectionIds

【问题讨论】:

  • 我不确定 121 数字在这种情况下的作用。似乎重要的是,具有某些与公司相关配置的用户只能获得与这些配置匹配的部分。您能否分享一些与您如何设置该公司选项字段相关的代码?
  • @alexbea 感谢您的评论,我调整了我的帖子并添加了更多信息。我希望它现在更清楚了,如果没有,请不要犹豫,要求更多,我会尽力提供更多信息。最好的问候。

标签: apostrophe-cms


【解决方案1】:

我认为使用self.widgetCursor 可能是我尝试实现这一目标的方式。您根本不需要对self.load 做任何事情,因为您需要在加载开始之前完成过滤。它需要发生在光标中。

widgetCursor 看起来像:

self.widgetCursor = function(req, criteria) {
  var filters = self.filters || (self.joinById && self.joinById.filters);
  return self.pieces.find(req, criteria).applyFilters(filters);
};

您应该有req.user 可用于获取类似于以下内容的用户信息:

// Possibly could be `self.apos.users.find`
var userCursor = self.apos.docs.getManager('user').find(req, { _id: req.user._id }, {
  _companySelection: 1,
  _companySelectionNOT: 1
});

const user = userCursor.toObject();

我不能 100% 确定这是完全正确的,但我很确定它已经足够接近可以开始了。获得用户数据后,可以通过超级模式或完全覆盖它,将其应用于self.widgetCursor 中的criteria 对象。

【讨论】:

  • 非常感谢!这正是我所需要的。我基本上只是用一个已经得到我想要的一切的 mongoDB 查询来使标准动态化。目前正在仔细测试它,如果一切正常,我会添加新评论或解决这个问题。代表我更好地理解的两个小问题:标准已经填充了 id,有时没有。这对我来说有点随机。这有什么原因吗?另外撇号页面上的工作流程如何?首先加载的是页面结构还是小部件光标?
  • criteria 只有当您在使用“选择...单独”选项的模式下使用碎片小部件时,才应该在其中包含 ID。小部件位于页面的某个区域中,因此它是页面加载过程的一部分。 construct 仅在应用启动时运行,但还有其他功能,如 beforeShow,在请求页面时运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多