アップデート:
この問題について Ektron サポートから連絡がありました。それ自体はそれほど「バグ」ではありません...それは、この API クラスが ContentManager に非常に似ているが、そのように動作しないというケースです。ContentManager や他の多くのクラスと非常によく似ているため、呼び出すことができ、Add()
魔法のように機能するだろうと期待していました。解決策はもう少し複雑であることがわかりました。
スマートフォームの追加は、最初Add()
に 、次にの 2 段階のプロセスですUpdate()
。
Add メソッドは、すべてのフィールドを設定するわけではなく、実際には、 でエントリを作成するストアド プロシージャのいくつかのパラメータに NULL を渡します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: <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> </p>
<p>Article Summary: <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> </p>
<p>Article Body:</p>
<p> </p>
<ektdesignns_richarea id="Body" name="Body" ektdesignns_caption="Body" ektdesignns_name="Body" title="Body" ektdesignns_indexed="false" ektdesignns_nodetype="element"> </ektdesignns_richarea>
<p> </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);
元のスマートフォームの詳細は次のとおりです。
新しいスマートフォームは次のようになります。フレームワーク API を使用して作成したものです。
既存のスマートフォームのコピーを正常に作成する API メソッドを 1 つ見つけました。
var sfApi = new Ektron.Cms.ContentAPI();
var newId = sfApi.ReplicateXmlConfiguration(7, "copied sf title");
この方法の問題点は、スマートフォームがシステムに存在している必要があり、タイトルしか変更できないことです。そこで、データベースを掘り下げて、何が起こっているのかを調べました。このReplicateXmlConfiguration()
メソッドを呼び出した後、2 つのデータベース レコードが同一であることがわかります (予想される LastUpdated タイプのフィールドを除いて)。
FrameworkAPI のUpdate()
メソッドを呼び出した後 (を呼び出す場合も同様Add()
)、「更新された」レコードは明らかに異なります。
ここに本物のバグがあると思います。これは、v8.7 sp2 と v9.0 sp1 の両方で発生します。Ektron サポートでケースをオープンしました。返信があり次第、回答を更新します。以前、お世話になった時もとても丁寧に対応してくださいました。