0

フォーム内の唯一の要素である単純なマネージド ファイル フォーム要素があります。次のようになります。

$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,
);

hook_menu で drupal_get_form コールバックを使用してフォームをレンダリングすると、参照ボタンとアップロード ボタンを備えた完全に形成された 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 を使用してフォームをレンダリングする場合、2 番目のシナリオでフォームが異なって見えるのはなぜですか? フォーム全体を取得する方法はありますか? フォームを渡し、dpm を使用してさまざまな段階でフォームを印刷するさまざまな方法を試しましたが、ここからどこに行けばよいかわかりません。

標準のファイル アップロード フィールドは、他のフォーム要素と同様に正しくレンダリングされます。managed_file 要素に限定されているようです。

4

1 に答える 1

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;
于 2015-03-27T12:46:27.713 に答える