0

私は 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 属性と名前属性が空です。私は drupal サイトでこれについて何かを見つけ、それで和解し (理解していませんが)、これらの属性を手動で設定しました。
  • テキスト フィールドのデフォルト値は無視されます。フィールドは空です。drupal_get_form にフィールドをレンダリングさせると、default_value が表示されます。このあたりの誰かが、代わりに #value-property を設定することを提案しましたが、これは完全に異なるものであり、問​​題を引き起こす可能性があることをもう一度読みました.
  • date_select-Field は、完全にはレンダリングされません。ラッパーはありますが、選択フィールドはコードの外、テーブルの直前 (つまり、コード内の場所) に表示されます。

それだけだといいのですが =) 誰か助けてくれますか? 私は何を間違っていますか?

4

1 に答える 1

0

私の同僚は、フォーム関数内で drupal_render を使用することは、検証と送信のプロセス全体からフォームの一部を削除するため、あまり良いアイデアではないことを指摘しました。

したがって、関数が意図したとおりに機能しない理由を突き止めても無駄です。より良いアプローチは、必要な量のフォーム フィールドを生成し、それらを drupal_get_form() 内でそのままレンダリングし、後でフォームのテーマ関数を使用してそれらをテーブルに配置することです。

愚かな私=)

于 2013-04-29T08:38:22.753 に答える