问题描述
我有一个称为模板的 apos 件集合,在该模式中,我有一个用于其他小部件等的 apos 区域。
我创建了一个标准的非碎片小部件,其中带有可以选择区域的 joinbyone,但我似乎无法找到将碎片区域中的项目克隆到小部件中的非碎片区域的方法。
这个想法是我可以将模板创建为片段,当它们被选中时,我会将该模板的副本创建到匿名区域中,因此片段区域不变。任何帮助将不胜感激
解决方法
小部件没有自己的 afterSave
类型 event handler,因为真正保存的并不是它们。这是他们所属的文件。您可以在文档类型上使用 afterSave
事件处理程序:
- 查看保存的文档是否在区域中包含该小部件
- 查看模板小部件是否具有填充的连接
- 将合并文档中的区域数据复制到小部件区域
- 清除小部件的连接字段(以便它可以查看将来是否选择了新模板)
第 3b 步实际上是更新复制区域中所有小部件的 _id
属性。区域小部件在移动或复制时具有唯一的 _ids
,因此应该为这个新上下文重新生成这些小部件。 cuid
实用程序对此很有用。
这是一个不寻常的案例,但确实很有趣。我认为如果您需要这样做,这可能会奏效。并且它保持数据正确,而不是在模板中做数据工作。
,我似乎无法处理数据服务器端,所以我使用模板助手将数据重新发布,然后从片段中复制区域并通过重新点路径/docid 运行项目常规。到目前为止效果很好!
模板.html
{% import "macros/widgets.html" as widget %}
{%if data.widget%}
{% set section=apos.sectionTemplate.copyme(data.widget) %}
{%endif%}
{{ widget.postWidget(section,'newnsection') }}
小部件.js
const apos = require("apostrophe");
module.exports = {
extend: 'apostrophe-widgets',label: 'Section Template',alias: 'sectionTemplate',defer: true,addFields: [
{
name: '_nsection',type: 'joinByOne',withType: 'templateSections',label: 'Template',required: true,idField: 'id',filters: {
projection: {
title: 1,nsection: 1
}
}
},{
name: 'newnsection',type: 'area',label: 'Section',contextual: true,def: ''
}
],construct: function (self,options) {
self.addHelpers({
copyme: function (data) {
if (data.newnsection.items.length == 0) {
data.newnsection.items = data._nsection.nsection.items
area = recalcDotPathsAreas(data.newnsection);
function recalcDotPathsAreas(area) {
var docId = area._docId;
var dotPath = area._dotPath;
area.items.forEach(stlevel);
function stlevel(value,index,array) {
var widgetDotPath = dotPath + '.items.' + index;
try {
var $widget = value;
value.__docId = docId;
value.__dotPath = widgetDotPath;
recalcDotPathsAreasWidget(value,docId,widgetDotPath);
} catch (e) {
}
};
return area
};
function recalcDotPathsAreasWidget($widget,dotPath) {
$widget.items.forEach(sclevel);
function sclevel(value,array) {
var $area = value;
var areaDocId = value._id;
if ((areaDocId !== docId) && areaDocId && (areaDocId.substring(0,1) === 'w')) {
value._id = docId;
areaDocId = docId;
}
if (areaDocId === docId) {
var areaDotPath = value._dotPath;
if (areaDotPath) {
var components = areaDotPath.split('.');
var name = components.pop();
value._dotPath = dotPath + '.' + name;
recalculateDotPathsInArea(value);
}
}
};
};
}
return data;
}
});
var superPushAssets = self.pushAssets
self.pushAssets = function () {
superPushAssets()
// self.pushAsset('stylesheet','smart-section',{when: 'always'})
self.pushAsset('script','always',{ when: 'always' })
}
}
}