我在Drupal中建立了一个在线社区,其首页类似于Facebook墙。您会看到25篇最新文章,在这些文章下面有两条最新评论。这些评论下方还有一个文本区域,以便您可以在特定帖子上快速发布新评论。
这些Facebook风格的帖子通过JavaScript内置了许多功能。单击帖子正下方的“查看所有评论”链接会进行AJAX调用,该调用将获取该帖子的所有评论并将其显示在其正下方。您还可以将帖子标记为有帮助的内容,例如问题的解决方案,内联编辑评论等。所有这些操作都需要AJAX请求,这意味着发出请求的JavaScript需要了解基本信息,例如Node ID(唯一帖子的标识符),评论ID(评论的唯一标识符)等。
我最初的实现是将这些基本数据散布在各个职位上,这使得编写需要查找的JS变得更加复杂。因此,我的第二个实现只是将所有这些数据输出到每个帖子的主包装元素中的JSON兼容字符串中。尽管这使JS更加轻松地找到所需的数据,但是将JSON作为字符串编写是很痛苦的(转义引号,没有换行符)。
因此,现在我有了第三个想法,我正在寻求实施之前的反馈。这个想法是为所有这些帖子创建一个单一的全局JS数组,其中包含包含每个帖子数据的对象。该数组中的每个元素将保存AJAX调用所需的必要数据。所以看起来像这样:
Facebook风格的帖子模板
<div class="post" data-postindex="<?php echo $post->index; ?>"> <!-- lots of other HTML for the post --> </div> <script type="text/javascript"> globalPostArray.push({ nid: <?php echo $post->nid; ?>, authorID: <?php $post->authorID; ?>, //etc. etc. etc. }); </script>
上面代码的结果是,当单击链接需要AJAX请求时,JS会简单地从该链接向上遍历DOM,直到找到主要.post元素为止。然后,它将获取的值,data- postindex以便知道其中的哪个元素globalPostArray保存了所需的数据。
.post
data- postindex
globalPostArray
有什么想法吗?我觉得必须有一些标准的,可接受的方法来完成这样的事情。
我从未听说过在PHP和Javascript之间“传递”信息的标准方法,因为它们分别是服务器端和客户端语言。我个人会使用第二种和第三种解决方案的混合体。
将帖子ID存储在data- postindex属性中(数据属性是新颖的,是存储少量数据的“正确”方法)。但是我仍然会使用JSON数组,因为在数据属性中存储大量数据(并转义它们!)可能存在问题。PHP具有一个json_encode可以处理所有转义的功能,$postdata就像您通常要做的那样- 只需像通常那样构建一个PHP数组(例如),然后将其放入您的post模板中即可:
json_encode
$postdata
<script type="text/javascript"> globalPostArray.push(<?php echo json_encode($postdata) ?>); </script>
哪里$postdata是像下面这样:
$postdata = array( 'nid' => 5, 'authorId' => 45 ...etc... );
从现有代码生成这样的数组应该足够容易。
我前不久写了一篇博客文章,介绍了我如何实现这种事情,但听起来您只需要指向json_encode的指针即可。