我有一个带有图片字段的内容类型。用户可以创建内容并上传图像。我想不允许用户在上传图像后更改/删除图像,但仍然在节点编辑表单上显示图像。所以我只需要禁用/删除图像字段中的“删除”按钮。 我尝试了以下(通过hook_form_alter),但它不起作用:
$form['field_image']['#disabled'] = TRUE;
以下作品,但它完全隐藏了图像元素,这不是我追求的目标:
$form['field_image']['#access'] = FALSE;
请帮助找到解决方法。
答案 0 :(得分:4)
您必须使用hook_field_widget_form_alter函数,并在其中使用dpm()查找变量详细信息,然后使用Forms API中的属性更改按钮。
但我建议在编辑表单上make the widget field read only,而不是删除删除按钮。
// Hide remove button from an image field
function MYMODULE_field_widget_form_alter(&$element, &$form_state, $context) {
// If this is an image field type
if ($context['field']['field_name'] == 'MY_FIELD_NAME') {
// Loop through the element children (there will always be at least one).
foreach (element_children($element) as $key => $child) {
// Add the new process function to the element
$element[$key]['#process'][] = 'MYMODULE_image_field_widget_process';
}
}
}
function MYMODULE_image_field_widget_process($element, &$form_state, $form) {
//dpm($element);
// Hide the remove button
$element['remove_button']['#type'] = 'hidden';
// Return the altered element
return $element;
}
有用的问题:
答案 1 :(得分:1)
您也可以使用hook_form_alter和after_build函数
来完成// hook_form_alter implementation
function yourmodule_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'your_form_id':
$form['your_file_field'][LANGUAGE_NONE]['#after_build'][] = 'yourmodule_hide_remove_button';
break;
}
}
// after_build function
function yourmodule_hide_remove_button($element, &$form_state) {
// if multiple files are allowed in the field, then there may be more than one remove button.
// and we have to hide all remove buttons, not just the one of the first file of the field
//
// Array
// (
// [0] => 0
// [1] => 1
// [2] => #after_build
// [3] => #field_name
// [4] => #language
// [5] => ...
// )
//
// the exemple above means we have 2 remove buttons to hide (2 files have been uploaded)
foreach ($element as $key => $value){
if (is_numeric($key)){
unset($element[$key]['remove_button']);
} else break;
}
return $element;
}