如何在没有工作流的情况下创建sitecore项目版本?
我在Sitecore中遇到了业务需求,对于一些项目,我们不需要附加工作流,但我们希望在锁定编辑项目时创建新版本 我无法应用以下设置,因为它将影响所有项目,并且我的工作流程将无效如何在没有工作流的情况下创建sitecore项目版本?,sitecore,sitecore-workflow,Sitecore,Sitecore Workflow,我在Sitecore中遇到了业务需求,对于一些项目,我们不需要附加工作流,但我们希望在锁定编辑项目时创建新版本 我无法应用以下设置,因为它将影响所有项目,并且我的工作流程将无效 我也经历过,它给出了下面的解决方案,但不确定应该是哪个事件 公共项目启动(项目) { 错误。AssertObject((对象)项,“项”); 如果(!Settings.RequireLockBeforeEditing | | Context.User.IsAdministrator) 退货项目; 如果(this.u
我也经历过,它给出了下面的解决方案,但不确定应该是哪个事件
公共项目启动(项目)
{
错误。AssertObject((对象)项,“项”);
如果(!Settings.RequireLockBeforeEditing | | Context.User.IsAdministrator)
退货项目;
如果(this.u context.IsAdministrator | | | StandardValuesManager.IsStandardValuesHolder(item)| |!this.HasWorkflow(item)&&!this.HasDefaultWorkflow(item)| |!this.IsApproved(item))
返回此。锁(项目);
Item obj=Item.Versions.AddVersion();
如果(obj!=null)
返回此.锁(obj);
其他的
返回(项目)为空;
}
尝试以下方法:
修补程序项目:已保存的事件:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<events>
<event name="item:saved">
<handler type="PersonalizationDemo.Data.Items.ItemEventHandler, PersonalizationDemo" method="OnItemSaved"/>
</event>
</events>
</sitecore>
</configuration>
自定义事件处理程序的实现类:
namespace PersonalizationDemo.Data.Items
{
using Sitecore.Data.Items;
using Sitecore.Events;
using System;
public class ItemEventHandler
{
protected void OnItemSaved(object sender, EventArgs args)
{
if (args == null) { return; }
var sitecoreEventArgs = args as SitecoreEventArgs;
if (sitecoreEventArgs == null) { return; }
if (sitecoreEventArgs.Parameters.Length < 2) { return; }
var item = sitecoreEventArgs.Parameters[0] as Item;
if (item == null) { return; }
if (!this.ShouldItemBeProcessed(item)) { return; }
var itemChanges = sitecoreEventArgs.Parameters[1] as ItemChanges;
if (itemChanges == null) { return; }
if (itemChanges.FieldChanges.Contains(Sitecore.FieldIDs.Lock))
{
var fieldChange = itemChanges.FieldChanges[Sitecore.FieldIDs.Lock];
if (fieldChange.Value == "<r />") { return; }
this.CreateNewVersion(item);
}
}
protected bool ShouldItemBeProcessed(Item item)
{
// TODO implement necessary check
return true;
}
protected void CreateNewVersion(Item item)
{
var newItem = item.Versions.AddVersion();
newItem.Editing.BeginEdit();
// update necessary field if you need that
newItem.Editing.EndEdit();
}
}
}
namespace PersonalizationDemo.Data.Items
{
使用Sitecore.Data.Items;
使用Sitecore.Events;
使用制度;
公共类ItemEventHandler
{
已保存的受保护的void(对象发送方、事件args args)
{
如果(args==null){return;}
var sitecoreEventArgs=作为sitecoreEventArgs的参数;
如果(sitecoreEventArgs==null){return;}
if(sitecoreEventArgs.Parameters.Length<2){return;}
var item=sitecoreEventArgs.Parameters[0]作为项;
如果(item==null){return;}
如果(!this.ShouldItemBeProcessed(item)){return;}
var itemChanges=sitecoreEventArgs.Parameters[1]作为itemChanges;
如果(itemChanges==null){return;}
if(itemChanges.FieldChanges.Contains(Sitecore.FieldIDs.Lock))
{
var fieldChange=itemChanges.FieldChanges[Sitecore.FieldIDs.Lock];
如果(fieldChange.Value==“”){return;}
此.CreateNewVersion(项目);
}
}
应处理受保护的bool(项目)
{
//TODO执行必要的检查
返回true;
}
受保护的无效CreateNewVersion(项)
{
var newItem=item.Versions.AddVersion();
newItem.Editing.BeginEdit();
//如果需要,请更新必要字段
newItem.Editing.EndEdit();
}
}
}
当所有编辑器开始编辑项目时,是否要强制他们使用项目的新版本?您可以查看“item:locked”事件,但仅使用ribbon>Versions>Add
按钮还不够吗?是的,我们希望在所有编辑器开始编辑某个项目时强制为其添加新版本的项目。不,我们不能使用功能区选项,因为编辑器不熟悉它。我将在item:locked事件上创建版本。我还检查了show.config,我看到了item:edit命令我们可以利用它吗?我不认为到处都调用item:edit
命令,例如,不确定experience editor?这是关于item saved的。我想在用户单击lock&editLock&Edit还更新项目时创建一个版本<代码>项目:保存的事件最有可能被调用。它看起来像是item:locked
event的一个很好的替代品。@SunilAher当您单击“编辑”按钮时,此代码正好工作。当您单击“编辑”按钮时,Sitecore将更改项目的“锁定”字段的值,并将其保存。上面的代码检查项目的Sitecore.FieldIDs.Lock字段中的更改,如果更改了,则会创建一个新版本。试试看,你会发现它是有效的。@AlekseyShevchenko谢谢你提供的详细信息。是的,当我单击“编辑和锁定”时,会调用保存的事件。你的解决方案给了我想要的东西……:)干杯