2013-03-05 4 views
13

XHR을 통해 프로그래밍 방식으로 실행해야하는 워크 플로를 CQ에서 만들었습니다.CQ5 프로그래밍 방식으로 워크 플로 실행

많은 분들께서 알 수 있듯이 CQ 문서는 (적어도이 시점에서는) 가장 크지 않습니다. 어떻게 프로그래밍 방식으로 실행할 수 있습니까?

+1

주에게 있습니다 : 여기

는 주석이있는 코드입니다. –

+0

지적 해 주셔서 감사합니다 :) – Woodifer

답변

16

잠시 파고 들자 나는 워크 플로우 모델을 실행하는 서블릿을 작성했습니다.

다음
@Component 
@Service 
@Properties({ 
    @Property(name = "sling.servlet.paths", value = "/bin/runmodel"), 
    @Property(name = "sling.servlet.methods", value = "GET") 
}) 
public class RunWorkflowModel extends SlingSafeMethodsServlet { 

    static private final Logger log = LoggerFactory.getLogger(RunWorkflowModel.class); 

    @Reference 
    private WorkflowService workflowService; 

    @Override 
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { 
     ResourceResolver resourceResolver = request.getResourceResolver(); 
     Session session = resourceResolver.adaptTo(Session.class); 

     /* Get Parameters 
     * @param path = path you want to run the workflow on 
     * @param model = workflow model name you want to run. Typically found in /etc/workflow/models 
     */ 
     RequestParameterMap params = request.getRequestParameterMap(); 
     String path = params.getValue("path").getString(); 
     String model = params.getValue("model").getString(); 

     // Create a workflow session 
     WorkflowSession wfSession = workflowService.getWorkflowSession(session); 
     try { 
      // Get the workflow model 
      WorkflowModel wfModel = wfSession.getModel(model);     
      // Get the workflow data 
      // The first param in the newWorkflowData method is the payloadType. Just a fancy name to let it know what type of workflow it is working with. 
      WorkflowData wfData = wfSession.newWorkflowData("JCR_PATH", path); 
      // Run the Workflow. 
      wfSession.startWorkflow(wfModel, wfData); 
     } catch (WorkflowException ex) { 
      response.getWriter().write("failed"); 
      log.error("Error starting workflow.", ex); 
     } 

     response.getWriter().write("success"); 
    } 
} 

이가 POST를 사용하여 서버의 상태를 변경으로 더 좋을 것이라고 Ajax 호출

CQ.Ext.Ajax.request({ 
    url: "/bin/runmodel", 
    method: "GET", 
    params : { 
     "path" : "/content/path to item you want the workflow run on", 
     "model" : "/etc/workflow/models/name of model/jcr:content/model" 
    }, 
    success: function() { 
     console.log("success"); 
    }, 
    failure: function(response) { 
     CQ.Notification.notifyFromResponse(response); 
    } 
});