代码之家  ›  专栏  ›  技术社区  ›  Andrew

将Drupal批量API与服务一起使用

  •  2
  • Andrew  · 技术社区  · 16 年前

    我有一个Drupal应用程序需要发布它的一些内容——有一个FlashWysiwyg前端,通过服务模块与Drupal后端通信。 用户可以上传图像/视频,在Flash中放置和操作它们,完成后将导出静态版本。 作为导出过程的一部分,应用程序需要对媒体元素进行一些处理-重新缩放等,因此我使用了批处理API,因此它一次只处理元素以停止超时等。 这基本上是可行的,但正如batchapi的工作方式一样,我正在摆脱困境。 我想做的是:

    1. flash工具调用导出服务
    2. 导出服务创建一个表示此导出的节点,并返回一个节点\u id
    3. 导出服务在后台触发导出,一旦完成,它将更改节点中的状态。
    4. 同时,flash工具会对应用程序进行轮询,以查看发布完成的时间,并通知用户。

    目前看来,让我无法摆脱的是在后台启动批处理过程,而不触发批处理在调用时所做的重定向操作。 batch_process() ,以便我可以将节点ID返回到flash并同时启动批处理。

    希望这有意义-有什么建议/想法吗?还是我做错了?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Henrik Opel    16 年前

    不是100%确定(有一段时间没有使用批处理API),但我现在看到3个选项:

    1. 使用当前工作流并将批处理“init_message”设置为包含节点ID的内容:
      • 呼叫 batch_process() ,接受重定向。您的Flash应用程序需要遵循重定向,然后解析返回的页面,从显示的消息中提取节点ID。
      • 不过,听起来很难看,因为您必须解析标准的批初始化页面:/
    2. 忽略轮询,让flash工具等待结果:
      • 与选项1一样,您的flash工具将需要能够处理批处理发出的重定向-您将启动批处理,设置 $redirect_url 返回Flash应用程序所需结果的页面。
      • 你的flash应用程序遵循重定向,总是检查结果页面-一旦出现,它就会使用它。
      • 但不确定这将如何与服务模块匹配:/
    3. 拆分工作流中的初始化:
      1. Flash工具在“引导”URL上调用导出服务
      2. 导出服务创建节点并返回节点ID(此处未启动批处理!)
      3. flash工具检索节点ID并调用“进程”URL上的导出服务,传递节点ID
      4. 导出服务使用传递的节点ID启动实际的批处理(创建批处理并调用batch_process())
      5. …按照原始工作流(轮询等)继续

    最后一个版本似乎是最简单/最干净的版本,代价是启动整个过程的额外请求,这在您的场景中听起来是一个小问题。


    编辑:

    • 选项3的一个变化可能是让初始导出服务(创建节点的服务)通过 drupal_http_request() 在将节点ID返回到Flash应用程序之前。同样的基本思想(将初始请求分成一个创建节点的请求和另一个启动批处理的请求),但是从Flash应用程序的“视角”来看,它更加独立,因为它不需要通过两个单独的调用触发处理。