0

別のアプリケーションからスマート フォーム定義を作成しようとしています。アプリはスマート フォームを正常に作成しますが、入力する FieldList、DisplayXSLT、またはスキーマ フィールドを取得できません。

これにより、空白のスマートフォーム定義が残ります (理想的ではありません)。

アクションを実行するために必要なコードは次のとおりです。何か案は?

// 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()に 、次にの 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:&#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);

元のスマートフォームの詳細は次のとおりです。 元のスマートフォーム、プロパティ タブ オリジナルスマートフォーム、表示情報タブ

新しいスマートフォームは次のようになります。フレームワーク API を使用して作成したものです。 API 生成のスマートフォーム、[プロパティ] タブ API生成のスマートフォーム、表示情報タブ

既存のスマートフォームのコピーを正常に作成する API メソッドを 1 つ見つけました。

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

この方法の問題点は、スマートフォームがシステムに存在している必要があり、タイトルしか変更できないことです。そこで、データベースを掘り下げて、何が起こっているのかを調べました。このReplicateXmlConfiguration()メソッドを呼び出した後、2 つのデータベース レコードが同一であることがわかります (予想される LastUpdated タイプのフィールドを除いて)。

ReplicateXmlConfiguration() を呼び出した後のソースおよびターゲット データベース レコード

FrameworkAPI のUpdate()メソッドを呼び出した後 (を呼び出す場合も同様Add())、「更新された」レコードは明らかに異なります。

フレームワーク API で Update() を呼び出した後のソースおよびターゲット データベース レコード

ここに本物のバグがあると思います。これは、v8.7 sp2 と v9.0 sp1 の両方で発生します。Ektron サポートでケースをオープンしました。返信があり次第、回答を更新します。以前、お世話になった時もとても丁寧に対応してくださいました。

于 2013-10-30T14:14:15.913 に答える