D6: drupal_render в форме вызывает различные проблемы (значение по умолчанию, идентификатор, выбор даты)

У меня проблема с drupal_render (при условии, что drupal_render - это правильный способ для меня получить то, что я хочу - не стесняйтесь исправлять меня =).

Я строю форму. Поскольку FAPI не предоставляет поле таблицы, я хочу создать его самостоятельно. Мой подход: используйте функцию theme(), в частности theme ('table',...) или theme_table(), и заполните ее соответствующими полями формы (с намерением добавить функциональность AHAH позже). Это заставляет меня использовать drupal_render в качестве значения для ячеек таблицы, что вызывает некоторые проблемы с элементами формы.

Таблица собирает количество сотрудников по годам, для организации, которую пользователь редактирует в данный момент. Код выглядит следующим образом:

$form['employees'] = array(
  '#type' => 'fieldset',
  '#title' => t('Employees'),
  '#collapsible' => TRUE,
  '#collapsed' => FALSE,
);

$employee_query = db_query("SELECT * FROM {employees} WHERE  id_organisation = %d", $org['idoOrganisation']);
$employee = array();
while ($row = db_fetch_array($employee_query)) {
    $employee[] = $row;
}

$header = array(
    t('Year'),
    t('Total'),
    t('Internal'),
    t('External'),
    t('Aerospace')
);

$em_delta = 0;
$rows = array();

foreach($employee as $em_delta => $value) {
    $form['employees'][$em_delta]['year'] = array(
        '#title' => '',
        '#type' => 'date_select', // Comes with the date module
        '#date_format' => $format_year,
        '#date_label_position' => 'within',
        '#date_year_range' => '-50:+3',
        '#default_value' => $value[$em_delta]['year'],
        '#id' => 'edit-employees-' . $em_delta . '-year', // Allready a quickfix, since the form is rendered without id
        '#name' => 'employees['.$em_delta.'][year]', // Same here
    );      
    $form['employees'][$em_delta]['total'] = array(
        '#type' => 'textfield',
        '#title' => '',
        '#default_value' => $value['total'],,
        '#size' => 1,
        '#id' => 'edit-employees-' . $em_delta . '-total', 
        '#name' => 'employees['.$em_delta.'][total]'
    );
    $form['employees'][$em_delta]['internal'] = array(
        '#type' => 'textfield',
        '#title' => '',
        '#default_value' => $value[$em_delta]['internal'],
        '#size' => 1,
        '#id' => 'edit-employees-' . $em_delta . '-internal', 
        '#name' => 'employees['.$em_delta.'][internal]',
    );
    $form['employees'][$em_delta]['external'] = array(
        '#type' => 'textfield',
        '#title' => '',
        '#default_value' => $value[$em_delta]['external'],
        '#size' => 1,
        '#id' => 'edit-employees-' . $em_delta . '-external', 
        '#name' => 'employees['.$em_delta.'][external]',
    );      
    $form['employees'][$em_delta]['aero'] = array(
        '#type' => 'textfield',
        '#title' => '',
        '#default_value' => $value[$em_delta]['aero'],
        '#size' => 1,
        '#id' => 'edit-employees-' . $em_delta . '-aero', 
        '#name' => 'employees['.$em_delta.'][aero]',
    );      

    $rows[] = array(
        drupal_render($form['employees'][$em_delta]['year']),
        drupal_render($form['employees'][$em_delta]['total']),
        drupal_render($form['employees'][$em_delta]['internal']),
        drupal_render($form['employees'][$em_delta]['external']),
        drupal_render($form['employees'][$em_delta]['aero']),
    );
}

$form['employees']['table'] = array (
    '#value' => theme('table', $header, $rows, array(), NULL)
);

Вот проблемы, с которыми я сталкиваюсь:

  • ID- и Name-Атрибуты элементов формы пусты. Я нашел что-то об этом на сайте drupal и помирился с этим (хотя я этого не понимаю), установив эти атрибуты вручную.
  • Значения по умолчанию текстовых полей игнорируются. Поля пусты. Когда я позволяю drupal_get_form визуализировать поле, отображается default_value. Кто-то здесь предложил вместо этого установить свойство #value, но потом я снова прочитал, что это нечто совершенно другое и может вызвать проблемы.
  • Поле date_select не отображается полностью. Обертки есть, однако поле выбора появляется за пределами кода, прямо перед таблицей (то есть там, где оно появляется в коде).

Будем надеяться, что это так =) Кто-нибудь может помочь? Что я делаю неправильно?

1 ответ

Решение

Мой коллега отметил, что использование drupal_render в функции формы не является событием, удаленным от того, чтобы быть хорошей идеей, поскольку оно удаляет часть формы из всего процесса проверки и отправки.

Таким образом, выяснить, почему функция не работает должным образом, бесполезно. Лучшим подходом было бы просто сгенерировать необходимое количество полей формы, чтобы они отображались так, как они есть в drupal_get_form(), и позже использовать функцию-тему формы, чтобы поместить их в таблицу.

Тупой я =)

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