今回、画面でポップアップでデータ入力、ajaxでデータを更新することを試みたいですが、jQuery、Bootstrapなどのmodalライブラリで実現ができます。但しDrupalサイトでポップアップを作るとしたら、やはりctoolsのModal機能を利用してみたいです(ctools(Chaos tool suite)はDrualの開発によく利用されているAPI)。
$items['my-module/%ctools_js/add'] = array( 'page callback' => 'my_module_callback', 'page arguments' => array(1), 'access callback' => TRUE, 'type' => MENU_CALLBACK, );
function my_module_callback($ajax) { if ($ajax) { // ctoolsのajax、modalに関するjsファイルをクライアントへ ctools_include('ajax'); ctools_include('modal'); //フォーム作成に関する上方 $form_state = array( 'ajax' => TRUE, 'title' => t('New Group Creation'), ); //ポップアップフォームの作成 //フォームからの更新データを$form_stateにセットする $output = ctools_modal_form_wrapper('my_module_form', $form_state); //新規ポップアップにajaxが有効にする if (!empty($form_state['ajax_commands'])) { $output = $form_state['ajax_commands']; } //ポップアップの出力 print ajax_render($output); drupal_exit(); } else { return drupal_get_form('mymodule_form'); } } // ポップアップにある入力フォームの定義 function my_module_form($form, $form_state) { $form = array(); $form['new_link_text'] = array( '#type' => 'textfield', '#title' => t('Group Name'), ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), ); return $form; } // データ更新 function my_module_form_submit(&$form, &$form_state) { // データの更新 // ロジックは省略 // ポップアップを閉じるコマンド $form_state['ajax_commands'][] = ctools_modal_command_dismiss(); }
/** * Implements hook_init(). */ function YOUR_MODULE_NAME_init() { drupal_add_js('misc/jquery.form.js'); drupal_add_library('system','drupal.ajax'); }
<a href="text/ajax/nojs/1234" class="use-ajax">ajaxリンク</a>
/** * Implements hook_init(). */ function test_module_init() { drupal_add_js('misc/jquery.form.js'); drupal_add_library('system','drupal.ajax'); } /** * Implementation of hook_menu() */ function test_module_menu() { $items['test/ajax/%/%']=array( // URLの2,3番目がクライアント側で生成 'page callback' => 'ajax_node_response', 'page arguments' => array(2,3), // URLの2,3番目の引数をコールバック関数に渡す 'access callback' => 'user_access', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); return $items; } function ajax_node_response($type="ajax", $nid=0){ $node = node_load( $nid, NULL, false ); $vnode = node_view($node); $output = theme('node', $vnode); if( $type="ajax" ){ $commands=array(); $commands[]=ajax_command_replace( '#block-system-main','<section id="block-system-main">'.$output.'</section>' ) ; $page = array( '#type' => 'ajax', '#commands' => $commands, ); ajax_deliver( $page ) ; // ajax対応ブラウザの結果 } else { $output = '<div id="content">'.$output.'</div>'; // ajax非対応ブラウザの結果 return $output; } }