2013-03-05 83 views
13

我在CQ中创建了一个需要通过XHR以编程方式运行的工作流程。CQ5以编程方式运行工作流程

许多人可能知道,CQ文档不是最好的(至少在这一点上)。我如何以编程方式运行它?

+1

需要注意的是,因为这改变了服务器的状态,使用POST会更好。 – 2013-03-07 08:14:08

+0

感谢您指出:) – Woodifer 2013-03-07 22:22:33

回答

16

经过一段时间,我写了一个运行工作流模型的servlet。

下面是评论代码:

@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"); 
    } 
} 

这里是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); 
    } 
});