フォームのテーマとして、データが正しく投稿されない、または正しく表示されないのはなぜですか?


10

管理者でフォームを作成しました。

$form['things'] = array(
  '#prefix' => '<div id="things">',
  '#suffix' => '</div>',
  '#tree' => TRUE,
  '#theme' => 'table',
  '#header' => array(t('Field Label'), t('Field Name'), t('Location'), t('Stuff')),
  '#rows' => array(),
);

次に、各行を次のように追加します。

foreach ($type_fields as $field_name => $attrs) {
  $stuff = array(
    '#type' => 'textfield',
    '#default_value' => $attrs['stuff'],
  );

$form['things']['#rows'][] = array(
  array('data' => 'label'),
  array('data' => $field_name),
  array('data' => $field_name),
  array('data' => $stuff),
);

}

かっこいいフォルム!しかし、最初の問題は、割り当てられた値#default_valueがフォームに表示されないことです。#value正しい値に変更すると、表示されます。だから、これはどうすればいいのでしょうか?Drupalのドキュメントは言う#value私が関数にそれを期待する正確にどのように機能しているが、フォームで使用するべきではありません。

主な問題は、テキストフィールドの1つにいくつかのテストデータを入力して送信するときです_submit。送信された値が関数に表示されません。

また、テキストフィールドに入力した値$form$form_state含まれていません。

これは私がレンダリングしているためなの#theme => "table"でしょうか?誰かがこの問題に遭遇しましたか?_submit関数にフォームを投稿するときに、入力している値を確認できるようにする変更に関するアイデアはありますか?

回答:


13

問題は、テキストフィールド要素が#rowsレンダー配列のプロパティの下にあることです。

Drupalは#、プロパティ/属性として始まるすべての配列キーと、それ以外で始まるすべての配列キーを、再帰的に処理する必要がある要素と見なします。そのため、取得した子#rowsはフォームビルダーによって無視されます。

以来theme_table、レンダリングアレイ上で実行され、フォーム要素がします実際に画面に出てレンダリングされますが、フォームは(彼らは技術的には、フォームの子ではないとして)の値のいずれかの知識を持っていません。

私の経験では、この種のことを行う最良の方法は、要素に特定のテーマ関数を使用することです。

function MYMODULE_theme() {
  return array(
    'MYMODULE_textfield_table' => array(
      'render element' => 'element'
    )
  );
}

function theme_MYMODULE_textfield_table($vars) {
  $element = $vars['element'];

  $rows = array();
  foreach (element_children($element) as $key) {
    $rows[] = array(
      array('data' => 'label'),
      array('data' => $element[$key]['#extra_data']['field_name']),
      array('data' => $element[$key]['#extra_data']['field_name']),
      array('data' => render($element[$key]))
    );
  }

  $header = array(t('Field Label'), t('Field Name'), t('Location'), t('Stuff'));
  return theme('table', array('header' => $header, 'rows' => $rows));
}

次に、フォーム関数で次のようなコードを使用します

$form['things'] = array(
  '#prefix' => '<div id="things">',
  '#suffix' => '</div>',
  '#tree' => TRUE,
  '#theme' => 'MYMODULE_textfield_table'
);

foreach ($type_fields as $field_name => $attrs) {
  $form['things'][] = array(
    '#type' => 'textfield',
    '#default_value' => $attrs['stuff'],
    '#extra_data' => array('field_name' => $field_name)
  );
}

その後、テキストフィールドがフォームに登録され、$form_state配列の値を通常どおりに表示できるはずです。


役立つ回答をありがとうございます。1つのクエリ:1つのページでの1000の結果を、次のページのページとページャーで50の結果に制限する方法 これでテーマ(「ページャー」)をレンダリングするのに問題があります。
Himanshu Pathak 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.