Pourquoi mon formulaire a-t-il pour thème un tableau qui ne publie pas correctement les données ou ne s'affiche pas correctement?

10

J'ai créé un formulaire dans l'admin.

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

J'y ajoute ensuite chaque ligne comme:

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

}

Le formulaire a fière allure! Mais le premier problème est que la valeur attribuée à #default_valuen'apparaît pas dans le formulaire. Lorsque je le change à #valuela valeur correcte, s'affiche. Je me demande donc comment cela devrait être fait? La documentation Drupal dit #valuequ'il ne faut pas l'utiliser avec des formulaires bien qu'il fonctionne exactement comme je m'attendais à ce qu'il fonctionne.

Le problème principal est lorsque je remplis des données de test dans l'un des champs de texte et les soumets: je ne vois aucune des valeurs soumises dans ma _submitfonction.

Ni $formne $form_statecontient aucune des valeurs que je saisis dans les champs de texte.

Je me demande si c'est parce que je rends #theme => "table"? Quelqu'un at-il rencontré ce problème? Avez-vous des idées de modifications à apporter qui me permettraient de voir les valeurs que j'entre lorsque je poste le formulaire dans la _submitfonction?

dm03514
la source

Réponses:

13

Le problème est que vos éléments de champ de texte sont situés sous la #rowspropriété de votre tableau de rendu.

Drupal voit toute clé de tableau commençant par #comme une propriété / attribut, et toute clé de tableau ne commençant pas par cela comme un élément qui doit être récursivement traité. En tant que tel, les enfants que vous avez sous #rowsseront ignorés par le générateur de formulaire.

Étant donné theme_tableque s'exécutera sur le tableau de rendu, vos éléments de formulaire seront réellement affichés à l'écran, mais le formulaire n'aura aucune connaissance des valeurs (car ils ne sont pas techniquement des enfants du formulaire).

D'après mon expérience, la meilleure façon de faire ce genre de chose est d'utiliser une fonction de thème spécifique sur l'élément:

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

Ensuite, dans votre fonction de formulaire, vous utiliseriez du code comme le suivant

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

Après cela, vos champs de texte doivent être enregistrés dans le formulaire et vous devriez pouvoir voir la valeur dans le $form_statetableau comme normale.

Clive
la source
Merci pour votre réponse utile. 1 requête: Comment limiter mes 1000 résultats sur une seule page à 50 résultats dans une page et un pager pour la page suivante? J'ai des problèmes pour rendre le thème («pager») avec cela.
Himanshu Pathak