Элемент формы managed_file некорректно отображается

У меня есть простой управляемый элемент формы файла, который является единственным элементом моей формы. Выглядит это так:

$form['upload'] = array(
    '#type' => 'managed_file',
    '#title' => t('Select a YML file'),
    '#progress_message' => t('Please wait...'),
    '#progress_indicator' => 'bar',
    '#description' => t('Click "Browse..." to select a file to upload.'),
    '#required' => TRUE,
    '#upload_validators' => array('file_validate_extensions' => array('yml txt docx')),
    '#upload_location' => $upload_dest,
);

Когда я визуализирую форму с помощью обратного вызова drupal_get_form в hook_menu, я получаю идеально сформированное поле загрузки managed_file с кнопками просмотра и загрузки. Все меняется, когда я решаю добавить таблицу с информацией под формой. Для этого необходимо создать таблицу с использованием функций темы, а затем добавить ее в форму путем визуализации формы и добавления таблицы. Я создаю свою таблицу и добавляю ее в форму:

$rows = array();
foreach($yml_files as $yml_file){
    $rows[] = array($yml_file->uri, $yml_file->filename);
}
$output = drupal_render($form['upload']);
$output .= theme('table', array('header'=>$header, 'rows'=>$rows));
return $output;

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

Если Drupal использует drupal_render для рендеринга своих форм, почему форма будет выглядеть иначе во втором сценарии? Есть ли способ получить всю форму? Я пробовал различные способы передачи формы и использования dpm для печати формы на разных этапах, и я не уверен, что делать дальше.

Стандартные поля загрузки файлов отображаются правильно, как и другие элементы формы. Кажется, это ограничено элементом managed_file.


person Quint    schedule 25.03.2015    source источник


Ответы (1)


При использовании обратного вызова меню drupal_get_form вы должны вернуть свой $form массив, а не уже визуализированный тематический массив. Возможно, вам не хватает #attached js файлов для поля managed_file.

Что вы могли бы сделать в вашем случае, так это добавить вывод таблицы в поле markup вашей формы.

$form['upload'] = array(
    '#type' => 'managed_file',
    '#title' => t('Select a YML file'),
    '#progress_message' => t('Please wait...'),
    '#progress_indicator' => 'bar',
    '#description' => t('Click "Browse..." to select a file to upload.'),
    '#required' => TRUE,
    '#upload_validators' => array('file_validate_extensions' => array('yml txt docx')),
    '#upload_location' => $upload_dest,
);

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

return $form;
person Mike Vranckx    schedule 27.03.2015
comment
Извините - я думал, что удалил этот комментарий. Это даже не для этого форума (тупое копирование / вставка). Меня не было в офисе пару дней, и у меня не было возможности попробовать. Я попробую завтра. - person Quint; 29.03.2015
comment
Это действительно работает. Это не рекомендуемый метод, заключающийся в регистрации собственного обратного вызова и самостоятельной визуализации формы и таблицы с помощью обратного вызова темы (см. e9p.net/theming-drupal-7-form-elements-table). Но, похоже, это единственный способ, который подходит для моего варианта использования. Спасибо! - person Quint; 02.04.2015