0

我一直在尝试从另一个应用程序创建智能表单定义。该应用程序成功创建了智能表单,但我无法获取要填充的 FieldList、DisplayXSLT 或 Schema 字段。

这给我留下了一个空白的智能表单定义(不太理想)。

这是我必须执行该操作的代码。有任何想法吗?

// form is a simple POCO with values copied from an existing SmartForm Definition
var config = new SmartFormConfigurationData();

config.SmartformTitle = form.Name;            
config.SmartformDescription = form.Description;
config.XmlSchema = form.Schema;
config.PackageDisplayXslt = form.Xslt;
config.FieldList = form.FieldList;
config.Type = EkEnumeration.XmlConfigType.Content;

var api = new SmartFormConfigurationManager(ApiAccessMode.Admin);
api.RequestInformation.ServicesPath = this.EktronServiceHost;
api.RequestInformation.AuthenticationToken = this.GetAdminAuthToken();

api.Add(config);
4

1 回答 1

0

更新:

我收到了 Ektron 支持部门关于此问题的回复。它本身并不是一个“错误”......更多的是这个 API 类看起来与 ContentManager 非常相似但行为不一样的情况。我希望因为它看起来与 ContentManager 和许多其他类非常相似,所以我可以调用Add()它并且它会神奇地工作。事实证明,解决方案有点复杂。

添加智能表单是一个两步过程:首先Add(),然后Update()

Add 方法并未设置所有字段,实际上为在xml_collection_tbl.

真正的乐趣来自第 2 步。基本上,您从 SmartForm 的 HTML 开始——当您在“数据设计”视图中编辑智能表单定义并单击该<>按钮(“HTML”)时看到的内容编辑器的底部。您通过埋藏在 WorkArea 文件夹中的一大堆 XSLT 来运行它以构建缺失的字段,然后调用 update。这是对我有用的代码:

var sfManager = new SmartFormConfigurationManager();
var data = sfManager.GetItem(12);

if (data == null) return;

var sfcData = new SmartFormConfigurationData();
sfcData.Type = EkEnumeration.XmlConfigType.Content;
sfcData.SmartformTitle = "SmartForm12 copy";
sfcData.SmartformDescription = "SmartForm12 copy";
sfcData.XmlSchema = "";
sfcData.PackageDisplayXslt = data.PackageDisplayXslt;
sfcData.FieldList = data.FieldList;
        
sfcData = sfManager.Add(sfcData);

Response.Write("SmartForm added with id: " + sfcData.Id);

var design = System.IO.File.ReadAllText(Server.MapPath("~/NewsArticleSmartForm.html"));
var contentApi = new ContentAPI();

var schema = contentApi.TransformXsltPackage(design, Server.MapPath("~/WorkArea/ContentDesigner/DesignToSchema.xslt"), true);
var fieldList = contentApi.TransformXsltPackage(design, Server.MapPath("~/WorkArea/ContentDesigner/DesignToFieldList.xslt"), true);
var viewEntryXslt = contentApi.TransformXsltPackage(design, Server.MapPath("~/WorkArea/ContentDesigner/DesignToEntryXSLT.xslt"), true);

var xsltArgs = new XsltArgumentList();
xsltArgs.AddParam("srcPath", "", "/WorkArea/ContentDesigner/");

var viewXsltSource = string.Concat("<root>", design, "<ektdesignpackage_list>", fieldList, "</ektdesignpackage_list></root>");
var viewXslt = contentApi.XSLTransform(viewXsltSource, Server.MapPath("~/WorkArea/ContentDesigner/DesignToViewXSLT.xslt"), true, false, xsltArgs, false);
var initialDocument = contentApi.TransformXsltPackage(design, Server.MapPath("~/WorkArea/ContentDesigner/PresentationToData.xslt"), true);

var sbPackage = new StringBuilder("<ektdesignpackage_forms><ektdesignpackage_form><ektdesignpackage_designs><ektdesignpackage_design>");
sbPackage.Append(design);
sbPackage.Append("</ektdesignpackage_design></ektdesignpackage_designs><ektdesignpackage_schemas><ektdesignpackage_schema>");
sbPackage.Append(schema);
sbPackage.Append("</ektdesignpackage_schema></ektdesignpackage_schemas><ektdesignpackage_lists><ektdesignpackage_list>");
sbPackage.Append(fieldList);
sbPackage.Append("</ektdesignpackage_list></ektdesignpackage_lists><ektdesignpackage_views><ektdesignpackage_view>");
sbPackage.Append(viewEntryXslt);
sbPackage.Append("</ektdesignpackage_view><ektdesignpackage_view>");
sbPackage.Append(viewXslt);
sbPackage.Append("</ektdesignpackage_view></ektdesignpackage_views><ektdesignpackage_initialDocuments><ektdesignpackage_initialDocument>");
sbPackage.Append(initialDocument);
sbPackage.Append("</ektdesignpackage_initialDocument></ektdesignpackage_initialDocuments></ektdesignpackage_form></ektdesignpackage_forms>");

sfcData.PackageXslt = sbPackage.ToString();
sfcData.FieldList = fieldList;

var baseFilename = "SmartForm" + sfcData.Id;
var schemaFilename = "/" + baseFilename + "Schema.xsd";
var xsltFilename = "/" + baseFilename + "Xslt.xslt";

sfcData.XmlSchema = schemaFilename;  // The file will be prefixed with /XmlFiles
        
var unPackDisplayXslt = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:output method=\"xml\" version=\"1.0\" encoding=\"UTF-8\" indent=\"yes\"/><xsl:template match=\"/\"><xsl:choose><xsl:when test=\"ektdesignpackage_forms/ektdesignpackage_form[1]/ektdesignpackage_views/ektdesignpackage_view[2]\"><xsl:copy-of select=\"ektdesignpackage_forms/ektdesignpackage_form[1]/ektdesignpackage_views/ektdesignpackage_view[2]/node()\"/></xsl:when><xsl:otherwise><xsl:copy-of select=\"ektdesignpackage_forms/ektdesignpackage_form[1]/ektdesignpackage_views/ektdesignpackage_view[1]/node()\"/></xsl:otherwise></xsl:choose></xsl:template></xsl:stylesheet>";

var displayXslt = contentApi.TransformXsltPackage(sbPackage.ToString(), unPackDisplayXslt, false);
System.IO.File.WriteAllText(Server.MapPath("~/XmlFiles" + xsltFilename), displayXslt);

sfcData.Xslt1 = xsltFilename;  // The file will be prefixed with /XmlFiles
sfcData.DefaultXslt = 1;

sfManager.Update(sfcData);

我为我现有的智能表单提取了 HTML,并作为 NewsArticleSmartForm.html 保存在我网站的根目录中。这是我的文件的样子:

<p>Author:&#160;<input type="text" name="Author" id="Author" ektdesignns_caption="Author" ektdesignns_name="Author" title="Author" ektdesignns_indexed="false" ektdesignns_nodetype="element" size="24" class="design_textfield" /></p>
<p>&#160;</p>
<p>Article Summary:&#160;<textarea name="Summary" id="Summary" ektdesignns_caption="Summary" ektdesignns_name="Summary" title="Summary" ektdesignns_indexed="false" ektdesignns_nodetype="element" cols="40" rows="3" class="design_textfield"></textarea>
</p>
<p>&#160;</p>
<p>Article Body:</p>
<p>&#160;</p>
<ektdesignns_richarea id="Body" name="Body" ektdesignns_caption="Body" ektdesignns_name="Body" title="Body" ektdesignns_indexed="false" ektdesignns_nodetype="element">&#160;</ektdesignns_richarea>
<p>&#160;</p>

祝你好运!

原答案:

创建 SmartForm 配置的副本应该相当简单。该SmartFormConfigurationData对象上有一个Clone()方法,可以很容易地创建现有 SmartForm 的副本。我说“应该”是因为它不起作用。

我有一个答案全部打出来准备发布;我尝试了一些代码,它似乎可以工作。新的智能表单已列在工作区中,但是当我单击新的智能表单查看其详细信息时,我意识到出了点问题。

我尝试了以下代码:

var sfManager = new SmartFormConfigurationManager();
var config = sfManager.GetItem(7);

if (config == null) return;

var newSmartForm = config.Clone();
newSmartForm.SmartformTitle += " copy";

sfManager.Add(newSmartForm);

以下是原始智能表单的详细信息: 原始智能表单,属性选项卡 原始智能表单,显示信息选项卡

下面是新的 smartform 的样子——我用 frameworkAPI 创建的那个: api 生成的智能表单,属性选项卡 api 生成的 smartform,显示信息选项卡

我确实找到了一种成功创建现有智能表单副本的 API 方法:

var sfApi = new Ektron.Cms.ContentAPI();
var newId = sfApi.ReplicateXmlConfiguration(7, "copied sf title");

该方法的问题是智能表单必须存在于您的系统中,并且您只能更改标题。因此,我深入研究了数据库以查看发生了什么。事实证明,调用此ReplicateXmlConfiguration()方法后,两条数据库记录完全相同(除了预期的 LastUpdated 类型的字段)。

调用 ReplicateXmlConfiguration() 后的源和目标数据库记录

调用frameworkAPI的Update()方法后(调用时也一样Add()),“更新”的记录明显不同。

在框架 api 中调用 Update() 后的源和目标数据库记录

我认为我们这里有一个真正的错误。这发生在 v8.7 sp2 和 v9.0 sp1 中。我已经在 Ektron 支持下打开了一个案例,我会在收到回复后更新我的答案。当我过去与他们打交道时,他们总是非常敏感。

于 2013-10-30T14:14:15.913 回答