【问题标题】:Drupal 6 Form API not processing valuesDrupal 6 Form API不处理值
【发布时间】:2011-08-16 20:19:35
【问题描述】:

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

    $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。

【问题讨论】:

    标签: php forms drupal drupal-forms


    【解决方案1】:

    由于 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

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

    【讨论】:

    • 节省了我一天的调试时间。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    相关资源
    最近更新 更多