0

我正在尝试使用以下代码动态生成表单元素(基于从 DB 检索到的数组):

    $form['stats'] = array
                            (
                                '#type' => 'fieldset',
                                '#title' => 'Statistics',
                                '#description' => 'Enter the data for the selected stat'
                            );

    $arrStats = _stats_getStats($player_id);
    if ($arrStats!=false)
    {

        foreach ($arrStats as $stat)
        {
            $arrVal = array();
            $player_stats = _stats_getPlayerStats($player_id, $stat->sid);
            if (!empty($player_stats))
                $arrVal = $player_stats;
            else
                $arrVal = _stats_getPositionStats ($position->nid, $stat->sid);

            $form['stats']['[nid:'.$stat->sid.']-1'] = array
                                    (
                                        '#type' => 'textfield',
                                        '#title' => $stat->siname." - 1",
                                        '#default_value' => $arrVal[0],
                                        '#description' => 'Enter 1',
                                    );
            $form['stats']['[nid:'.$stat->sid.']-2'] = array
                                    (
                                        '#type' => 'textfield',
                                        '#title' => $stat->siname." - 2",
                                        '#default_value' => $arrVal[1],
                                        '#description' => 'Enter 2',
                                    );
        }
    }

生成的 form_state['values] dpm 如下所示:(数组,54 个元素)

player-id (String, 2 characters ) 74
[nid:90]-1 (String, 0 characters )
[nid:90]-2 (String, 0 characters )
[nid:89]-1 (String, 0 characters )
[nid:89]-2 (String, 0 characters )
[nid:80]-1 (String, 0 characters )
[nid:80]-2 (String, 0 characters )
[nid:79]-1 (String, 0 characters )
[nid:79]-2 (String, 0 characters )
[nid:78]-1 (String, 0 characters )
[nid:78]-2 (String, 0 characters )
[nid:91]-1 (String, 0 characters )
[nid:91]-2 (String, 0 characters )
[nid:92]-1 (String, 0 characters )
[nid:92]-2 (String, 0 characters )
[nid:93]-1 (String, 0 characters )
[nid:93]-2 (String, 0 characters )
[nid:94]-1 (String, 0 characters )
[nid:94]-2 (String, 0 characters )
[nid:95]-1 (String, 0 characters )
[nid:95]-2 (String, 0 characters )
[nid:98]-1 (String, 0 characters )
[nid:98]-2 (String, 0 characters )
[nid:96]-1 (String, 0 characters )
[nid:96]-2 (String, 0 characters )
[nid:97]-1 (String, 0 characters )
[nid:97]-2 (String, 0 characters )
[nid:99]-1 (String, 0 characters )
[nid:99]-2 (String, 0 characters )
[nid:141]-1 (String, 0 characters )
[nid:141]-2 (String, 0 characters )
[nid:143]-1 (String, 0 characters )
[nid:143]-2 (String, 0 characters )
[nid:146]-1 (String, 0 characters )
[nid:146]-2 (String, 0 characters )
[nid:147]-1 (String, 0 characters )
[nid:147]-2 (String, 0 characters )
[nid:149]-1 (String, 0 characters )
[nid:149]-2 (String, 0 characters )
[nid:150]-1 (String, 0 characters )
[nid:150]-2 (String, 0 characters )
[nid:151]-1 (String, 0 characters )
[nid:151]-2 (String, 0 characters )
[nid:144]-1 (String, 0 characters )
[nid:144]-2 (String, 0 characters )
[nid:145]-1 (String, 0 characters )
[nid:145]-2 (String, 0 characters )
[nid:148]-1 (String, 0 characters )
[nid:148]-2 (String, 0 characters ) 

无论我在其中输入什么内容,所有动态生成的文本字段的值都为 0。

4

1 回答 1

0

由于 Drupal 表单 API 的设计方式,表单项的名称中不能有方括号。如果您将所有 [nid:...]-.. 更改为 nid:...-...,它将正常工作。

$form['stats'] = array(
  '#type'        => 'fieldset',
  '#title'       => 'Statistics',
  '#description' => 'Enter the data for the selected stat'
);

$arrStats = _stats_getStats($player_id);
if ($arrStats != false) {

  foreach ($arrStats as $stat) {
    $player_stats = _stats_getPlayerStats($player_id, $stat->sid);

    $arrVal = empty($player_stats) ? _stats_getPositionStats($position->nid, $stat->sid) : $player_stats;

    $form['stats']['nid:' . $stat->sid . '-1'] = array(
      '#type'          => 'textfield',
      '#title'         => $stat->siname." - 1",
      '#default_value' => $arrVal[0],
      '#description'   => 'Enter 1',
    );
    $form['stats']['nid:'.$stat->sid.'-2'] = array(
      '#type'          => 'textfield',
      '#title'         => $stat->siname." - 2",
      '#default_value' => $arrVal[1],
      '#description'   => 'Enter 2',
    );
  }
}

我还建议,如果您要制作复杂的表单,在层次结构中生成表单值非常有用,这样您就不需要基于 $form_state['values'] 数组的复杂结构看起来像您正在尝试构建的关键。

尝试这样的事情,并查看返回的值。

$form['stats'] = array(
  '#type'         => 'fieldset',
  '#title'        => 'Statistics',
  '#description'  => 'Enter the data for the selected stat',
  '#tree'         => TRUE,     // Set #tree here
);

$arrStats = _stats_getStats($player_id);
if ($arrStats != false) {

  foreach ($arrStats as $stat) {
    $player_stats = _stats_getPlayerStats($player_id, $stat->sid);

    $arrVal = empty($player_stats) ? _stats_getPositionStats($position->nid, $stat->sid) : $player_stats;

    $form['stats'][$stat->sid][1] = array(  // Use standard nested arrays here
      '#type'           => 'textfield',
      '#title'          => $stat->siname." - 1",
      '#default_value'  => $arrVal[0],
      '#description'    => 'Enter 1',
    );
    $form['stats'][$stat->sid][2] = array(  // and here
      '#type'           => 'textfield',
      '#title'          => $stat->siname." - 2",
      '#default_value'  => $arrVal[1],
      '#description'    => 'Enter 2',
    );
  }
}

通过在“stats”字段集中设置#tree,它告诉drupal 返回与表单相同的层次结构中的$form_state['values'],这使得处理这些值更加容易。无论如何,这是快速解释,更多信息可以在这里找到:http: //api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/6#tree

最后,以后在粘贴代码时,请确保缩进合理。它使阅读变得更加困难,人们回答的可能性也大大降低。

于 2011-08-17T01:23:11.863 回答