微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

撇号-cms 将一个碎片区域克隆到另一个非碎片区域

如何解决撇号-cms 将一个碎片区域克隆到另一个非碎片区域

我有一个称为模板的 apos 件集合,在该模式中,我有一个用于其他小部件等的 apos 区域。

我创建了一个标准的非碎片小部件,其中带有可以选择区域的 joinbyone,但我似乎无法找到将碎片区域中的项目克隆到小部件中的非碎片区域的方法

这个想法是我可以将模板创建为片段,当它们被选中时,我会将该模板的副本创建到匿名区域中,因此片段区域不变。任何帮助将不胜感激

解决方法

小部件没有自己的 afterSave 类型 event handler,因为真正保存的并不是它们。这是他们所属的文件。您可以在文档类型上使用 afterSave 事件处理程序:

  1. 查看保存的文档是否在区域中包含该小部件
  2. 查看模板小部件是否具有填充的连接
  3. 将合并文档中的区域数据复制到小部件区域
  4. 清除小部件的连接字段(以便它可以查看将来是否选择了新模板)

第 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' })
    }

  }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。