Прошу прощения у уважаемого сообщества за свою надоедливость, но не могу решить очередную проблему при написании своего модуля. Я новичок в Друпал и пхп, поэтому алгоритмы решения вижу, а вот с семантикой проблемы. Курение Forms API, исходников чужих модулей и мануала по пхп, а также чтение соответствующих глав из книжек по пятому и шестому Друпалу, к сожалению, не помогли.
Суть такова. Есть форма, вида:
Имя 1 : Запах 1 : Вкус 1
Имя 2 : Запах 2 : Вкус 2
Имя 3 : Запах 3 : Вкус 3
и т.д.
и соответствующая таблица, в каждую строку которой вносится по одному имени, запаху и вкусу.
Поля «Имя» по свойствам идентичны между собой, «Запах» между собой тоже одинаковы, то же касается и «Вкуса».
Я написал модуль, который через хук _form рисует мне форму, а через _submit добавляет её значения в базу. Если отрисовываю только одну строку, данные прекрасно добавляются в таблицу, но мне этого недостаточно. Могу через while () нарисовать любое количество строк формы, но никак не могу сделать, чтобы при сабмите формы инсертились все строки, а не одна из них. Понимаю, что нужно цеплять идентификатор на каждую «строку» и создавать массив из «строк» формы, но не могу взять в толк, как с этим работать. Пожалуйста, ткните носом или подскажите, как это делается. Ужасно стыдно задавать наверняка простые вопросы, но у меня уже голова трещит от новой информации.
Модуль выглядит таким образом (публикую только нужные хуки):
$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;
}
Заранее спасибо за помощь!
Комментарии
например так
$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;
}
Большое спасибо! Значит ларчик, как всегда, открывался просто — надо было имена элементов менять -) Почему мне это даже в голову не пришло? Я прогонял через цикл и добавлял все эти поля в филдсет с идентификатором $i, а потом старался обрабатывать эти филдсеты поочерёдно.
UPD Только что убедился — благодаря Вашему решению всё работает так, как я и хотел. Ещё раз большое Вам спасибо!
UPD2 Точно так же я реализовал и вывод формы в виде таблице в theme_player_nameform($form)