Drupal Form API - 使用foreach循环来构建表单

时间:2011-06-23 15:31:53

标签: php drupal foreach drupal-fapi

我正在构建一个Drupal模块,使用管理表单将图标绑定到特定页面。放置在某个目录中的每个图像都需要输出,旁边的选择框显示所有主要链接标题。

我使用foreach循环构建了表单但是当我在_submit函数中使用dpm($form);检查输出时,每个图像页面元素的#value总是等于为之设置的值最后一张图片。

这是我的代码:

function titleicon_admin_settings() {


  $settings = variable_get('titleicon_settings', $default);

  //build an array of primary link titles
  $primary_links_items = menu_primary_links();
  foreach ($primary_links_items as $item) {
    $title = $item['attributes']['title'];
    $href = $item['href'];
    $titles[$href] = $title;
  }

  //build array of icons
  $directory = file_directory_path() . '/icons';
  $mask = '(jpg|jpeg|gif|png|JPG|JPEG|GIF|PNG)';
  $icons = file_scan_directory($directory, $mask);



  foreach ($icons as $icon) {
    $name = $icon->name;
    $path = base_path() . $icon->filename;
    $html = '<img src="' . $path . '" width="50" height="50" />';
    $default_value = $settings[$name]['page'];

    $form[$name] = array(
      '#type' => 'fieldset',
      '#title' => $name,
    );

    $form[$name]['path_to_icon'] = array(
      '#type' => 'value',
      '#value' => $path, 
    );

    $form[$name]['icon'] = array(
      '#type' => 'markup',
      '#value' => $html, 
    );

    $form[$name]['page'] = array(
      '#type' => 'select',
      '#title' => t('Show icon on page'),
      '#default_value' => $default_value,
      '#description' => t('Choose which page to show icon on.'),
      '#options' => $titles,
    );
  }

  $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Save'), 
    );

  return $form;
}   

2 个答案:

答案 0 :(得分:6)

这很有道理。如果您的字段声明如下:

$form[$name]['path_to_icon'] = array(
  '#type' => 'value',
  '#value' => $path, 
);

然后为每个文件更新相同的变量 - 'path_to_icon'。字段集键“$ name”在这里无关紧要,因为它仅用于将表单字段分组在一起。

您需要使用更类似的内容:

$form[$name]['path_to_icon_'.$name] = array(
  '#type' => 'value',
  '#value' => $path, 
);

然后在发布表单后会得到多个值。

但是,说实话,我不会使用$ name作为变量名的元素,你应该更喜欢自动递增$ fid(文件表中的文件ID)或任何其他唯一的和SAFE标识符。文件...

答案 1 :(得分:2)

我必须说,如果你在字段集的声明中加上“ #tree =&gt; TRUE ”:

$form[$name] = array(
   '#type' => 'fieldset',
   '#title' => $name,
   '#tree' => TRUE
);

您不必在所有表单元素中添加“_'。$ name”。 Drupal会将所有表单结果分组为以$ name键入的数组。