10

在我的自定义模块中,我想添加评论功能。我已经尝试了几件事,但到目前为止还没有锻炼过。

// render comments form
$output .= theme('my_module_front_page'); 
$comment = new stdClass;
$comment->nid = $node_good_practice->nid;
$output .= render(drupal_get_form('comment_form', $comment));
return $output;

上面的代码将评论表单放到我的节点页面中。

但是当我填写评论表并提交时,它会将我重定向到这个页面:comment/reply/node id然后我必须重新填写我的评论并且评论没有保存。

我想提交并留在同一页面而不是重定向。并且评论提交后必须保存。

现在,评论表单出现在我的节点页面(自定义模块模板)上。我输入评论并单击“保存”。我被发送到/comment/reply/<node_id>,但所有评论字段都是空的。评论也没有保存。

我想要发生的是:

  • 在节点页面上有一个评论表单
  • 输入评论
  • 点击“保存”
  • Drupal 保存评论,并将我重定向回我正在查看的节点/页面。

我尝试过的事情

  • 添加重定向

    $form['#redirect'] = "/success-stories/".$node_good_practice->good_practice_name."/".$node_good_practice->nid;
    

    它没有改变任何东西。

  • 改变行动

    $form['#action'] = "/success-stories/".$node_good_practice->good_practice_name."/".$node_good_practice->nid;
    

    它把我重定向到node/node_id/#comment-17

  • 采用drupal_build_form()

    $info->nid = $node_good_practice->nid;
    $comment['build_info']['args'][0] = $info;
    $comment['redirect'] = "http://www.google.nl";
    $output .= render(drupal_build_form('comment_form', $comment));
    

    表单正在显示,但没有重定向;它被发送到comment/reply/node_id.

4

3 回答 3

3

由于您使用的是自定义模块,因此您可以针对特定情况使用form_alter挂钩更改 comment_form。您可以将表单设置为仅使用您的模块提交功能。然后在您的自定义提交函数中,将评论提交到评论模块进行保存(调用comment_form_submit函数),然后自己重​​定向回节点。

类似这样的东西:

<?php
    function mymodule_form_alter(&$form,&$form_state,$form_id){
        if ($form_id == 'comment_form' && isset($form['#node']) && ($form['#node']->type == 'mynodetype')){
            $form['#submit'] = array('mymodule_comment_form_submit');
        }
    }

    function mymodule_comment_form_submit($form,&$form_state){
        module_load_include('module','comment');
        comment_form_submit($form,$form_state);
        $url = drupal_get_path_alias('node/'.$form['#node']->nid);
        header('Location: '.$url, TRUE);
        drupal_exit($url);
    }

在您的模板文件中,仍然按照您的方式构建评论表单:

$info->nid = $node_good_practice->nid;
$comment['build_info']['args'][0] = $info;
$output .= render(drupal_build_form('comment_form', $comment));

这个解决方案可能看起来有点老套,但它确实有效。

于 2012-10-17T13:17:56.667 回答
0

我想这就是答案?

$comment->nid = $row->nid;
$form = drupal_get_form('comment_form', $comment);
$form['#redirect'] = 'CHANGE_VIEWSPAGE_HERE?page=' . (int)$_GET['page'];
print render($form);

不能自己尝试抱歉。我在https://drupal.stackexchange.com/questions/21692/d7-comment-form-doesnt-submit找到它

于 2012-10-12T08:08:35.043 回答
0

由于某种原因,问题是由提交评论引起drupal_build_form的。drupal_get_form如果 $_POST 填充了 drupal_build_form 并且 drupal_get_form 函数重定向到/node/node_id/#comment-17或到/comment/reply/<node_id> 所以我在加载表单之前取消设置 SESSION 并且问题得到解决。

因此,Mike 的解决方案仅在您取消设置 SESSION 时才有效。但他非常乐于助人。

所以现在我有:

if(isset($_POST['form_id'])) {
  $comment = new stdClass();
  $comment->nid = $good_practice_id; // Node Id the comment will attached to
  $comment->name = $user->name;
  $comment->status = 1;
  $comment->language = "und";
  $comment->subject = $_POST['subject']; 
  $comment->comment_body[$comment->language][0]['value'] = $_POST['comment_body'][$node_good_practice->language][0]['value'];
  $comment->comment_body[$comment->language][0]['format'] = 'filtered_html'; 
  comment_submit($comment);
  comment_save($comment);
  unset($_POST);
} 

$comment = new stdClass;
$comment->nid = $node_good_practice->nid;
$form = drupal_get_form('comment_form', $node_good_practice);
$form['#action'] = url('success-stories/'.$node_good_practice->good_practice_name.'/'. $comment->nid);

$output .= theme('good_practices_front_detail_page', array('oGoodPractice' => $oGoodPractice, 'aGoodPractices' => $aGoodPractices, 'aComments' => $aComments, 'oSectors' => $oSectors, 'oCountries' => $oCountries, 'links' => $aLinks));
$output .= render($form);
$output .= theme('pager', array('tags'=>array()));

return $output;
于 2012-10-18T12:20:06.227 回答