web-dev-qa-db-ja.com

ノードではないページにコメントを追加する方法はありますか

モジュールを構築していて、コメントフォームをノードではないのページに配置する必要があります。これを行う方法はありますか?

私は使用する必要があると思います:

drupal_get_form( 'comment_form'、array( 'nid' => $ node-> nid));

ただし、これは常にノードにアタッチされているように見えるため、nidに特定の依存関係があるようです。

3
WestieUK

[〜#〜] api [〜#〜]api.drupal.org にあるページを処理するモジュールにも同じ問題があります。表示されるドキュメントページはノードではありませんが、モジュールはノードにコメントを追加できます。

ドキュメントページに対して呼び出されるページコールバックは api_page_function() であり、hook_menu()の実装でパスapi/%/%/function/%api_itemに関連付けられています(- api_menu( ) 、リンクされたファイルの125行目から開始)。ページコールバックは、次のコードを含む _ api_add_comments() を使用します。

if (module_exists('comment') && user_access('access comments') && variable_get('comment_api', COMMENT_NODE_READ_WRITE) != COMMENT_NODE_DISABLED) {
  $output .= comment_render(node_load($documentation_object->did));
  if (user_access('post comments')) {
    $output .= comment_form_box(array('nid' => $documentation_object->did), t('Post new comment'));
  }
  // ...
}

APIは、ドキュメントページに関連付ける空のノードを作成します。この理由は、Commentモジュールは、そのノードに関連付けられているコメントを返すためにノードオブジェクトを必要とするためです。

3
kiamlaluno

いいえ。コメントには、データベースに必須の外部フィールド「comments.nid」があります。ノードではないものに対してはコメントは機能しません。

ノードIDなしでなんとかしてコメントを保存できたとしても、物事はひどく壊れてしまいます。

1
berkes

これは私にとってはうまくいきます:

if (module_exists('comment') && user_access('access comments') && variable_get('comment_api', COMMENT_NODE_READ_WRITE) != COMMENT_NODE_DISABLED) {
  $output .= comment_render(node_load($documentation_object->did));
  if (user_access('post comments')) {
    $output .= comment_form_box(array('nid' => $documentation_object->did), t('Post new comment'));
  }
  // ...
}

しかし、私はコメントを保存しようとするときにajax_commentsモジュールを使用して、ページを再生する必要があります。

しかし、すべてのタグとajax_comment.jsと.cssが読み込まれ、フォームの構造はノードページにあります(このためのソリューション)。

1
Sami .GH

Reply モジュールを試すことをお勧めします。

1
Bojan Zivanovic

ノードのないページにコメントを追加することは間違いなく可能です。他の回答のアイデアに従って、空のノードを自分の非ノードページにアタッチします。技術的な詳細はすべてここにあります。

使用例:

古いWebサイトをDrupal 7.に移行します。7 http://www.example.com/oldpage.php?gid=のようなデータベーステーブルのコンテンツを示す古いURLを持っています。 xxxxx ここで、xxxxxは整数IDです。これらのIDは、外部サイトからそれらへのリンクが何千もあるので、私にとって重要です。私の新しいDrupal URLは http: //www.example.com/newpage/xxxxx いつでもウェブサーバーに古いURLを新しいURLに書き換えさせることができます。ノードを使用すると、IDを制御できなくなります。

古いIDを新しいノードIDにマップします:

empty node」という新しいノードタイプを作成します。これは、管理ユーザーインターフェイスを使用するか、Drupal APIを使用して実行できます。次に、association_tableというデータベーステーブルを次のように作成します。

+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+ 
| drupal_nid | int(11)     | NO   | PRI | NULL    |       |
| gid        | int(8)      | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

これにより、私の古い「gid」が「空のノード」の関連ノードIDにマップされます。ユーザーが新しいページのURLにアクセスすると、必要に応じて空のノードが作成されます。そのページの終わりに私は次のようなものがあります:

$sql = "SELECT drupal_nid from {association_table} WHERE gid=". $gid; // $gid: my old ID
$results = db_query($sql);
if ($results->rowCount()==1) {  
  // already associated with an empty node
  $nid = $results->fetchField(0);
}
else {
  // call helper function to create a new empty node and return its node id
  $nid = mymodule_new_node($title);
  // create new entry in association_table
  $sql = "INSERT INTO {association_table} VALUES(". $nid. ", ". $gid. ")";
  db_query($query); // I keep things simple here, of course use Drupal way to insert.
} 

ヘルパー関数:

function mymodule_new_node($title) {
  $node = new stdClass();
  $node->type = 'empty_node'; 
  $node->title = $title;
  $node->uid = 1;  // created by admin user
  if (module_exists('comment')) {
    $node->comment = variable_get('comment_api', COMMENT_NODE_OPEN);
  }
  node_save($node);
  return $node->nid;
}

ヘルパー関数は空のノードを作成し、そのタイトルを適切なものに設定し、所有者を管理ユーザーに設定して、ノードIDを返します。 $ titleビットは絶対に必要です。タイトルは、「admin/content」、「admin/content/comment」、検索結果のクリック可能なリンクなど、Drupalの多くの場所に表示されます。

ノードのないページにコメントフォームを追加します:

これはかなり簡単です。 「新しいページ」の最後に、

if (module_exists('comment') && user_access('access comments') && variable_get
('comment_api', COMMENT_NODE_OPEN) != COMMENT_NODE_HIDDEN) {
  $comment_form = comment_node_page_additions(node_load($nid));
  $output .= drupal_render($comment_form);
}

このフォームを使用すると、ユーザーはメインのコメントテーブルにコメントを追加できます。

ハンドルリダイレクト:

DrupalはURL/node/?????を使用してこれらの空のノードを参照します(「admin/content」内のリンクなど)。ユーザーがコメントフォームを送信すると、それらも/ node/?????にリダイレクトされます。/node/?????をリダイレクトする必要がありますassociation_tableのマッピングを使用して/ newpage/xxxxxに追加します。これは、hook_node_viewを実装することによって行われます。

function mymodule_node_view($node, $view_mode, $langcode) {
  if ($node->type == 'empty_node' && $view_mode == 'full' && arg(0) == 'node') {
    $sql = "SELECT gid FROM {association_table} WHERE nid=". $node->nid; 
    $gid = db_query($sql)->fetchField(0);
    drupal_goto('newpage/' . $gid);
  }
}

まとめ:

この手順は、私のDrupal 7本番サイトでは問題なく機能します。

必要な追加の調整がいくつかあります。たとえば、空のノードのタイトルの設定方法によっては、検索結果に表示される場合があります。これは望ましくない場合があります。私の場合、hook_query_alterを使用して、これらの空のノードでの検索方法を変更します。

0
macelee