Posted by qchan on December 12, 2010 at 1:16pm
質問させてください。
(A)というcontent typeの node/[nid]/edit または、 node/add/[node-type] ページで
(B)というcontent typeの form を一緒に表示して、一度にsubmit したいのですが、
何か良い方法はないでしょうか。
hook_form_alter で (B)のform のsubmitを消し、(A)のSubmitをclickで (B)の項目をnode_saveする
functionを呼び出しています。
この方法で上手くいったのですが、IE7,8だけは(A)のSubmitが押せません。
Formが入れ子になっているのが問題のようです。(W3C的には入れ子はNGです)
Formを入れ子にせずに、複数のcontent typeのFormをSubmit出来る方法、
あるいは、IE向けになにか対策があれば教えていただけますでしょうか。

Comments
初めまして、U-Taroと申します。groups.drup
初めまして、U-Taroと申します。groups.drupalで初投稿です。
フォームの中にフォームが入れ子になっていると言うことは、hook_form_alter()で、drupal_get_form()を使ってレンダリング済みのフォームを挿入しているとことですか?
もし、そうだとしたら下記の様なコードでフォームを作ってやれば、入れ子にはならないフォームは出せると思います。
$node->type = 'example_type';$form['form_b'] = node_form($form_statte, $node);
でも、この方法だと色々と懸念しなきゃならない事項が増えるので注意してくださいね。
form_alterで、Aを判定して、 $form[B]
form_alterで、Aを判定して、
$form[B] = node_form(B)
unset($form[B], submit)
$form['submit'] = array(orijinal_submitter)$form['#submit'] = array(orijinal_submitter)
といったことをやっていると仮定して
フォームのルートに
$form['#tree'] = TRUE
or
全項目に
$form['項目名']['#name'] = 'ユニーク名'
といった感じで、#nameを定義されてみてはいかがでしょうか?
ちなみにIE以外では正しく編集(保存)されるのでしょうか?
flexifieldやcck multigroupあたりではだめなんでしょうね・・・
参考になります。
>>U-Taro さん
今回はPanelsを使って、nodeのエディット画面をカスタマイズしていたんですね。
別のモジュールで吐き出されたフォームを、PanelsのPaneとして呼び出していれこんだのですが
元のnode editのformがかなり広い範囲を支配してまして、form /form の外側に呼べなかったんです。
モジュールのformをPHPのコードで呼べないか調べてみます。
参考にさせていただきます。ありがとうございました。
>>kyk さん
はい、おっしゃるとおりの操作をしていました。
裏技的な対応なのでHTML的にはformが壊れているのですが、IE以外のブラウザだと2種類の content typeに情報が書き込まれています。
javascriptで 内側のを消せたらいいのかなとも思ったりしています。
#tree と、#parents をこの場面で使えるかわからなかったのですが、
#nameと組み合わせだとうまくいくかも知れません。
試してみます。ありがとうございます!
qchanさん、いつもお世話になっております。 一度のサブ
qchanさん、いつもお世話になっております。
一度のサブミットに関してのディスカッションがありましたので、コメントさせていただきます!
http://drupal.org/node/334817
Nodereferrer Create は便利そうですね。
情報ありがとうございます。
今回のformが入れ子になってしまう問題はPanelsだけで片付けようとした時に特有のことかもしれません。
教えていただいたディスカッションにあるように、カスタムモジュールにすれば大丈夫なのだと思います。
Nodereferrer Create、NodeReferrer はすごく便利そうですね。
双方向のreferenceが自動的に掛かると、設計時に頭を捻らす必要が減ります。
片方向だと、viewsでどうしても引っ張れないFieldがあるんですよね。