Webformでテーブル形式にしたい

カテゴリ コンテンツの作成 コアバージョン 7.38 関連モジュール Webform

Webformはとても便利で、ある部分は標準ノード編集より使いやすい(ユーザーフレンドリー)なところがあり、U/Iの観点からノードを投稿するのではなく、一旦Webformで投稿し、自動的にノードを生成するような使い方もアリです。
Webform4からは、送信内容確認機能も追加され、Conditional(状態判定機能)、複数ページ機能と合わせると相当良いU/Iを作れます。

ただ、残念ながら、生成出力されるタグが<div>中心のため、表示崩れや、日本受けしないなどの理由から採用を躊躇してしまうこともあります。
CSSやテンプレートで頑張れば、それなりに対応できますが、Webform全てに対応するのは時間がかかります。

やはり、和風なテーブル表示形式に対応し、内容確認画面共々テーブル表示することで安定したフォームを作りたいものです。

コメント

ユーザー actbrain の写真

Webformのテーブル化は、下記手法で実現します。

1.hook_form_alter()でsubmission(フォーム)とpreview(内容確認)全体をテーブルでラップする。
2.各フォームを<tr>〜</tr>でラップする。

参考)下記のようなコードになります。

/**
* Implement hook_form_alter() {
*/
function モジュール名_form_alter(&$form, $form_state, $form_id) {
if (strpos($form_id, 'webform_client_form_') === 0) { // Webform client form?
// フォームをテーブル化する。
foreach (array('submitted', 'preview') as $type) {
if (isset($form[$type]) && is_array($form[$type])) {
$form[$type]['#prefix'] = '<table><tbody>';
$form[$type]['#suffix'] = '</tbody></table>';
_モジュール名_erase_title_display($form);
foreach ($form[$type] as $field_name => &$field) {
if (strpos($field_name, '#') !== 0 && is_array($field)) {
$label = $required = $display = $visibility = '';
if (isset($field['#title'])) {
$label = $field['#title'];
}
$required = !empty($field['#required']);
if ($required) {
$label .= '<span class="form-required" title="このフィールドは必須です。">*</span>';
}
if (!$label) {
$display = 'display: none;';
}
// tr.class.
$tr_class = str_replace('_', '=', $field_name).'-tr';
// th, td.
foreach (array('#prefix', '#suffix') as $t) {
if (!isset($field[$t])) {
$field[$t] = '';
}
}
$field['#prefix'] = str_replace(
array('[tr_class]', '[tr_style]', '[th_style]', '[label]'),
array($tr_class, $display, $visibility, $label),
'<tr class="[tr_class]" style="[tr_style]"><th style="[th_style]">[label]</th><td>'
).$field['#prefix'];
$field['#suffix'] .= '</td></tr>';
}
}
}
}
}
}

function _モジュール名_taxonomy_parents_push($tid) {
static $tree = array();
$term_name = '';
if ($term = taxonomy_term_load($tid)) {
$term_name = $term->name;

if (!isset($tree[$term->vid])) {
$tree[$term->vid] = array();
$t = taxonomy_get_tree($term->vid);
foreach ($t as $obj) {
$tree[$term->vid][$obj->tid] = $obj;
}
}
if (!empty($tree[$term->vid][$term->tid]->parents[0])) {
$term_name = _モジュール名_taxonomy_parents_push($tree[$term->vid][$term->tid]->parents[0]).($term_name? '-'.$term_name: '');
}
}
return $term_name;
}

ページ

OTHER FAQ

Drupal開発・運用の疑問/質問の答えはここに

無料ユーザー登録すると質問できます。

カテゴリ Core Ver. 関連モジュール タイトル
ユーザ 7.34 ip_ranges ログインアタック対策は?
JavaScript 7.34 PHP PHPからJavaScriptに変数値を渡したい
コンテンツの作成 7.31 CKEditor CKEditorの新規生成ダイアログ内の初期値の変更
サイトの構築 7.31 Views ブロックViewsの絞り込みが表示されない
言語 7.28 vim vimで全角が化けてしまう
GoogleMaps 7.28 Javascript IE9でGoogle Map APIを利用した住所情報所得がうまくゆかない
アップデート 7.28 Views Pagerが表示されなくなった
アップデート 7.28 DisableMessages モジュールのアップデートガイダンスを非表示にしたい
ユーザの管理 7.27 PHP 新規ユーザーの追加ができない
サイトの構築 7.27 Context block ページ別、カテゴリ別等でブロックの表示有無を簡単にするには
チューニング 7.26 PHP DrupalはNginxで動く?
排他 7.26 lock Viewsモジュールの設定ページのような排他機能
コンテンツの作成 7.26 PHP ノード内の一部(フィールド)を変更する
テーマ 7.23 hook ページや状況によってテーマを切り替える
ユーザ 7.23 User 長い投稿者名の表示が切れる
サイトの環境設定 7.23 Image Style 画像スタイルの使い方(Crop)
サイトの構築 7.23 Conditional fields ノード編集フォームを動的にしたい
コンテンツの作成 7.23 maxlength テキストフィールドの最大長のチェック&カウントダウン
ユーザ 7.23 PHP user_load_multiple()の復帰値
ブロック 7.23 伸縮するfieldsetブロックを追加したい

ページ