表单与托管文件表单错误的奇怪行为

时间:2012-08-07 17:21:23

标签: forms drupal

我创建了一个带有相关图片字段的内容类型。 每个用户都能够看到此内容类型的所有节点的列表,并且应该能够在适当的字段中上传新图像。 我尝试了很多解决方案,但最后我正在尝试使用表单和托管文件。

在包含所有节点列表的页面中,我正在为每个节点创建一个带有表单的灯箱。 每个表单都是这样创建的:

function coverupload_form($form, &$form_state, $uid, $relid) {

$form['#attributes']['id'] = 'coverup-'.$relid;

$form_state['storage']['rid'] = $relid;

$cliente = cataloghi_user_edit_get_cliente($uid);

$release = node_load($relid);

$form['cover'] = array(
    '#title' => 'Carica la cover per la release '.$release->title,
    '#description' => 'I file caricati devono avere estensione \'.jpeg\', risoluzione di 1440x1440 e dimensione massima di 5MB', 
    '#type' => 'managed_file',
    '#upload_location' => 'public://clienti/'.$cliente->title.'/cover',
    '#upload_validators' => array(
      'file_validate_extensions' => array('jpeg, jpg'),
      // Pass the maximum file size in bytes
      'file_validate_size' => array(5*1024*1024),
      'file_validate_image_resolution' =>array('1440x1440', '1440x1440'),
    ),
);


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


return $form;
}

function coverupload_form_submit($form, &$form_state) {

$file = file_load($form_state['values']['cover']);
// Change status to permanent.
$file->status = FILE_STATUS_PERMANENT;
// Save.
file_save($file);


$nodo = node_load($form_state['storage']['rid']);


$nodo->field_release_copertina['und'][0] = (array)$file;

 if($nodo = node_submit($nodo)) { // Prepare node for saving
    node_save($nodo);
 }

}

所有表格都有display:none,当用户点击封面上传按钮时,只有相应的表格会显示在灯箱中。

嗯,图像验证后一切正常。 图像未经验证时会出现问题(例如,如果图像低于1440x1440px)。

如果我使用检查器检查灯箱,则会生成正确数量的表单,但它们都引用相同的节点(例如,它们都具有id'coverup-17')。

我已经检查了所有内容,似乎每次都将正确的值传递给表单,所以我开始认为这可能是一个与我对表单的理解不足有关的问题。

尝试不同类型的方法会更好吗?

如果这有点混乱,谢谢,对不起......

1 个答案:

答案 0 :(得分:1)

我设法解决了这个问题。 这取决于我在同一页面上有多个相同表单的实例。

我实现了hook_forms()。

function mymodule_forms($form_id, $args) {
  $forms = array();
  if(strpos($form_id, 'coverupload_form_') === 0) {
    $forms[$form_id] = array(
      'callback' => 'coverupload_form',
      'callback arguments' => array($args[0], $args[1]),
    );
  }

  return $forms;
}

然后我将表单调用改为

drupal_render(drupal_get_form('coverupload_form_'.$relid, $arg1, $arg2));