Kentico 9 - 以编程方式将内容添加到可编辑图像区域(CMS 可编辑图像)

Kentico 9 - Add content to an Editable Image Region (CMSEditableImage) programatically

我们正在寻找有关如何将内容添加到 Editable Image programatically (with the Kentico C# API). Essentially, the equivalent of this Editable Region article 可编辑图像的信息。

有什么建议吗?

谢谢,
维克多

参考文献:

您可以克隆 editableimage web 部件,然后在预渲染中工作,或者更改 GetContent() 方法的覆盖并添加您自己的字符串部分,或者进行字符串替换并添加您的代码。

您想添加到可编辑图像中的是什么? - 图片路径?!不确定你为什么要这样做,但我会采取另一个方向:我会向页面类型添加一个字段,这使得通过 API 更容易使用。将此字段设置为 API 应该很容易将其显示在页面上......例如放置可编辑图像并使用宏获取字段值。

使用

node.DocumentContent.EditableWebParts

node.DocumentContent.EditableRegions

以编程方式更新可编辑内容的集合。

可在 \CMS\CMSModules\Content\CMSDesk\Properties\Advanced\EditableContent\Main.aspx.cs

处找到最佳代码示例

是Pages->General->Advanced->Edit regions & web parts下的对话框

你一定可以

每个单独的可编辑 cms 页面控件都存储在文档的 DocumentContent 字段中,可以使用索引器字段进行访问。例如:

TreeNode document = DocumentContext.CurrentDocument;
string editableImageControlId = "EditableImage1";

// get the field value
string editableImageContent = document.DocumentContent.EditableRegions[editableImageControlId];

// set it to something new
document.DocumentContent.EditableRegions[editableImageControlId] = newValue;

然而

如果您查看数据库 CMS_Document 中的 DocumentContent 字段,您会发现所有内容都是 XML。那是因为每个控件都被序列化为 XML 然后嵌套在这个字段中。因此,在这种情况下,editableImageContent 变量的值是一个 XML 字符串:

<image>
    <property name="imagepath">
        ~/Folder/ImageName.png
    </property>
</image>

我不建议尝试直接修改它,因为不知道 Kentico 是否会更改此代码,或者单个控件是否会更改其序列化输出。

但如果你真的必须

您有几个选择:

1. Per @josh,您可以创建一个新控件来包装现有控件并执行一些方法覆盖魔术,以便该控件继续代表您进行序列化你只需在事后修改它。但是,这需要控件当前正在加载。

2. 您可以对野兽进行硬编码,并在它发生变化(很可能会发生变化)时对其进行处理。尝试:

// get the node from wherever you need to get the node
TreeNode document = DocumentHelper.GetDocuments().TopN(1).FirstObject;
var relativeMediaFilePath = "~/NewImage.png";
var xmlImage = string.Format("<image><property name=\"imagepath\">{0}</property></image>", relativeMediaFilePath);
var cmsControlId = "editableImage1";

if (document.DocumentContent.EditableRegions.ContainsKey(cmsControlId)) {
    document.DocumentContent.EditableRegions[cmsControlId] = xmlImage;
}
else {
    document.DocumentContent.EditableRegions.Add(cmsControlId, xmlImage);
}

// a little hack to get this field to be indicated as updated
document.SetValue("DocumentContent", document.DocumentContent.GetContentXml());
document.Update(true);