6

我的自定义模块代码:

这是我的表格截图

  <?php
  function my_module_menu() {
  $items = array();

  $items['form-example'] = array( 
    'title' => 'My Module Form', 
    'description' => 'A form to mess around with.',
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('my_module_form'), 
    'access callback' => TRUE
  );
      
  return $items;
}

function my_module_form($form, &$form_state, $no_js_use = FALSE) {  
  
  $form['file'] = array(
        '#type' => 'file',
        '#title' => t('Image'),
        '#description' => t('Upload an image'),
  );
  
    $form['menu'] = array(
    '#markup' => '<b>Add More:</b>'
    );
    
      $form['#tree'] = TRUE;
      $form['names_fieldset'] = array(
        '#type' => 'fieldset',
        '#title' => t('Add more images'),
        '#prefix' => '<div id="names-fieldset-wrapper">',
        '#suffix' => '</div>',
      );

      if (empty($form_state['num_names'])) {
        $form_state['num_names'] = 1;
      }
      
      for ($i = 0; $i < $form_state['num_names']; $i++) {       
        $form['names_fieldset']['name'][$i][0]= array(
             '#title' => t('Image'),
             '#type' => 'file',
             '#weight' => '5',
             '#description' => t('Upload an image'),
        );
      }
          
      $form['names_fieldset']['add_name'] = array(
        '#type' => 'submit',
        '#value' => t('Add one more'),
        '#submit' => array('my_module_add_more_add_one'),
        '#ajax' => array(
          'callback' => 'my_module_add_more_callback',
          'wrapper' => 'names-fieldset-wrapper',
        ),
      );
      if ($form_state['num_names'] > 1) {
        $form['names_fieldset']['remove_name'] = array(
          '#type' => 'submit',
          '#value' => t('Remove one'),
          '#submit' => array('my_module_add_more_remove_one'),
          '#ajax' => array(
            'callback' => 'my_module_add_more_callback',
            'wrapper' => 'names-fieldset-wrapper',
          ),
        );
      }
  
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),    
  );
  
  $form['#submit'][] = 'my_module_add_more_submit';
    if ($no_js_use) {
    if (!empty($form['names_fieldset']['remove_name']['#ajax'])) {
      unset($form['names_fieldset']['remove_name']['#ajax']);
    }
    unset($form['names_fieldset']['add_name']['#ajax']);
  }    
  return $form;
} 


function my_module_add_more_callback($form, $form_state) {
  return $form['names_fieldset'];
}

function my_module_add_more_add_one($form, &$form_state) {
  $form_state['num_names']++;
  $form_state['rebuild'] = TRUE;
   //$form_state['no_redirect'] = TRUE;
}

function my_module_add_more_remove_one($form, &$form_state) {
  if ($form_state['num_names'] > 1) {
    $form_state['num_names']--;
  }
  $form_state['rebuild'] = TRUE;
}

function my_module_add_more_submit($form, &$form_state) {
    $file = $form_state['values']['file']."<br \>";
    $validators = array();
    $file = file_save_upload('file', $validators, 'public://uploads');  
    print_r($file);     
    exit();
}

 

当我提交表单时,我试图获取通过添加更多选项添加的图像的详细信息。但我无法得到它们。但是我只能获取第一张图片的详细信息(并且能够上传它)。

我想在这里知道两件事:

  1. 如何检索使用添加更多选项(字段集)添加的图像的详细信息,以及如何上传它们?
  2. 当我浏览并选择字段集中的图像时,添加另一个图像字段后,它不会保留在表单中。如何在字段集中保留选定的图像?
4

3 回答 3

5

看看这篇文章——http: //evolvingweb.ca/story/poutine-maker-introduction-field-api-drupal-7-part-1——因为它有一些关于你的代码中缺少的东西的信息。$三角洲。$delta 是分配给字段值的 id,即使您的字段只有 1 个项目。

于 2013-04-08T13:58:06.337 回答
4

当您 var_dump 您创建的文件字段时,您会看到什么?如果您获得所有信息以及使用“再添加一个”按钮添加的信息,则可以使用以下方法了解值的正确结构:echo "<pre>"; print_R($form_state['values']); echo "</pre>":

于 2013-04-10T05:18:28.457 回答
1

您的代码有几个问题。

第一个问题是您的提交功能仅处理第一个上传字段,该字段确实称为“文件”。但绝对没有处理其他领域。

第二个问题是,每次您单击“再添加一个”时,它都会上传并保存第一个字段,这将重复您的上传。如果没有 AJAX,你不会遇到这个问题,但如果你想添加它,你会的。

我将进行以下更改:

  1. 删除$form['#tree'] = TRUE并将其添加到字段集中。$form['names_fieldsets']['#tree'] = TRUE;当然,在您声明字段集之后。

  2. for将您在字段集中(循环内)声明文件字段的方式更改为:

    for ($i = 0; $i < $form_state['num_names']; $i++) {
      $form['names_fieldset'][$i]['name']= array(
        '#title' => t('Image'),
        '#type' => 'file',
        '#weight' => '5',
        '#description' => t('Upload an image'),
        // We need this to know which file element this is.
        // By default drupal would name all as files[names_fieldset]
        '#name' => 'files[names_fieldset_' . $i . '_name]',
      );
    }
    
  3. 我会像这样更改提交功能(请注意,我假设您也执行了我上面建议的更改):

    function my_module_add_more_submit($form, &$form_state) {
      if ($form_state['values']['op'] == 'Submit') {
        $validators = array();
        $files = array();
        if (!empty($_FILES['files']['name']['file'])) {
          $files[] = file_save_upload('file', $validators, file_default_scheme() . '://uploads');
        }
        foreach ($form_state['values']['names_fieldset'] as $name => $field) {
          if ($name != 'add_name') {
            $file_name = implode('_', $form['names_fieldset'][$name]['name']['#parents']);
            if (!empty($_FILES['files']['name'][$file_name])) {
              $files[] = file_save_upload($file_name, $validators, file_default_scheme() . '://uploads');
            }
          }
        }
      }
    }
    

通过这些更改,我们在树内设置了一个表单字段名称。我们仅在单击“提交”按钮时触发上传,并且仅针对实际添加了文件的表单字段。此外,我们使用默认方案上传,并不总是使用公共方案。

当然,代码需要一些消息让用户知道上传了多少文件、名称或任何其他认为有价值的信息。

于 2014-03-07T11:52:08.080 回答