使用自定义Drupal模块中的现有comment.tpl.php列出节点注释

时间:2012-01-04 10:49:33

标签: comments drupal-7 drupal-modules

我创建了一个模块,用于从用户指定为“收藏夹”的节点获取注释。因此,我不是要尝试输出所有节点的所有注释,例如最近的注释块,而只是输出来自指定为“收藏夹”的节点的注释。

查询全部工作,我通过打印来自不同对象的值来测试它。所以我已经为每个注释和相应的节点对象获得了整个注释对象。我已经能够创建cid,nid,评论文本等的列表,并用

输出
$block['content'] = theme('item_list', array('items' => $items));

但是我如何在我的模块中以与节点页面相同的布局/设计渲染注释对象?我的节点页面上的注释是使用我自己的布局/设计设置的comment.tpl.php文件呈现的,我希望我的模块以相同的方式呈现这些注释。

所以这是我的hook_block_view()实现,我认为这是从模块输出的正确方法:

function jf_comment_feed_block_view($delta = '') {
switch($delta){
    case 'jf_comment_feed':
        $block['subject'] = t('Comment feed');
        if(user_access('access content')){
            // Get users favourite locations
            $loc_result = jf_comment_feed_locations();

            $fav_loc = array();
            foreach ($loc_result as $loc) {
                $fav_loc[] = array(
                    'data' => $loc->nid,
                );
            }

            if (empty($fav_loc)) { //No content in the last week.
                $block['content'] = t('No favourite locations added.
                    To see what goes on at your favourite locations add locations to 
                    +My Locations and the posts from those locations will show here.');  
            } else {
                //Use our custom function to retrieve data.
                $result = jf_comment_feed_contents($fav_loc);

                // ############################################
                // Here I need to create my output... I think...

                // Previously I rendered my results from the query
                // by using this code (this prints the comment id):
                // $items = array();
                // foreach ($result as $comment){
                //   $items[] = array(
                //     'data' => comment_load($comment->cid),
                //   );
                // }
                // ############################################

                if (empty($items)) { //No content in the last week.
                    $block['content'] = t('No posts from last week.');  
                } else {
                    // This is the code used to render the 
                    // comment id to the block: 
                    // $block['content'] = theme('item_list', array('items' => $items));
                }
            }
        }
}
return $block;
}

我也尝试过:

$block['content'] = theme('comment_view', $mycomment, $mynode);
$block['content'] = theme('comment', $mycomment, $mynode);

其中$ mycomment是注释对象,$ mynode是节点对象。但这打破了网页。

当然,我必须在这里找到一行代码,但我现在花了两天时间用Google搜索并没有运气......所以感谢您对此的任何帮助。

修改 @Clive确实触发了一些想法,我尝试根据节点页面上的数组样子创建自己的数组。我使用Devel Themer信息模块获得了数组的结构和名称。

这个数组输出了评论创建者用户图片和日期,但我在我的评论中添加了一个自定义字段field_jf_comment,虽然我可以在Devel中看到数组中的信息。我没有使用标准的开箱即用评论字段,因为我想要一个文本字段而不是可扩展的textarea用于输入。设计决定。

现在显然这并不理想,因为我手动设置了大部分值。这适用于我当前的项目,但如果模块更通用,那么它会很酷,所以其他人也可以使用它。当我点击我的节点页面上的单个注释与Devel Themer信息时,我得到一个数组,其中包含元素,用户对象和数组项,如db_is_active,is_admin等。如果我能以某种方式重新创建这个数组,然后将这个数组设置为$ block ['content'],我相信这会有效。

这是数组的实现:

foreach ($result as $comment) {
  $items[] = array(
    '#entity_type' => 'comment',
    '#bundle' => 'comment_node_location',
    '#theme' => 'comment__node_location',
    '#comment' => comment_load($comment->cid, FALSE),
    '#node' => node_load($comment->nid),
    '#view_mode' => 'full',
    'field_jf_comment' => array(
      '#theme' => 'field',
      '#title' => 'Title',
      '#access' => TRUE,
      '#label_display' => 'above',
      '#view_mode' => 'full',
      '#language' => 'und',
      '#field_name' => 'field_jf_comment',
      '#field_type' => 'text',
      '#entity_type' => 'comment',
      '#bundle' => 'comment_node_location',
      '#items' => array(
        '0' => array(
          // This isn't working and gives an error saying:
          // Notice: Undefined property: stdClass::$field_jf_comment in
          // jf_comment_feed_block_view()
          'value' => $comment->field_jf_comment['und']['0']['value'],
          'format' => $comment->field_jf_comment['und']['0']['format'],
          'safe_value' => $comment->field_jf_comment['und']['0']['safe_value']
        )
      )
    )
  );
}

我用它来渲染它:

$block['content'] = $items;

修改 @Clive是对的。他的代码和我的代码一样,但代码却少了。通过一些修改,我设法在那里获得我的自定义字段:

$content = '';
foreach ($items as $item) {
  $single_comment = comment_load($item['cid']);
  $custom_field = field_attach_view('comment', $single_comment, 'field_jf_comment');
  $to_render = array(
    '#theme' => 'comment',
    '#comment' => $single_comment,
    '#node' => node_load($item['nid']),
    'field_jf_comment' => $custom_field
    );

  $content .= render($to_render);
}

$block['content'] = $content;

现在我唯一缺少的是每条评论的链接。我唯一使用的是回复评论。任何人都知道如何展示它?

2 个答案:

答案 0 :(得分:0)

theme()调用可能会中断,因为您正在使用Drupal 7但尝试以Drupal 6样式传递参数。如果您查看theme_comment() documentation,您可以看到它需要一个$variables参数,该参数应该是一个数组。试试这个:

$content = '';
foreach ($items as $item) {
  $to_render = array(
    '#theme' => 'comment',
    '#comment' => comment_load($item['cid'])
  );

  $content .= render($to_render);
}

$block['content'] = $content;

答案 1 :(得分:0)

新的Drupal 7 theme()语法为其第二个参数采用数组。在调用模板文件之前将提取此数组,因此每个键将成为一个新的php var。

例如,array( 'comment' => $mycomment )会在模板中为您提供$comment变量。

希望这可以提供帮助。