2012-08-03 2 views
1

시나리오 :코드에서 워크 플로를 실행하는 방법?

  • 사용자는 워크 플로우에서 명령을 클릭
  • 워크 플로 사용자 지정 작업 수표의 번호를 수행
  • 워크 플로 사용자 지정 작업 결과에 따라 같은 워크 플로우에 다른 명령을 실행

내가 지금까지 가지고있는 코드는 다음과 같습니다.

Database db = Factory.GetDatabase("master"); 
if (Request.QueryString["_id"] != null) 
{ 
    var itm = db.GetItem(new ID(Request.QueryString["_id"])); 
    WorkflowCommand[] availableCommands = wf.GetCommands(itm.Fields["__Workflow state"].Value); 
    wf.Execute(Request.QueryString["command"], itm, "Testing working flow new screens", false, new object[] { }); // Execute the workflow step. 
} 

그러나 wf.Execute 행에서 인스턴스 오류로 설정되지 않은 객체를 얻었습니다. - 그러나 의미있는 스택 추적 또는 아무 것도하지 않았습니다. (

나는 wf.GetCommands 행을 넣기 만하면 실제로 위치를 확인합니다. 나는 그것들을 기대하며, availableCommands은 존재하는 좋은 명령리스트로 채워진다.

commandId이 유효하고 존재하는지 확인했습니다.

Itm이 null이 아니며 워크 플로가 연결된 해당 워크 플로와 연결된 Content Item입니다 (컨텍스트에서 워크 플로를 실행해야 함).

사용자 컨텍스트 등이 유효하고 사용 권한 문제가 없는지 확인했습니다.

유일한 차이점은 sitecore 내에서 실행되는 .aspx 페이지에서이 코드를 실행하고 있다는 것입니다. 제대로 설정되지 않은 컨텍스트 항목이 없으면이 문제가 발생할 것으로 예상하지 않았을 것입니다 .

+0

aspx 페이지에서 실행 중이기 때문에 나타납니다. Context.ContentDatabase가 null이므로 GetWorkFlowState 호출이 실패합니다. 이제 그것을 정렬하는 방법 ... –

답변

4

ContentDatabase 워크 플로를 사용하는 SiteContext 내에서 워크 플로를 실행해야합니다. 사이트에서이 작업을 수행하는 가장 쉬운 방법은 SiteContextSwitcher을 사용하여 "셸"사이트로 변경하는 것입니다.

using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext("shell"))) 
{ 
    wf.Execute(Request.QueryString["command"], itm, "Testing working flow new screens", false, new object[] { }); // Execute the workflow step. 
} 

이 예제는 WeBlog Sitecore 모듈의 코드에서 찾을 수 있습니다.

http://svn.sitecore.net/WeBlog/Trunk/Website/Pipelines/CreateComment/WorkflowSubmit.cs

+1

Ahhhh, great answer! –

관련 문제