使用Apostrophe CMS中的架构创建动态表单

时间:2018-07-12 07:17:31

标签: apostrophe-cms

我的任务是创建动态表单系统。我们正在使用另一个具有API的CRM类型平台,该平台可以通过API获取带有字段的表单。

我已经按照撇号-提交-小工具教程进行了操作,但是我碰到了一些砖墙。

我正在将其他平台的字段转换为正确的架构字段,而不会出现问题。应用程序重启后的第一次加载是好的。我将来自其他平台的字段保存在aposCache集合中,以便可以更快地加载它们。效果很好。

问题1)

当在另一个平台上更新字段(窗体)时,该平台将发送一个Web挂钩调用,我已在小部件内部的一条路由中配置了该挂钩,然后对piece模块进行了内部Apostrophe调用,该模块重新缓存并重新-通过清空options.addFields来生成字段。

似乎通过调试,我没事了,但是我在为新的架构完全适用于下一次加载而又不重新加载应用程序的情况下苦苦挣扎。如前所述,我的初始加载工作正常(包括将数据发布回CRM),但也正在beforeConstructconstruct中进行操作。我从小部件进行的内部调用发生在construct内部的一个函数上。我认为这与self.load等有关,但我真的很难完成这项工作。

问题2)

功能列表的一部分是,一旦填写了表单,我想使用apostrophe-email将电子邮件发送给网站所有者和填写表单的人,这对模板很有效在计件模块的afterInsert中。

但是我希望它更具动态性,并可以由站点管理员(非开发人员)控制。为此,我在窗口小部件中添加了各个字段,站点管理员可以填写这些字段,然后根据自己的喜好修改邮件。问题是,邮件是在piece模块的afterInsert部分中发送的,而该模块似乎不知道提交小部件的字段中包含哪些内容。是否可以从afterInsert内部加载该文件?

问题3)

CRM平台具有“应用程序”。这是带有字段的表单,可以是Web表单,这些表单可以通过API加载。这个想法是,在一个站点上,您可以拥有2-3或10个具有不同字段的表单,这些表单连接到CRM平台中的不同应用程序。

这个想法是,站点管理员可以将两个凭证从CRM平台复制/粘贴到小部件中,并使用这两个凭证,Apostrophe将获取字段并生成表单,并在用户提交数据时回发到该应用程序。这意味着我需要能够具有多个动态模式,而又没有运行该模块的两个(或者如果需要更多的话)模块,piece模块和piece-widget模块。现在看来,我目前的方法是一个站点,一个表单。添加多个小部件将覆盖其余所有小部件。由于受困于其他部分,我推迟了一些担心,但是如果没有开发人员在站点上创建另一个块和/或小部件模块,扩展基本模块的情况,这可能是不可能的。会消除这种情况的动态性,并需要开发人员在网站上添加新表单的时间,我们希望避免这种情况。

感谢我所面临的上述挑战中的一个或全部的任何暗示,并再次感谢您提供一个出色的平台!

1 个答案:

答案 0 :(得分:0)

我对您的问题的思考越多,我认为用撇号支持该问题越是“合力”。撇号被设计为以固定的特定模式“启动”,或者如果您通过修改self.schema并设法将其推到所有进程而变得聪明,则偶尔会更改,但是无论如何,一次>一个模式。

而且,从声音上来说,您甚至不需要存储在Apostrophe中提交的内容。因此,这里的零件无需支付重量。

更合适的方法是直接使用apostrophe-schemas模块并根据需要在您选择的集合中实现您的存储,或者在提交后直接将数据发送回另一个应用。这使您摆脱了撇号模块的生命周期及其与架构保持不变的关系。一个模块可以实现多个“应用”。

在服务器端,您可以完全自己生成一个模式数组,也可以使用apos.schemas.compose处理具有addFields和rangingFields选项等的对象,并随时返回一个模式数组。然后,您可以使用apos.schemas.newInstance来获得一个新对象,该对象的每个模式均具有默认值。

然后您可以使用apos.schemas.convert接受提交,并将数据类型参数设置为form。然后,您将拥有一个干净的对象,可以插入到自己的集合中,或根据需要发送给API。

在浏览器端,您可以使用apos.schemas.populate用当前(包括默认值)填充表单,并使用apos.schemas.convert在表单上以apos.schemas.convert的格式准备外发提交服务器端期望。

您仍然可以使用apostrophe-widgets来连接所有管道。它只是不会成为小部件本身的架构的一部分-只会包含您提到的管理字段。 (如您所知,您绝对需要在该模块上使用playerData选项,以避免将除编辑程序之外的内容推入浏览器。)

要真正为表单生成标记,这是关键位:

{% import "apostrophe-schemas:macros.html" as schemas %}

<div class="my-form">
  {{ schemas.fields(data.widget._schema) }}
</div>

那么“ data.widget._schema”怎么了?我在这里设想的是,在小部件模块的load方法中,您将通过与其他应用程序的API进行对话来确定架构。那时,您可以将它作为_schema附加到小部件对象上,并带有下划线,这样它就不会在任何时候无意间跳入数据库。