Warum wird mein Formular als Tabelle thematisiert, die Daten nicht korrekt veröffentlicht oder nicht korrekt angezeigt wird?

10

Ich habe im Admin ein Formular erstellt.

$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(),
);

Ich füge dann jede Zeile hinzu wie:

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),
);

}}

Die Form sieht gut aus! Das erste Problem ist jedoch, dass der zugewiesene Wert #default_valuenicht im Formular angezeigt wird. Wenn ich es auf #valueden richtigen Wert ändere, wird es angezeigt. Also frage ich mich, wie das gemacht werden soll? Die Drupal-Dokumentation besagt, #valuedass sie nicht mit Formularen verwendet werden sollte, obwohl sie genau so funktioniert, wie ich es erwarten würde.

Das Hauptproblem besteht darin, dass ich einige Testdaten in eines der Textfelder eingebe und abschicke: Ich sehe keinen der übermittelten Werte in meiner _submitFunktion.

Weder $formnoch $form_stateenthält es einen der Werte, die ich in die Textfelder eingegeben habe.

Ich frage mich, ob das daran liegt, dass ich rendere #theme => "table". Ist jemand auf dieses Problem gestoßen? Irgendwelche Ideen zu Änderungen, die ich vornehmen kann, damit ich die Werte sehen kann, die ich eingebe, wenn ich das Formular an die _submitFunktion sende ?

dm03514
quelle

Antworten:

13

Das Problem ist, dass sich Ihre Textfeldelemente unter der #rowsEigenschaft Ihres Render-Arrays befinden.

Drupal sieht jeden Array-Schlüssel, der mit beginnt, #als Eigenschaft / Attribut und jeden Array-Schlüssel, der nicht damit beginnt, als ein Element, das rekursiv behandelt werden muss. Daher werden die Kinder, unter denen Sie #rowssich befinden, vom Formularersteller ignoriert.

Da theme_tableläuft auf dem Feld machen, Ihre Formularelemente wird tatsächlich auf dem Bildschirm wiedergegeben werden, aber die Form wird keine Kenntnis der Werte (wie sie technisch nicht Kinder der Form sind).

Nach meiner Erfahrung besteht der beste Weg, dies zu tun, darin, eine bestimmte Themenfunktion für das Element zu verwenden:

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));
}

Dann würden Sie in Ihrer Formularfunktion Code wie den folgenden verwenden

$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)
  );
}

Danach sollten Ihre Textfelder im Formular registriert sein und Sie sollten den Wert im $form_stateArray wie gewohnt sehen können .

Clive
quelle
Vielen Dank für Ihre hilfreiche Antwort. 1 Abfrage: Wie beschränke ich meine 1000 Ergebnisse auf einer einzelnen Seite auf 50 Ergebnisse auf einer Seite und einen Pager für die nächste Seite? Ich habe Probleme damit, ein Thema ('Pager') damit zu rendern.
Himanshu Pathak