我是否可以通过编程方式批准Sitecore中的内容项?
答案 0 :(得分:3)
以下是您可能想要做的事情。为每个站点设置一个复选框,允许管理员选择是否要使用等待批准。管理员只需选中跳过审批复选框(草稿批准)或不选中以保持工作流程(草稿> 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 = {XXXXXXXXXXXX-XXXXXXXX-XXXXXXXXXXXX}
谢谢,c
答案 1 :(得分:0)
这是一个博客(非常具有描述性),告诉您如何以编程方式更改项目的工作流程状态: http://www.cognifide.com/blogs/sitecore/changing-workflow-state-of-sitecore-items-programmatically/ 希望这有帮助!