7 common.inc drupal_add_tabledrag($table_id, $action, $relationship, $group, $subgroup = NULL, $source = NULL, $hidden = TRUE, $limit = 0)
テーブル(表)要素にテーブルドラッグの javascript(マウスドラッグにより列の並び替えを行うスクリプト)を追加します。
ドラッグ可能なテーブルは、エンドユーザーが操作する必要のある、並べ替え可能なあらゆるリストに使用することができます。ドラッグ可能なテーブルは、テーブルの個々のセルに配置されたフォーム要素を、柔軟に操作します。
ウェイトを入力するセレクトボックスや、親子関係を含むフォーム要素などをドラッグ&ドロップのテーブルにセットするには、フォーム要素をテーブルの中に配置するようにします。そのテーブルにはID を指定してください。theme_table を使って ID を指定するには次のようにします。:
$output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'my-module-table'))); return $output;
フォームの生成に関しては、テーブルの同じカラムに出力されるグループ化された要素には、それを識別するためのクラスを指定します。
例えばテーブルで単一のカラムに対して並べ替えを行う場合、テーマ関数内ではこのように表現します。
$form['my_elements'][$delta]['weight']['#attributes']['class'] = array('my-elements-weight');
テーブルの各行には、ドラッグハンドルを有効化させるため、"draggable" クラスを指定します。
$row = array(...); $rows[] = array( 'data' => $row, 'class' => array('draggable'), );
ツリー構造が存在する場合、'tabledrag-leaf' と 'tabledrag-root' のクラスが使用できます。
drupal_add_tabledrag は次のようにコールします。
drupal_add_tabledrag('my-module-table', 'order', 'sibling', 'my-elements-weight');
もう少し複雑なケースとしては、単一のカラムがいくつかのグループに分かれている場合(ブロック管理ページ 'admin/structure/block' のリージョンのような場合)、これを識別するためのサブグループ用のクラスが必要です。
$form['my_elements'][$region][$delta]['weight']['#attributes']['class'] = array('my-elements-weight', 'my-elements-weight-' . $region);
上のコードでは $group として 'my-element-weight' を渡し、追加の $subgroup として 'my-element-weight-' . $region を渡しています。これは各リージョンにおいてそれぞれ drupal_add_tabledrag をコールする必要があることを示しています。
foreach ($regions as $region) { drupal_add_tabledrag('my-module-table', 'order', 'sibling', 'my-elements-weight', 'my-elements-weight-' . $region); }
ツリー構造がある場合は、各行の親子関係、兄弟関係の情報に基づいてネストされるため、サブグループの指定は必要ありません。親子関係のテーブルについて詳しくは theme_menu_overview_form() を参照してください。
この関数は .tpl.php ファイル、テーマ関数、テンプレートプリプロセス関数などのテーマレイヤーでコールされることに注意してください。フォームの生成段階ではありません。drupal_add_js() 関数によって直接、これと同じ javascript をページに追加することが出来ますが、この関数によってテンプレートファイルをクリーンで読み易く保つことが出来ます。また tabledrag.js を誤って重複コールしてしまうことも防ぎます。