Drupal 6: значения form_state пусты при отправке
Я пытаюсь создать пользовательскую форму в Drupal 6, и все, кажется, работает нормально с кодом ниже, в том числе при отправке создается новая запись в базе данных, однако все значения $form_state пусты. Что мне не хватает?
<?php
function rate_form($form_state) {
$form = array();
$form['rate']['name'] = array(
'#type' => 'textfield',
'#title' => t('Name'),
'#size' => 30,
'#maxlength' => 100,
'#required' => TRUE,
);
$form['rate']['description'] = array(
'#type' => 'textarea',
'#title' => t('blah, blah'),
'#maxlength' => 1500,
);
$form['rate']['submit'] = array('#type' => 'submit', '#value' => t('Rate!'));
return $form;
}
print drupal_get_form($form_id);
function rate_form_submit($form_id, &$form_state) {
db_query("INSERT INTO {rate_comments} (name, description) VALUES ('%s', '%s')", $form_state['values']['rate']['name'], $form_state['values']['rate']['description']);
drupal_set_message(t('Thank you! Your rating has been added.'));
}
?>
3 ответа
Если вы не укажете это, $form_state['values']
будет плоским массивом, а не вложенным, поэтому значения будут расположены по адресу:
$form_state['values']['name']
$form_state['values']['description']
Вы могли бы довольно легко отладить эту проблему, используя модуль devel. С этим активным вы могли бы сделать
function rate_form_submit($form_id, &$form_state) {
dpm($form_state);
//db_query("INSERT INTO {rate_comments} (name, description) VALUES ('%s', '%s')", $form_state['values']['rate']['name'], $form_state['values']['rate']['description']);
drupal_set_message(t('Thank you! Your rating has been added.'));
}
dpm - это функция, определенная devel, она создает хорошее визуальное представление переменной, где вы нажимаете, чтобы показать / скрыть значения внутри массивов и объектов класса. Используя эту информацию, вы сможете точно определить, где хранятся нужные вам значения. Это отличный инструмент в таких ситуациях, когда вы хотите проверять переменные во время выполнения.
У меня была та же проблема, и я обнаружил, что для того, чтобы иметь значение в виде массива вместо плоского значения, вы используете '#tree' => TRUE
в родительском элементе формы. http://drupal.org/node/751826