我创建了一个模块,用于从用户指定为“收藏夹”的节点获取注释。因此,我不是要尝试输出所有节点的所有注释,例如最近的注释块,而只是输出来自指定为“收藏夹”的节点的注释。
查询全部工作,我通过打印来自不同对象的值来测试它。所以我已经为每个注释和相应的节点对象获得了整个注释对象。我已经能够创建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;
现在我唯一缺少的是每条评论的链接。我唯一使用的是回复评论。任何人都知道如何展示它?
答案 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
变量。
希望这可以提供帮助。