Чому моя форма тематизована як таблиця не публікує дані правильно або відображається правильно?


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не слід використовувати форми, хоча вона функціонує саме так, як я б очікував, що вона буде функціонувати.

Основна проблема полягає в тому, коли я заповнюю деякі тестові дані в одному з текстових полів і подаю їх: я не бачу жодного із поданих значень у своїй _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 запит: Як обмежити мої 1000 результатів на одній сторінці до 50 результатів на сторінці та пейджером для наступної сторінки? У мене виникають проблеми з рендерінгом теми ("пейджер") з цим.
Хіманшу Патхак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.