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, она создает хорошее визуальное представление переменной, где вы нажимаете, чтобы показать / скрыть значения внутри массивов и объектов класса. Используя эту информацию, вы сможете точно определить, где хранятся нужные вам значения. Это отличный инструмент в таких ситуациях, когда вы хотите проверять переменные во время выполнения.

Это может помочь

implode(arg(),'/');

У меня была та же проблема, и я обнаружил, что для того, чтобы иметь значение в виде массива вместо плоского значения, вы используете '#tree' => TRUEв родительском элементе формы. http://drupal.org/node/751826

Другие вопросы по тегам