いくつかの異なるサイトで、ctoolsモーダルを使用してこれを実行しました。これを(非常に簡単に)実装した方法の基本的な概要は次のとおりです。
参照するノードの基本的なノードフォームを表示するモジュールのhook_menu()でカスタムページコールバックを作成します(「学生」ノードの場合、名前フィールドと卒業年フィールドがあるだけです)。そのフォームの送信コールバックで、node_save()を使用してノードを保存し、ノードID(フォームに新しいノードオブジェクトをnode_save()に渡した後は$ node-> nidにある必要があります)を保存します$form_state['storage']['student_id']
。
hook_form_alter()を使用してマスター/クラスノードフォームを変更します。ここでいくつかのことを行う必要があります。
まず、ctoolsのモーダルjavascriptと機能を追加して、ctoolsが特別なリンクの処理方法を認識できるようにする必要があります。
// Add in ctools modal js and functionality.
ctools_include('modal');
ctools_modal_add_js();
次に、フックメニューのステップ1で作成したページコールバックへのリンクを追加する必要があります。そのリンクを使用して、クラス 'ctools-use-modal'を追加します。したがって、たとえば:
// Add link to custom student form callback with ctools modal.
$form['add_student_link'] = array(
'#markup' => l(t('Add Student'), 'mymodule/add-student', array('attributes' => array('class' => array('ctools-use-modal')))
);
- カスタムページコールバックでは、JavaScriptの有無にかかわらず、またctoolsのフォーム関数で機能させるために、いくつかのことを行う必要があります。
次にコールバックの例を示します。
<?php
function mymodule_student_form_callback($js = FALSE) {
// Make sure $js (set by ctools) is TRUE/loaded.
if ($js) {
// Add in ctools modal form stuff.
ctools_include('modal');
ctools_include('ajax');
$form_state = array(
'ajax' => TRUE,
'title' => t('Create a Student'),
);
$output = ctools_modal_form_wrapper('mymodule_create_student_form', $form_state);
}
else {
return 'Javascript must be enabled for this feature to work.';
// Or, if we wanted to load the form normally...
// return drupal_get_form('mymodule_create_student_form');
}
// If the form is executed, dismiss the form and reload the page.
if ($form_state['executed']) {
$commands = array();
// Close the frame.
$commands[] = ctools_modal_command_dismiss();
// Use one of the ajax framework commands to place the returned
// student node nid into the proper form value, placholder div, etc.
// See: http://api.drupal.org/api/drupal/includes%21ajax.inc/group/ajax_commands/7
$commands[] = ajax_command_append('#student-id-placeholder', $form_state['storage']['student_id']);
$output = $commands;
}
// Render the output.
print ajax_render($output);
exit();
}
?>
でmymodule_create_student_form($form, $form_state)
、通常の方法でフォームを作成し、次にmymodule_create_student_form_submit(form, &$form_state)
(送信)関数で、新しく作成した生徒ノードのNIDの値をで設定します$form_state['storage']['student_id']
。これは、ctools / AJAXで新しいnidを元のクラスフォームに戻す方法です。
私の状況では、モーダルを使用して元のページにいくつかのマークアップを吐き出していたので、を使用してマークアップをプレースホルダーdivに渡しajax_command_append()
ました。それは、HTMLをノードフォーム上の適切な場所に移動します。あなたの場合、少し複雑かもしれない単一または複数の値のノード参照フィールドを入力する必要があります。私はまだそれをする必要はありません...ですから、方程式のその部分について提供するためのアドバイスはこれ以上ありません。