【发布时间】:2012-02-08 05:36:30
【问题描述】:
我是否可以通过编程方式批准 Sitecore 中的内容项?
【问题讨论】:
-
您的意思是批准工作流中的内容以移动到下一个状态?
我是否可以通过编程方式批准 Sitecore 中的内容项?
【问题讨论】:
这是您可能想要做的事情。为每个站点设置一个复选框,允许管理员选择是否要使用 Awaiting Approval。管理员只需选中一个复选框以跳过批准(草稿到批准)或不选中以维持工作流程(草稿>AA(批准或拒绝)>批准):
将此代码添加到您的 SkipAction 类中:
public class SkipAction
{
bool isSiteSettingsReached = false;
/// <summary>
/// This method facilitates grabbing of the skipapproval setting from setting>sectionsettings
/// </summary>
/// <param name="item"></param>
/// <param name="fieldId"></param>
/// <returns></returns>
protected bool GetSkipSetting(Item item, string fieldId)
{
bool result = false;
if (item.ID.Equals(null) || item.ID.Equals(ItemIDs.ContentRoot) || item.ID.Equals(ItemIDs.RootID))
{
result=false;
}
if (isSkipApprovalChecked(item, fieldId))
{
result = true;
}
if (!isSkipApprovalChecked(item, fieldId))
{
result = false;
}
if (!isSiteSettingsReached)
{
result=GetSkipSetting(item.Parent, fieldId);
}
return result;
}
/// <summary>
/// This method is initialized when skipaction is called
/// </summary>
/// <param name="args"></param>
public void Process(WorkflowPipelineArgs args)
{
var contentItem = args.DataItem;
var actionItem = args.ProcessorItem.InnerItem;
var parameters = WebUtil.ParseUrlParameters(actionItem["parameters"]);
var nextStateId = parameters["nextstateid"];
var skipFieldId = parameters["skipfieldid"];
if(nextStateId.IsNullOrEmpty() ||
skipFieldId.IsNullOrEmpty())
return;
bool skip = GetSkipSetting(contentItem, skipFieldId);
Sitecore.Data.Database web = Sitecore.Configuration.Factory.GetDatabase("web");
Sitecore.Data.Database production = Sitecore.Configuration.Factory.GetDatabase("production");
if (skip)
{
contentItem.PerformTransition(nextStateId, "auto skip");
using (new Sitecore.SecurityModel.SecurityDisabler())
{
publishTo(web, contentItem);
publishTo(production, contentItem);
}
contentItem.Locking.Unlock();
args.AbortPipeline();
}
}
/// <summary>
/// this method is used to publish to environ by param
/// </summary>
/// <param name="targetToPublish"></param>
/// <param name="item"></param>
private void publishTo(Sitecore.Data.Database targetToPublish, Item item)
{
Sitecore.Data.Database sourceDB = Sitecore.Configuration.Factory.GetDatabase("master");
//// set publish options
Sitecore.Publishing.PublishOptions myOptions = new Sitecore.Publishing.PublishOptions(
sourceDB,
targetToPublish,
Sitecore.Publishing.PublishMode.Smart,
item.Language,
DateTime.Now);
myOptions.RootItem = item;
myOptions.Deep = false;
Sitecore.Publishing.Publisher publisher = new Sitecore.Publishing.Publisher(myOptions);
Sitecore.Jobs.Job myPublishJob = publisher.PublishAsync();
myPublishJob.Start();
}
/// <summary>
/// This method check the actual skip approval field in settings>sectionsettings
/// </summary>
/// <param name="item"></param>
/// <param name="fieldId"></param>
/// <returns></returns>
public bool isSkipApprovalChecked(Sitecore.Data.Items.Item item, string fieldId)
{
if (item.HasChildren)
{
Sitecore.Data.Items.Item settingsItem = item.Axes.GetChild("Settings");
if (settingsItem == null)
{
return false;
}
else
{
isSiteSettingsReached = true;
Sitecore.Data.Items.Item sectionsettingsItem = settingsItem.Axes.GetChild("SectionSettings");
if (sectionsettingsItem.DisplayName == "SectionSettings" && sectionsettingsItem[fieldId] == "1")
{
return true;
}
else
{
return false;
}
}
}
return false;
}
}
}
返回到您的 SkipOver 操作,添加类似这样的参数(nextstateid = 批准状态 id,skipfieldid = 模板中 skipapproval 复选框的项目 id):
参数[共享]: nextstateid={D0F57FA8-F472-4332-89D9-E429CD111E50}&skipfieldid={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
谢谢,c
【讨论】:
这里有一个博客(描述性很强)告诉您如何以编程方式更改项目的工作流状态: http://www.cognifide.com/blogs/sitecore/changing-workflow-state-of-sitecore-items-programmatically/ 希望这会有所帮助!
【讨论】: