如何将数组作为属性传递给模板,然后使用该数组,然后递归使用模板?

时间:2019-02-05 03:45:38

标签: recursion coldfusion cfml

在使用JSP几年之后,我已经与ColdFusion CFML一起工作了几个月,但在使用这种语言弄清楚某些方面还是有一些困难。 Google,CFDocs和Adobe在这个特定问题上没有帮助。

我正在构建一个功能,以在文章下方显示评论,评论中还可以包含子评论。我已导入所有数据,看起来很棒。我正在使用一个返回结构数组的查询,它获取文章的每个第一级注释,然后循环遍历该数组,并将结构数组附加到每个具有子结构的注释结构上。

我已经编写了一个模板来循环浏览并显示第一级评论的列表,但是我希望它对具有子评论的每个评论进行递归调用,直到它显示了每个评论的所有子评论为止。我认为最好的方法是让模板在将子注释数组传递给模板时调用自身。

我已经阅读了几篇文章,这些文章解释了如何创建CFModule,但是没有一篇文章说明如何实际使用传递给它的属性。这是我尝试过的事情之一:

(在原始模板中):

<h4>Comments</h4>
<div id="comments" name="comments">
  <cfmodule template="comments.cfm" comments="#Variables.page.comments#">
</div>

(在我最终要递归调用的模板中):

<cfoutput>
  <cfloop array = "#comments#" index = "comment">
    <div>#comment.commenter_name# says</div>
    <div>#comment.created#</div>
    <div>#comment.content#</div>
  </cfloop>
</cfoutput>

我不能只在第二个模板中使用Variables.page.comments,因为该模板将递归调用它自己;例如,下一次我要在Variables.page.comments[2].comments处数组,下一次要在Variables.page.comments[2].comments[5].comments处数组,等等

1 个答案:

答案 0 :(得分:0)

您可以通过将渲染逻辑包装在

周围来生成分层视图
<cfscript>
    cfsavecontent variable="html" {
       do logic stuff here
    }
    writeOutput(html);
<cfscript>

它将把您的输出存储到一个变量中。然后输出变量。

您还可以编写一个递归函数来执行此操作,然后仅输出返回的字符串,如下所示。您可能需要添加一些限制逻辑,以免一次输出整个讨论,具体取决于讨论的大小。

string function outputComments (
    required array comments) {
    var html = "";
    for (var comment in arguments.comments) {
        html &= "<li>#comment.message#";
        if (comment.children.length) {
            html &= outputComments(comment.children);
        }
        html &= "</li>";
    }
    if (html != "") {
        html = "<ul>#html#</ul>";
    }
    return html;
}

writeOutput(outputComments(comments));

已经完成了很多此类工作,您可能需要考虑使用一种以JSON返回注释数据的服务来呈现某种JavaScript ajax驱动的小部件中的注释/回复,从而获得注释页面。或一次回复。我写了一个以这种方式工作的Facebook风格的注释小部件,优点是您不必担心对话的大小。