Drupal 7 开发内部培训资料, 分头诗人

comment_form 在teaser模式下的提交问题

赞成!
1
否决!

我在自己的模块中实现hook_node_view如下:
function mypage_node_view($node, $view_mode) {
if ($view_mode == 'teaser' && 1) {
if ($node->comment == COMMENT_NODE_OPEN) {
if (user_access('post comments')) {
$node->content['comments'] = comment_node_page_additions($node);
}
}
}
}
其中,函数comment_node_page_additions($node)的作用是生成一个comment_form,就是comment的提交表格,输入comment内容之后,提交发表。
也就是说想在显示node的teaser模式下,能够直接发表comment,现在,comment_form可以正常显示,提交之后则没有任何反应,根本没有进入函数comment_form_submit,也就没有进行保存之类的操作。
我在函数function comment_form中加入测试语句,print_r(__FUNCTION__),可以正确显示comment_form,在comment_form_submit中加入drupal_set_message('测试代码'),没有显示,所以点击submit按钮之后,根本没有进入到这个函数。
想请问下:这是怎么回事,要如何操作才能直接在teaser模式下发表评论,谢谢!
还有,想放图片,怎么贴上来啊……

5 个回答

赞成!
0
否决!

图来了!

赞成!
0
否决!

这个我还没试过,不过我在想,你直接输出comment_node_page_additions($node);应该不对吧?是不是应该drupal_get_form('comment_node_page_additions', $node)?

然后

1
2
3
function comment_node_page_additions($form, &$form_state, $node){
......
}
赞成!
0
否决!

我在公司,没办法测试。

但是应该不是这个问题,因为这段代码是从comment_node_view中copy出来的,这是一个hook_node_view(),根据我对hook的理解,应该是说各个module的同一钩子遵循同样的原则就能正常运作吧,comment_node_view的最后几行代码是这样:

if ($node->comment && $view_mode == 'full' && node_is_page($node) && empty($node->in_preview)) {
      $node->content['comments'] = comment_node_page_additions($node);
    }

然后在comment_node_page_additions函数中有调用drupal_get_form,如下:

if (user_access('post comments') && $node->comment == COMMENT_NODE_OPEN && (variable_get('comment_form_location_' . $node->type, COMMENT_FORM_BELOW) == COMMENT_FORM_BELOW)) {
    $build = drupal_get_form("comment_node_{$node->type}_form", (object) array('nid' => $node->nid));
    $additions['comment_form'] = $build;
  }

其中comment实现了hook:comment_forms,将("comment_node_{$node->type}_form", (object) array('nid' => $node->nid))指向了function comment_form,由他来构造具体的comment提交form。

 

function comment_form($form, &$form_state, $comment) {…………}

 

赞成!
0
否决!

其实,我看他们生成的最终代码,确实是有差别。

显示单一node,和我修改之后的teaser模式下生成的html会有差异,但是我不知道为什么会这样,晚上到家贴出来。

赞成!
0
否决!

正常来说有通过drupal_get_form 出来的表单,是默认是xxx_submit 提交,里面 drupal_set_message是可以显示出来的

所以你的方法应该是没错的

我自己本地测试了一下,是可以的

简化了你的代码,不加任何判断

1,建测试module “drupalla”

2,drupalla.module 简化代码:

1
2
3
4
<?php
function drupalla_node_view($node, $view_mode, $langcode) {
$node->content['comments'] = comment_node_page_additions($node);
}

3,返回首页,每个teaser下方有个留言form,点击提交,成功。附图

 

所以请仔细看看,哪里做错了。