2013-03-05 3 views
13

Я создал рабочий процесс в CQ, который необходимо запускать программно через XHR.CQ5 Программный запуск рабочего процесса

Как многие из вас могут знать, документация CQ не самая большая (по крайней мере, для этого момента). Как я могу запустить его программно?

+1

Обратите внимание, что, как это изменяет состояние сервера, с помощью POST будет лучше. –

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

Вот это вызов 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); 
    } 
}); 
Смежные вопросы