C# 通过API创建Ektron智能表单定义

C# 通过API创建Ektron智能表单定义,c#,api,ektron,C#,Api,Ektron,我一直在尝试从另一个应用程序创建智能表单定义。应用程序成功地创建了智能表单,但我无法获取要填充的FieldList、DisplayXSLT或Schema字段 这给我留下了一个空白的智能表单定义(不太理想) 这是我必须执行操作的代码。有什么想法吗 // form is a simple POCO with values copied from an existing SmartForm Definition var config = new SmartFormConfigurationData()

我一直在尝试从另一个应用程序创建智能表单定义。应用程序成功地创建了智能表单,但我无法获取要填充的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);
更新: 我听到Ektron在这个问题上的支持。它本身并不是一个“bug”。。。这更像是一个API类的例子,看起来与ContentManager非常相似,但行为却与之不同。我希望,由于它看起来与ContentManager和许多其他类非常相似,因此我能够调用
Add()
,它将神奇地工作。事实证明,解决方案要复杂一点

添加智能表单需要两个步骤:首先
Add()
,然后
Update()

Add方法并没有设置所有字段,事实上,对于在
xml\u collection\u tbl
中创建条目的存储过程中的一些参数,Add方法会传递NULL

真正的乐趣来自第二步。基本上,您从SmartForm的HTML开始——当您在“数据设计”视图中编辑smart form定义时看到的内容,然后单击编辑器底部的
按钮(“HTML”)。您可以通过隐藏在WorkArea文件夹中的一大堆XSLT来构建缺少的字段,然后调用update。以下是对我有效的代码:

var sfManager=新的SmartFormConfigurationManager();
var data=sfManager.GetItem(12);
if(data==null)返回;
var sfcData=新的SmartFormConfigurationData();
sfcData.Type=EkEnumeration.XmlConfigType.Content;
sfcData.SmartformTitle=“SmartForm12副本”;
sfcData.SmartformDescription=“SmartForm12 copy”;
sfcData.XmlSchema=“”;
sfcData.PackageDisplayXslt=data.PackageDisplayXslt;
sfcData.FieldList=data.FieldList;
sfcData=sfManager.Add(sfcData);
响应.写入(“添加id的智能表单:+sfcData.id”);
var design=System.IO.File.ReadAllText(Server.MapPath(“~/newsactionsmartform.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();
AddParam(“srcPath”,“”,“/WorkArea/ContentDesigner/”;
var viewXsltSource=string.Concat(“,design,”,fieldList,”);
var viewXslt=contentApi.XSLTransform(viewXsltSource,Server.MapPath(“~/WorkArea/ContentDesigner/DesignToViewXSLT.xslt”)、true、false、xsltArgs、false;
var initialDocument=contentApi.TransformXsltPackage(design,Server.MapPath(“~/WorkArea/ContentDesigner/presentationdata.xslt”),true);
var sbPackage=新的StringBuilder(“”);
sbPackage.Append(设计);
sbPackage.Append(“”);
sbPackage.Append(schema);
sbPackage.Append(“”);
sbPackage.Append(字段列表);
sbPackage.Append(“”);
sbPackage.Append(viewEntryXslt);
sbPackage.Append(“”);
sbPackage.Append(viewXslt);
sbPackage.Append(“”);
sbPackage.Append(初始文件);
sbPackage.Append(“”);
sfcData.PackageXslt=sbPackage.ToString();
sfcData.FieldList=字段列表;
var baseFilename=“SmartForm”+sfcData.Id;
var schemaFilename=“/”+baseFilename+“Schema.xsd”;
var xsltFilename=“/”+baseFilename+“Xslt.Xslt”;
sfcData.XmlSchema=schemaFilename;//该文件将以/XmlFiles作为前缀
var-xslt=“”;
var displayXslt=contentApi.TransformXsltPackage(sbPackage.ToString(),unpackagedisplayxslt,false);
System.IO.File.writealText(Server.MapPath(“~/XmlFiles”+xsltFilename),displayXslt);
sfcData.Xslt1=xsltFilename;//该文件将以/XmlFiles作为前缀
sfcData.DefaultXslt=1;
sfManager.Update(SFC数据);
我提取了现有智能表单的HTML,并将其保存在网站的根目录中,名为NewsArticleSmartForm.HTML。以下是我的文件的外观:

作者: 

 

文章摘要: ;

 

第条正文:

 

   

祝你好运

原始答复: 创建SmartForm配置的副本应该非常简单。
SmartFormConfigurationData
对象上有一个
Clone()
方法,可以轻松创建现有SmartForm的副本。我说“应该”是因为它不起作用

我已经把答案打印出来准备发布;我尝试了一些代码,它似乎工作。新的smartform列在工作区中,但当我单击新的smartform查看其详细信息时,我意识到出了问题

我尝试了以下代码:

var sfManager=新的SmartFormConfigurationManager();
var config=sfManager.GetItem(7);
if(config==null)返回;
var newSmartForm=config.Clone();
newSmartForm.SmartformTitle+=“复制”;
sfManager.Add(newSmartForm);
以下是原始smartform的详细信息:

下面是新的smartform的外观——我用frameworkAPI创建的smartform:

我确实找到了一个API方法,它成功地创建了现有smartform的副本:

var sfApi=new Ektron.Cms.ContentAPI();
var newId=sfApi.ReplicateXmlConfiguration(7,“复制的sf标题”);
该方法的问题是smartform必须存在于您的系统中,并且您只能更改标题。所以,我去挖掘数据库,看看发生了什么。事实证明,在调用这个
ReplicateXmlConfiguration()
方法之后,这两个数据库记录是相同的(除了预期的LastUpdated类型的字段)

卡尔之后