Forms API и получение данных из одинаковых строк (РЕШЕНО)

Главные вкладки

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 30 января 2009 в 4:01

Прошу прощения у уважаемого сообщества за свою надоедливость, но не могу решить очередную проблему при написании своего модуля. Я новичок в Друпал и пхп, поэтому алгоритмы решения вижу, а вот с семантикой проблемы. Курение Forms API, исходников чужих модулей и мануала по пхп, а также чтение соответствующих глав из книжек по пятому и шестому Друпалу, к сожалению, не помогли.

Суть такова. Есть форма, вида:
Имя 1 : Запах 1 : Вкус 1
Имя 2 : Запах 2 : Вкус 2
Имя 3 : Запах 3 : Вкус 3
и т.д.
и соответствующая таблица, в каждую строку которой вносится по одному имени, запаху и вкусу.
Поля «Имя» по свойствам идентичны между собой, «Запах» между собой тоже одинаковы, то же касается и «Вкуса».

Я написал модуль, который через хук _form рисует мне форму, а через _submit добавляет её значения в базу. Если отрисовываю только одну строку, данные прекрасно добавляются в таблицу, но мне этого недостаточно. Могу через while () нарисовать любое количество строк формы, но никак не могу сделать, чтобы при сабмите формы инсертились все строки, а не одна из них. Понимаю, что нужно цеплять идентификатор на каждую «строку» и создавать массив из «строк» формы, но не могу взять в толк, как с этим работать. Пожалуйста, ткните носом или подскажите, как это делается. Ужасно стыдно задавать наверняка простые вопросы, но у меня уже голова трещит от новой информации.

Модуль выглядит таким образом (публикую только нужные хуки):

function player_nameform() {
  $form['player_options'] = array(
    '#type' => 'value',
    '#value' => array(t('Ivan'), t('Stepan'), t('Metan'))
  );
  $form[$ordinal]['player_id'] = array(
    '#type' => 'select',
    '#options' => $form['player_options']['#value'],
    '#default_value' => '1',
  );
  $form[$ordinal]['player_number'] = array(
    '#type' => 'textfield',
    '#size' => 2,
    '#default_value' => '0',
  );
  $form[$ordinal]['player_in'] = array(
    '#type' => 'textfield',
    '#size' => 3,
    '#default_value' => '0',
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit')
  );
  return $form;
}
function player_nameform_submit($form, &$form_state) {
  $table = "player";
  $record = new stdClass();

  $record->pid = $form_state['values']['player_id'];
  $record->pnum = $form_state['values']['player_number'];
  $record->pin = $form_state['values']['player_in'];

  drupal_write_record($table, $record);
  drupal_set_message(t('Done!'));
}
function theme_player_nameform($form) {
  $output = drupal_render($form);
  return $output;
}

Заранее спасибо за помощь!

Комментарии

Аватар пользователя neochief neochief 30 января 2009 в 5:34

например так

function player_nameform() {
  $form['#size'] = 10;
 

  $form['player_options'] = array(
    '#type' => 'value',
    '#value' => array(t('Ivan'), t('Stepan'), t('Metan'))
  );
  for ($i = 0; $i < $form['#size']; $i++) {
    $form['player_id_'.$i] = array(
      '#type' => 'select',
      '#options' => $form['player_options']['#value'],
      '#default_value' => '1',
    );
    $form['player_number_'.$i] = array(
      '#type' => 'textfield',
      '#size' => 2,
      '#default_value' => '0',
    );
    $form['player_in_'.$i] = array(
      '#type' => 'textfield',
      '#size' => 3,
      '#default_value' => '0',
    );
  }
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit')
  );
  return $form;
}
function player_nameform_submit($form, &$form_state) {
  $table = "player";
  $record = new stdClass();
  for ($i = 0; $i < $form['#size']; $i++) {
    $record->pid = $form_state['values']['player_id_'.$i];
    $record->pnum = $form_state['values']['player_number_'.$i];
    $record->pin = $form_state['values']['player_in_'.$i];
    drupal_write_record($table, $record);
  }
  drupal_set_message(t('Done!'));
}
function theme_player_nameform($form) {
  $output = drupal_render($form);
  return $output;
}

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 30 января 2009 в 13:49

Большое спасибо! Значит ларчик, как всегда, открывался просто — надо было имена элементов менять -) Почему мне это даже в голову не пришло? Я прогонял через цикл и добавлял все эти поля в филдсет с идентификатором $i, а потом старался обрабатывать эти филдсеты поочерёдно.

UPD Только что убедился — благодаря Вашему решению всё работает так, как я и хотел. Ещё раз большое Вам спасибо!
UPD2 Точно так же я реализовал и вывод формы в виде таблице в theme_player_nameform($form)