モジュールを構築していて、コメントフォームをノードではないのページに配置する必要があります。これを行う方法はありますか?
私は使用する必要があると思います:
drupal_get_form( 'comment_form'、array( 'nid' => $ node-> nid));
ただし、これは常にノードにアタッチされているように見えるため、nidに特定の依存関係があるようです。
[〜#〜] 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モジュールは、そのノードに関連付けられているコメントを返すためにノードオブジェクトを必要とするためです。
いいえ。コメントには、データベースに必須の外部フィールド「comments.nid」があります。ノードではないものに対してはコメントは機能しません。
ノードIDなしでなんとかしてコメントを保存できたとしても、物事はひどく壊れてしまいます。
これは私にとってはうまくいきます:
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が読み込まれ、フォームの構造はノードページにあります(このためのソリューション)。
Reply モジュールを試すことをお勧めします。
ノードのないページにコメントを追加することは間違いなく可能です。他の回答のアイデアに従って、空のノードを自分の非ノードページにアタッチします。技術的な詳細はすべてここにあります。
使用例:
古い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を使用して、これらの空のノードでの検索方法を変更します。