添加注释到自定义节点模块

时间:2012-10-10 11:08:37

标签: drupal drupal-7

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

// 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然后我必须重新填写我的评论并且评论未被保存。

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

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

我想要发生的是:

  • 在节点页面上有评论表格
  • 输入评论
  • 点击&#34;保存&#34;
  • 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

3 个答案:

答案 0 :(得分: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));

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

答案 1 :(得分: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

找到了它

答案 2 :(得分:0)

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

因此,当您取消设置SESSION时,Mike的解决方案才有效。但他一直很有帮助。

所以现在我有:

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;