我正在编写"Save"命令的扩展,基本上我想验证某些字段并提供一个弹出窗口,允许编辑器根据当前日期,Release#和其他一些属性选择给定的关键字或其他值.
我以为我做得很好,直到我终于弄清楚$display.getItem()
是返回存储在CM中的项目,而不是编辑器可能已更改的当前值.
有没有内置的方法来获取这些信息?或者我需要解析DOM来解决它?
这是我目前的代码
var item = $display.getItem();
if (item.getItemType() == "tcm:16") {
if (item.getSchema().getStaticTitle() == "Test Schema") {
var content = $xml.getNewXmlDocument(item.getContent());
var fieldXml = $xml.getInnerText(content, "//*[local-name()='NewField']");
alert(fieldXml);
}
}
Run Code Online (Sandbox Code Playgroud)
它的工作-我得到"新野"的价值-但这是项的值了,当它被加载,而不是当前值.
有趣的是,item.getTitle()
显示了Title字段的当前值,所以我希望有一种方法可以实现自定义字段.
我们正在使用SDL Tridion 2009 SP1.我们已经实现了一项新功能,即CMS中的扩展程序,它允许我们锁定页面.如果页面被锁定,则无法再发布(锁定页面的信息保存在为此扩展创建的数据库中).
我们想要添加一个新图标,该图标将通知用户页面的新状态.
现在有4个图标组合(没有动作,检查,发布,检查和发布)
由于我没有CMS接口的长期经验,我想找到一些帮助,找到一个对性能没有影响的解决方案,并且在不进行大量修改方面很容易实现.
以下是我对此的调查:
我注意到cms中图标的渲染方式并不是一个易于更新的简单机制.每次我们点击CMS左侧的项目时,为了从右侧呈现列表,对WebGUIResponder.aspx进行ajax调用(带有xml请求).页.
我们将得到的响应是一个包含属性字段Icon的xml
<tcm:ListItems xmlns:tcm="http://www.tridion.com/ContentManager/5.0"
ID="tcm:yyy-zzzz-4" Managed="68" ItemType="4">
<tcm:Item ID="tcm:yyy-zzzzz-64" Type="64" Title="NotificationTest"
Modified="2011-05-09T09:42:27" FromPub="400 YYYY Website Master (EN-GB)"
IsNew="false" Icon="T64L0P1"/>
</tcm:ListItems>
Run Code Online (Sandbox Code Playgroud)
基于此字段图标属性(Icon ="T64L0P1),图像名称开始被处理.
对于这样的字段,图像名称结果将是= T64.16x16.List.Published.gif
我找不到通过页面xml更新此字段的方法,不是保存在xml中的信息,而是在xml请求时在dll中构建.(某处基于已发布的其他字段以及其他此类图标字段的计算.)
因此,如果无法修改此字段,我们可能选择的选项是:为了在CMS中集成我们的更改而不修改其.dll(这与SDL Trdion的新版本的兼容性不好修改dlll)并且没有改变太多我正在考虑这种方法的逻辑.
我们可以对新页面WebGUICheckPageLocked.aspx进行新的Ajax调用(需要测试对性能有什么影响).在此页面后面的代码中,我们可以确定页面是否被锁定(使用我们的内部函数来确定页面是否已锁定,此功能是否已经完成).在页面中,我们将图标字段更改为T64L0P1E01(添加一些额外信息,以便我们确定页面的新状态).我们还将修改在GetPNGIconName javascript函数中,我们可以考虑新信息E01进行额外检查...)
如果有人对此有更好的想法,也许这是可以轻松完成的事情,也许这是我们可以更新Icon字段的方式.
亲切的问候,克里斯蒂娜
当您为CME列表创建数据扩展器时 - 例如,为此示例添加Schema的列- 只要您执行强制List重新加载的操作,它就可以正常工作.
但是,某些操作不会强制列表重新加载(例如编辑文件夹中的组件,然后保存和关闭),看起来Anguilla正在加载使用不同机制加载的项目的数据,该机制仅加载数据有问题的项目(这是有道理的).
如果我希望我的扩展列表视图行为正常,并且每当给定项目更改时(而不是仅在重新加载列表视图时)还加载我的附加属性,我还需要做什么?
我写了一个类来帮助使用核心服务向目标添加和删除目标.目标通常通过核心服务公开为一个字符串(带有XML内容),所以我写了我自己的包装器,等等.
我现在有一种情况需要更新2个发布目标,并认为使用事务范围确保两个目标同时更新会很酷.
然而,我正在努力实现这一点.
代码工作(使用标准CoreService WCF客户端):
TransactionOptions txOptions = new TransactionOptions
{ IsolationLevel = IsolationLevel.ReadCommitted };
using(TransactionScope scope = new TransactionScope(
TransactionScopeOption.Required, txOptions))
{
PublicationTargetData publicationTarget1 = (PublicationTargetData)client.Read("tcm:0-1-65537", readOptions);
PublicationTargetData publicationTarget2 = (PublicationTargetData)client.Read("tcm:0-2-65537", readOptions);
publicationTarget1.TargetLanguage = "JSP";
publicationTarget2.TargetLanguage = "JSP";
client.Save(publicationTarget1, readOptions);
client.Save(publicationTarget2, readOptions);
// Stop saving
scope.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
执行此代码将成功回滚我所做的更改(如果我之前中断scope.Dispose()
并检查Tridion中的发布目标,它成功更改目标,然后"撤消"更改).
如果我现在也尝试在交易中使用我的"扩展出版物目标"类,我无法处理它.
TransactionOptions options = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
{
ExtendedPublicationTarget target1 = new ExtendedPublicationTarget("tcm:0-1-65537");
ExtendedPublicationTarget target2 = new ExtendedPublicationTarget("tcm:0-2-65537"); …
Run Code Online (Sandbox Code Playgroud) 我得到异常= {"无法找到uuid:5708986b-390f-4728-b0c7-b49bd3d8f407:元数据."}
schemaId = UpdatePubId(schemaId, containerId);
SchemaData schemaData = (SchemaData)client.Read(schemaId, null);
string xml = string.Format("<{0} xmlns=\"{1}\">{2}</{0}>", schemaData.RootElementName, schemaData.NamespaceUri, fields);
ComponentData componentData = new ComponentData
{
Content = xml,
ComponentType = ComponentType.Normal,
Title = title,
Schema = new LinkToSchemaData { IdRef = schemaId },
LocationInfo = new LocationInfo { OrganizationalItem = new LinkToOrganizationalItemData { IdRef = containerId } },
Id = "tcm:0-0-0",
MetadataSchema = schemaData.MetadataSchema,
Metadata = schemaData.Metadata
};
try
{
componentData = client.Save(componentData, new ReadOptions()) as ComponentData;
componentData = client.CheckIn(componentData.Id, …
Run Code Online (Sandbox Code Playgroud) 在Tridion 2011 SP1中,我试图实现一个事件,只要编辑器按下Save&Close(但不保存),它就会自动发布项目.
在正常情况下,这可以在CheckIn事件中处理,但由于此项可能在工作流中,因此没有CheckIn事件.
在COM Events中,我们有一个标志(doneEditing)告诉我们编辑器是否按下了save&close vs Save.我似乎无法在TOM.NET Events中找到类似的选项.
供参考 - 这是迄今为止的代码:
[TcmExtension("Publish to Wip Events")]
public class PublishToWip : TcmExtension
{
public PublishToWip()
{
EventSystem.SubscribeAsync<VersionedItem, SaveEventArgs>(PublishItemToWip, EventPhases.TransactionCommitted);
}
private void PublishItemToWip(VersionedItem item, SaveEventArgs args, EventPhases phases)
{
// Magic goes here
}
}
Run Code Online (Sandbox Code Playgroud)
我查看了SaveEventArgs的选项,但没有找到任何可以提供这些信息的内容.有小费吗?
我有一个模态弹出窗口,只要编辑器尝试使用某些值保存组件(在这种情况下是过去的日期字段).
在这个弹出窗口中,我向编辑器显示了几个选项(非常类似于默认的"Open Shared Item"对话框)和一个OK/Cancel按钮组合.在取消时我触发"取消"事件,编辑器返回编辑屏幕,这里一切都很好.在"确定"上,我想更改字段的值以匹配编辑器选择的任何内容,然后保存.
我尝试使用FieldBuilder的方法和Boris在其他主题中提到的示例, 但我无法从弹出对话框中找到该字段.
关于如何从模态弹出窗口中修改项目的xml(也可能是页面)的任何建议?
编辑:getControlForFieldName中使用的代码
function getControlForFieldName(name) {
var fieldBuilder = $display.getView().properties.controls.fieldBuilder;
var fieldsContainer = fieldBuilder.properties.input;
var fieldsNode = fieldsContainer.getElement();
var fieldContainer = $dom.getFirstElementChild(fieldsNode);
while (fieldContainer) {
var labelNode = $dom.getFirstElementChild(fieldContainer);
var fieldNode = $dom.getNextElementSibling(labelNode);
var control = fieldNode.control;
if (control.getFieldName() == name) {
return control;
}
fieldContainer = $dom.getNextElementSibling(fieldContainer);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑#2
在Frank的建议之后,以及Jaime&Frank离线的一些帮助,我得到了如下工作:
$evt.addEventHandler(p.dialogPopup, "submit",
this.getDelegate(this._onPopupSubmit));
Run Code Online (Sandbox Code Playgroud)
在我的弹出窗口中,我将所选项(它是关键字ID)传递给事件处理程序:
this.fireEvent("submit", { id: select.options[select.selectedIndex].value });
Run Code Online (Sandbox Code Playgroud)
现在回到事件处理程序中_onPopupSubmit(e)
我刚读取e.data.id,加载此关键字,获取ID和Title等属性,并使用item.setMetadata("具有更新值的新元数据")更新项目的元数据.
简单:)
我对Tridion核心服务很陌生,所以这可能是一个简单的问题.我希望通过传递发布ID来获取所有元数据模式.如果有人做过这个,请回复.
提前致谢
我正在为一些懒惰的程序员实现一个核心服务"Facade",这些程序员不想改变他们的编码风格(包括我),并希望实现对象缓存,这显然会导致"多长时间和多少"这个大问题我应该缓存".
理想的答案是永远缓存,除非数据发生变化.
有没有办法(通过一些WCF事件)为数据更改实现一个"监听器",可用于从缓存中删除项目?
顺便说一句,我现在正在使用.NET的本机ObjectCache(MemoryCache)和1分钟的滑动缓存策略.
谢谢,
ñ
我们的图像文件名为" Tim%20Butler%20Trading.jpg ".该图像作为主要组件的"图像"字段中的组件链接链接.在C#DLL中,我们读取此"图像"字段并形成图像标记,如下所示:
"<img " + style + " src=\"" + imageID + "\" />"
Run Code Online (Sandbox Code Playgroud)
其中style是属性名称(如果有),imageID是多媒体组件的tcm id.
输出字符串使用图像,标题和组件中的一些其他字段值形成.此输出被推入包中以在dwt中访问它.传递给dwt的输出字符串的contentType是"HTML".
我们使用DefaultFinishActions发布图像.此图像将作为Tim%20Butler%20Trading34-13565.jpg部署在演示服务器上,但未在演示方面得到解决.
在页面源图像标签形成如下:
<img src="/images/Tim%2520Butler%2520Trading34-13565.jpg" class="img" />
Run Code Online (Sandbox Code Playgroud)
我们认为,DWT被转换%图像文件名%25,当图像被公布.
有人能告诉我如何解决这个问题吗?