Добавить комментарии в пользовательский node модуль

В моем пользовательском модуле я хотел бы добавить функциональность комментариев. Я пробовал пару вещей, но пока не тренировался.

// 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;

Вышеприведенный код помещает форму комментариев на мою страницу node.

Но когда я заполняю форму комментария и отправлю, он перенаправляет меня на эту страницу: comment/reply/node id, а затем я должен заполнить свой комментарий снова и комментарий не сохраняется.

Я бы хотел отправить и остаться на одной странице вместо перенаправления. И комментарий должен быть сохранен после отправки.

В настоящее время форма комментария отображается на моей странице node (шаблон настраиваемого модуля). Я ввожу комментарий и нажимаю "Сохранить". Я отправлен в /comment/reply/<node_id>, но все поля комментариев пустые. Комментарий не сохраняется.

Мне бы хотелось:

  • Наличие формы комментария на странице node
  • Введите комментарий
  • Нажмите "Сохранить"
  • Drupal сохраняет комментарий и перенаправляет меня на страницу node/, которую я просматривал.

Вещи, которые я пробовал

  • Добавление перенаправления

    $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.

Ответ 1

По какой-то причине проблема была вызвана drupal_build_form и drupal_get_form после отправки комментария. Если $_POST был заполнен drupal_build_form, а перенаправления функций drupal_get_form выполнялись до /node/node_id/#comment-17 или /comment/reply/<node_id> Поэтому я отключил СЕЗОНУ перед загрузкой формы, и проблема была исправлена.

Итак, решение от Майка работает только тогда, когда вы отменили СЕССИЮ. Но он был полезен.

Итак, теперь у меня есть:

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;

Ответ 2

Так как вы используете настраиваемый модуль, вы можете изменить comment_form с помощью form_alter для ваших конкретных случаев. Вы можете установить форму только для использования функции отправки модулей. Затем в вашей пользовательской функции отправки вы отправляете комментарий в модуль комментариев для сохранения (вызывая функцию comment_form_submit), а затем выполните перенаправление вернитесь к node себе.

Что-то вроде этого:

<?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));

Это решение может показаться немного взломанным, но оно работает.

Ответ 3

Думаю, это был бы ответ?

$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/info/21692/d7-comment-form-doesnt-submit