一つのform内で、複数のnode typeの情報を一度にsubmitできないでしょうか。

Events happening in the community are now at Drupal community events on www.drupal.org.
qchan's picture

質問させてください。

(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

u7aro's picture

初めまして、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]

kyotaro's picture

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あたりではだめなんでしょうね・・・

参考になります。

qchan's picture

>>U-Taro さん

今回はPanelsを使って、nodeのエディット画面をカスタマイズしていたんですね。
別のモジュールで吐き出されたフォームを、PanelsのPaneとして呼び出していれこんだのですが
元のnode editのformがかなり広い範囲を支配してまして、form /form の外側に呼べなかったんです。
モジュールのformをPHPのコードで呼べないか調べてみます。
参考にさせていただきます。ありがとうございました。

>>kyk さん

はい、おっしゃるとおりの操作をしていました。
裏技的な対応なのでHTML的にはformが壊れているのですが、IE以外のブラウザだと2種類の content typeに情報が書き込まれています。
javascriptで 内側のを消せたらいいのかなとも思ったりしています。

$form['#tree'] = TRUE

or

全項目に

$form['項目名']['#name'] = 'ユニーク名'

#tree と、#parents をこの場面で使えるかわからなかったのですが、
#nameと組み合わせだとうまくいくかも知れません。
試してみます。ありがとうございます!

qchanさん、いつもお世話になっております。 一度のサブ

jun784's picture

qchanさん、いつもお世話になっております。

一度のサブミットに関してのディスカッションがありましたので、コメントさせていただきます!
http://drupal.org/node/334817

Nodereferrer Create は便利そうですね。

qchan's picture

情報ありがとうございます。

今回のformが入れ子になってしまう問題はPanelsだけで片付けようとした時に特有のことかもしれません。
教えていただいたディスカッションにあるように、カスタムモジュールにすれば大丈夫なのだと思います。

Nodereferrer Create、NodeReferrer はすごく便利そうですね。
双方向のreferenceが自動的に掛かると、設計時に頭を捻らす必要が減ります。
片方向だと、viewsでどうしても引っ張れないFieldがあるんですよね。

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

Group organizers

Group categories

Group notifications

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