hook_form_alterで返信用フォームだけを変更したい

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
moyassy's picture

いつもお世話になっております。moyassyと申します。

現在replyモジュールというモジュールを使っているのですが、一点疑問が生じましたので質問させて下さい。
コメントやreplyには通常の投稿用フォームと既に投稿された内容への返信用フォームが存在します。
その返信用フォームだけをhook_form_alterで変更する事は可能でしょうか?
つまり、通常のコメントと返信コメントの入力内容を違う物にしたいという事です。

hook_form_alterでフォームの内容を書き換えられる事は調べたのですが、どうも通常の投稿用フォームと返信用フォームとは同じformIDを使用しているようなのです。
これだと、hook_form_alterを使っても、返信用フォームだけ書き換える事が出来ません。
目的は返信用フォームの書き換えなので、何か他に上手い手が存在するのでしょうか?
IDのオーバーライドが出来るという話も聞いたのですが、返信用フォームのIDだけオーバーライドする事が可能なのですか?

言葉足らずだったら申し訳ありません。ヒントだけでも与えていただけたら嬉しいです。よろしくお願いします。

Comments

FormIDは別になっていませんか?

qchan's picture

コアのComment機能を利用しつつ、Replyモジュールでの別エンティティをつけておられるのでしょうか。
Drupal7はコアのCommentもEntityとなって、コンテンツタイプごとに自由にフィールドを追加できるようになりました。

どのような用途でReplyモジュールを使われているのか書いてもらえると質問の意図が伝わりやすいと思います。

また、FormIDはNode、Comment、Replyそれぞれ別になっているのではないかと思います。
FormIDの探し方ですが、

<input type="hidden" name="form_id" value="◯◯◯◯">

のような書き方がされていますので、HTMLソースを探してみてください。

hgoto's picture

hook_form_alterでフォームの内容を書き換えられる事は調べたのですが、どうも通常の投稿用フォームと返信用フォームとは同じformIDを使用しているようなのです。

こちらは「オリジナルのノードに対するコメント」でも「他のコメントに対するコメント」でも formID が同じだから区別できない、ということでしょうか?
この理解でよろしければ、 FormID で区別できない場合は他の部分で区別されるのがよろしいかと思います。
具体的には、実装した hook_form_alter() の中で使える $form 変数の中に $form['pid']['#value'] という要素が入っているかと思います。こちらが次のような値になっていますので、「オリジナルのノードへのコメント」と「コメントへのコメント」の区別に利用することができます。

  • オリジナルのノードに対するコメントの場合: NULL
  • 他のコメントに対するコメントの場合: 他のコメントの id

こういうところではなくもっと凝ったことをされるようでしたが、 qchan さんがおっしゃるとおり

どのような用途でReplyモジュールを使われているのか書いてもらえると質問の意図が伝わりやすいと思います。

そもそも何をされたいのかを書いていただけるとより他の方のサポートが得やすくなるかと思います。
ご参考になりますでしょうか。

お二人とも、ありがとうございます!

moyassy's picture

すいません、自分の説明が下手でした。申し訳ありません。
要は、コメントにしてもreplyモジュールにしても、通常のノードへの投稿とは別にそれぞれのコメントやreplyに対する返信が行えると思うのですが、その返信用のフォームだけを書き換えたいのです。

現在、投稿された内容(コンテンツ)に対するレビュー機能を実現する為にreplyモジュールを導入しています。
また投稿されたコンテンツをreplyを使ったレビューで評価した、そのレビューにもユーザーがコメントを投稿できるようにしたいと思っています。

そこで、replyにある返信機能を使ってレビューへのコメントを実現しようとしたのですが、そのままだとレビュー用のフォームを丸のまま使ってコメントをする事になってしまいます。
つまり、単純に返信するだけだとレビューと全く同じフィールドを使う事になり、見た感じレビューなのかコメントなのかが分からなくなってしまうのです。
具体的にはレビューにはタイトル欄を設置していますが、コメント、即ち返信用フォームではそのタイトル欄を無くしたいと思っています。
また、レビューに使用しているfivestarを使った星による評価をレビューへのコメントにも使用したいと考えているのですが、選べる星の数やvoteタグを別の物にしたかったりなど細かい変更を行いたいのです。

色々調べた結果、hook_form_alterを使ってフォームの書き換えが出来ると聞いたので、それを使って返信用フォームだけをコメント用に改装出来ないかと苦戦していました。
ざっと調べたところでは、replyも通常のコメントも、ノードに対する投稿用フォームと他のコメント・replyに対する返信用フォームでは同じformIDを使用しているようだったので、他に何か手段があれば、と思い質問させて頂いた次第です。

上手く説明できた自信がないのですが、何かヒントだけでも頂けると嬉しいです。
よろしくお願いします。

Node, Comment,

qchan's picture

Node, Comment, ReplyのFormIDは別ですね。

試しにReplyモジュールを入れてみましたが、

Replyのフォーム

<input type="hidden" name="form_id" value="reply_form_58_16">

Replyへの返信フォーム

<input type="hidden" name="form_id" value="reply_form">

Commentのフォーム

<input type="hidden" name="form_id" value="comment_node_article_form">

Nodeのフォーム(編集画面)

<input type="hidden" name="form_id" value="article_node_form">

となってそれぞれ別のIDが付いています。

おもしろいことに、Replyへの返信はさらに別のFormIDが着くようなので
moyassyさんがされたいことが実現できるかもしれないです。
がんばってください!

hgoto's picture

私は実際のコードまでは確認できていませんが qchan さんが述べてくださっているとおりかと思います!

具体的にはレビューにはタイトル欄を設置していますが、コメント、即ち返信用フォームではそのタイトル欄を無くしたいと思っています。

ご参考までに、 hook_form_alter() を使って reply への返信フォームの場合だけタイトル欄をなくすには次のようにされるとよろしいかと思います。

/**
 * Implements hook_form_alter()
 */
function mymodule_form_alter($form, $form_state, $form_id) {
  // mymodule には実際のモジュール名を入れてください
  if ($form_id === 'reply_form') {

    // ここで $form の title 要素を非表示にする

  }
}

お手数をお掛けしてしまってすいません

moyassy's picture

これで問題が全て解決しそうです。もう何とお礼を言っていいのか分かりません。
こんなに詳細にお答えを戴けるとは思っていなかったので、有難い限りです。

qchan さん、わざわざモジュールを入れて詳しく確認までして下さったようで申し訳ないです。
自分だけでは手詰まり状態だったので、とても助かりました。本当にありがとうございます。
formIDは返信も投稿もそれぞれ別だったようですね。これなら、どうにか自分でも出来そうです。
きちんとformIDを確認したつもりだったのですが、自分がきちんと理解していなかったようで、お手数をおかけしてしまいました。
ありがとうございました。本当に感謝、感謝です。

hgoto さんも御教授ありがとうございます。
コードの内容まで示して頂けるとは全く思っていませんでしたので感動しております。
私もド素人な物で、こうして正解を示して頂けるのは本当にありがたいです。
なるほど、if条件でformIDを指定して、そのformを書き換えればいいんですね。
教えて頂いた内容を参考にしながら、自分でも努力してみたいと思います。

お二人とも、本当にありがとうございました。

hgoto's picture

ご丁寧にお礼コメントをご投稿くださりありがとうございます。問題が解決されそうとのことでよかったです!

moyassy's picture

qchanさんに教えて頂いた通り、自分でformIDを調べてみましたが、自分の環境ではreplyのノードへの投稿時も他のreplyへの返信時も、同じformIDを使用していました。
HTMLで検索した結果、同じformIDだったので、その上でDevel form debugというモジュールを使ってみたのですが結果は同じでした。
ノードへの投稿時のフォームもreplyへの返信時のフォームも、全てreply_formという同じformIDが使われています。

そこで自分なりに色々調べた結果、少しだけですが状況が見えてきました。
replyモジュールは投稿用のフォームを投稿先のコンテンツと同じページに表示されるように設定するか、それとも別の投稿専用ページに設定するかを選べるようになっているのですが、投稿先のコンテンツと同じページに設定した場合と、別の投稿専用ページに設定した場合とでformIDが違う物になるようです。
つまり、返信時か投稿時か、という違いでformIDを変えている訳ではなく、そのフォームがコンテンツページに表示されるのか投稿専用のページに表示されるのかでformIDを変えているみたいで……。
qchanさんが調べて下さった時には、おそらくですがコンテンツページにreplyフォームが表示されていたのだと思われます。
実際、コンテンツページにフォームを表示させた結果、reply_form_xx_xx("x"は数字)というformIDになりました。
ただ、当該ページではテーマやデザインとの兼ね合いもあり、投稿用フォームをコンテンツページに表示できない状況なので、せっかく教えて頂いたのですが、hook_form_alterでの返信用フォームだけを狙った書き換えはこのままでは難しそうです。

drupal8になると別系統のコメントフィールドが同ページ内に幾つも設置できると聞いたので、いっそdrupal8まで待って、開発途上で設定が煩雑なreplyモジュールではなくコメント機能でレビュー機能を実現させようかとも思ったのですが、コアのコメント機能もノードへの投稿時と他のコメントへの返信時で同じformIDを使っているので、結局返信フォームだけを書き換える事が出来ずレビューとそれに対するコメントを同じ形式のフォームから投稿しなければならない状況です。

formIDが全く同じだが特定の(今回の場合は返信時の)フォームだけを書き換えたい、こういった場合にはどのような手立てが考えられますでしょうか?
質問ばかりですいません。どんな情報でも構わないので、どなたか教えて頂けると幸いです。
どうかよろしくお願いいたします。

hgoto's picture

formIDが全く同じだが特定の(今回の場合は返信時の)フォームだけを書き換えたい、こういった場合にはどのような手立てが考えられますでしょうか?

こちらは上で述べさせていただいた $form['pid']['#value'] の値で分岐するというやり方がもっともシンプルかと思います。以下のようなコードになりますでしょうか?(すみません、動作確認していないので厳密にはちがうかもしれません)

/**
 * Implements hook_form_alter()
 */
function mymodule_form_alter($form, $form_state, $form_id) {
  // mymodule には実際のモジュール名を入れてください
  if ($form_id === 'reply_form') {

    // 念のため値を確認
    dpm($form['pid']['#value']);

    if ($form['pid']['#value'] === NULL) {
      // 元のノードに対するコメントに対する処理はここに書く

    }
    else {
      // 別のコメントや reply に対する処理はここに書く
      // 具体的にはここで $form の title 要素を非表示にする

    }
  }
}

ご参考になればと思います。

おお!ありがとうございます!

moyassy's picture

hgotoさん、何度も詳しい説明をして頂いてすいません。

なるほど、$form['pid']['#value'] の値がNULLになるかどうかで条件分けすれば良い訳ですね
いや、一度書いて頂いた事をもう一度お聞きする事になって本当に申し訳ない。
素人な物で、個々のIDでそれぞれ条件分けをするのは難しいなと勝手に何とも間抜けな勘違いをしていました……。
この方法なら、仰る通りコメントに対する返信かどうかで簡単に分岐できそうですね。
ありがとうございます。コードまで詳細に書いて頂いて、もう本当に何とお礼を言っていいやら……。

大変御面倒をお掛けしました。
ここまで教えて頂ければ、どうにか出来そうです。
ここで教えて頂いた事を参考にしながら、自分でも色々と思考錯誤してみたいと思います。
懇切丁寧な御教授、本当にありがとうございました。

日本 コミュニティ: Drupal Japan User Group

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week