跳转到主要内容
我们的应用需要两个自定义对象:文档模板(写什么)和 文档(生成的结果)。 让我们来定义它们。 用CLI扫描每个实体的文件 — — 它为您生成一个有效的 UUID 和 文件夹:
yarn twenty dev:add object
在下方显示完成的文件。
每一个 *_UNIVERSAL_IDENTIFIER' 常住寿命为 src/constants/universal-identifiers.ts` 并且在使用时导入。 下面的 代码片段省略了这些导入的简洁度 - 将它们保留在您自己的文件中。

模板对象

一个模板具有一个 name、一个包含 {{placeholders}}body,以及一个 target,用于指明它是为 Person 还是 Company 编写的。 body 是一个 RICH_TEXT 字段,所以二十个字段给它一个完整的文本编辑器。
import { defineObject, FieldType } from 'twenty-sdk/define';

export default defineObject({
  universalIdentifier: DOCUMENT_TEMPLATE_OBJECT_UNIVERSAL_IDENTIFIER,
  nameSingular: 'documentTemplate',
  namePlural: 'documentTemplates',
  labelSingular: 'Document template',
  labelPlural: 'Document templates',
  icon: 'IconFileText',
  labelIdentifierFieldMetadataUniversalIdentifier:
    TEMPLATE_NAME_FIELD_UNIVERSAL_IDENTIFIER,
  fields: [
    { universalIdentifier: TEMPLATE_NAME_FIELD_UNIVERSAL_IDENTIFIER,
      type: FieldType.TEXT, name: 'name', label: 'Name', icon: 'IconAbc' },
    { universalIdentifier: TEMPLATE_BODY_FIELD_UNIVERSAL_IDENTIFIER,
      type: FieldType.RICH_TEXT, name: 'body', label: 'Body', icon: 'IconFileText',
      description: 'Use {{placeholders}} like {{name.firstName}} or {{jobTitle}}.' },
    { universalIdentifier: TEMPLATE_TARGET_FIELD_UNIVERSAL_IDENTIFIER,
      type: FieldType.SELECT, name: 'target', label: 'Target', icon: 'IconTarget',
      defaultValue: `'PERSON'`,
      options: [
        { id: TEMPLATE_TARGET_OPTION_PERSON_UNIVERSAL_IDENTIFIER,
          value: 'PERSON', label: 'Person', color: 'blue', position: 0 },
        { id: TEMPLATE_TARGET_OPTION_COMPANY_UNIVERSAL_IDENTIFIER,
          value: 'COMPANY', label: 'Company', color: 'green', position: 1 },
      ] },
  ],
});
SELECT 选项 必须是 UPPER_CASE (PERSON, 而不是person),并且 defaultValue 用额外引号包裹:`PERSON`。 “label” 是 用户所看到的。

文档对象

生成的文档存储渲染的 contentstatus 。 以相同的方式定义它,并添加一个 status 选择字段,取值为 DRAFT / GENERATED。 完整文件: document.object.ts

将它们与关联到关系

每个文档都应该回到它所产生的模板。 关系是 双向 — — 您在自己的字段文件中定义双方。
import { defineField, FieldType, OnDeleteAction, RelationType } from 'twenty-sdk/define';

// The "many" side: each document belongs to one template.
export default defineField({
  universalIdentifier: DOCUMENT_TEMPLATE_FIELD_UNIVERSAL_IDENTIFIER,
  objectUniversalIdentifier: DOCUMENT_OBJECT_UNIVERSAL_IDENTIFIER,
  type: FieldType.RELATION,
  name: 'template',
  label: 'Template',
  relationTargetObjectMetadataUniversalIdentifier:
    DOCUMENT_TEMPLATE_OBJECT_UNIVERSAL_IDENTIFIER,
  relationTargetFieldMetadataUniversalIdentifier:
    TEMPLATE_DOCUMENTS_FIELD_UNIVERSAL_IDENTIFIER,
  universalSettings: {
    relationType: RelationType.MANY_TO_ONE,
    onDelete: OnDeleteAction.SET_NULL,
    joinColumnName: 'templateId',
  },
});
另一边(template-documents-relation.field.ts) 是一个名为documentsRelationType.ONE_TO_MANY 字段,它指出相反的方向。 完整模式请参阅 Relations

在 20 中查看

yarn 20dev 运行,打开 设置 -> 数据模型。 这两个对象都会出现,并带有你的应用标签。
显示文档和文档模板的数据模型设置
创建一个模板来测试 — 名称是 销售建议, 设置 TargetPerson, 并粘贴一个几个占位符的机构:
Dear {{name.firstName}} {{name.lastName}},

As {{jobTitle}} at {{company.name}}, we think you'll love our product.

Best,
The Team
带占位符主体的销售建议模板记录
在这个步骤之后: 你有 documentTemplatedocument 对象,用 的关系链接和一个模板生成它们。 接下来,填充它的逻辑。

下一步:生成文档 →

写下填充模板的逻辑函数。