我创建了一个带有相关图片字段的内容类型。 每个用户都能够看到此内容类型的所有节点的列表,并且应该能够在适当的字段中上传新图像。 我尝试了很多解决方案,但最后我正在尝试使用表单和托管文件。
在包含所有节点列表的页面中,我正在为每个节点创建一个带有表单的灯箱。 每个表单都是这样创建的:
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')。
我已经检查了所有内容,似乎每次都将正确的值传递给表单,所以我开始认为这可能是一个与我对表单的理解不足有关的问题。
尝试不同类型的方法会更好吗?
如果这有点混乱,谢谢,对不起......
答案 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));