managed_file
フォームAPIタイプを使用して画像ファイルをアップロードしましたが、画像をアップロードした後、フィールドの横にサムネイルとして表示されません。レンダリングされるのは、画像へのリンクと小さなアイコンが付いた画像のファイル名です。
アップロード後に画像のサムネイルを表示するにはどうすればよいですか(コア画像フィールドの画像プレビューのように)?
また、デフォルトの画像を横に表示するにはどうすればよいですか(デフォルトの値がある場合)。
これは私のコードです:
$form['logo'] = array(
'#title' => t('Logo'),
'#type' => 'managed_file',
'#required' => TRUE,
'#default_value' => variable_get('logo', ''),
'#upload_location' => 'public://',
'#upload_validators' => array(
'file_validate_extensions' => array('gif png jpg jpeg'),
'file_validate_size' => array(0.3*1024*1024),
)
簡単な修正で問題を解決しました。テーマをフォーム要素「tbs_thumb_upload」に追加し、テーマファイルで、テーマファイルのコードに記載されているように要素を渡すことができます。
// THIS IS THE FILE FIELD
$form['logo'] = array(
'#type' => 'managed_file',
'#title' => t('Logo'),
'#description' => t('Allowed extensions: gif png jpg jpeg'),
'#upload_validators' => array(
'file_validate_extensions' => array('gif png jpg jpeg'),
// Pass the maximum file size in bytes
'file_validate_size' => array(1 * 1024 * 1024),
),
'#theme' => 'tbs_thumb_upload',
'#upload_location' => 'public://society/',
'#attributes' => array('default_image_path' => TBS_IMAGE_DEFAULT_SOCIETY)
);
// THIS IS THE THEME FILE : THEME : tbs_thumb_upload : Theme file code
if (!empty($form['#file'])) {
$uri = $form['#file']->uri;
$desc = FALSE;
}else {
$uri = $form['#attributes']['default_image_path'];
$desc = TRUE;
}
// Render form element
print drupal_render_children($form);
フィールドでテーマを定義し、コード構造をシミュレートして、アップロードした画像をプレビューします。私の解決策は次のとおりです、
$form['abc_field']['abc_filename'] = array(
'#type' => 'managed_file',
'#title' => t('abc image'),
'#upload_validators' => array(
'file_validate_extensions' => array('gif png jpg jpeg'),
'file_validate_size' => array(1 * 1024 * 1024),
),
'#theme' => 'abc_thumb_upload',
'#upload_location' => 'public://abc/'
);
あなたのhook_theme()で、
return array(
'abc_thumb_upload' => array(
'render element' => 'element',
'file' => 'abc.module',
));
あなたのtheme_abc_thumb_upload()で、
function theme_abc_thumb_upload($variables) {
$element = $variables['element'];
if (isset($element['#file']->uri)) {
$output = '<div id="edit-logo-ajax-wrapper"><div class="form-item form-type-managed-file form-item-logo"><span class="file">';
$output .= '<img height="50px" src="' . file_create_url($element['#file']->uri) . '" />';
$output .= '</span><input type="submit" id="edit-' . $element['#name'] . '-remove-button" name="' . $element['#name'] . '_remove_button" value="Remove" class="form-submit ajax-processed">';
$output .= '<input type="hidden" name="' . $element['#name'] . '[fid]" value="' . $element['#file']->fid . '">';
return $output;
}
}
寸法チェックについてこの検証 file_validate_image_resolution :
$form['logo'] = array(
'#title' => t('Logo'),
'#type' => 'managed_file',
'#required' => TRUE,
'#default_value' => variable_get('logo', ''),
'#upload_location' => 'public://',
'#upload_validators' => array(
'file_validate_extensions' => array('gif png jpg jpeg'),
'file_validate_size' => array(0.3*1024*1024),
'file_validate_image_resolution'=>array('100x100'),
)
削除ボタンのHTMLをハックしてもうまくいきません。画像を削除せずにページを更新します。代わりに、theme_image_widget
にあるコア画像フィールドのdocroot/modules/image/image.field.inc
コールバックからコピーしました。
/**
* Implements theme_mymodule_thumb_upload theme callback.
*/
function theme_mymodule_thumb_upload($variables) {
$element = $variables['element'];
$output = '';
$output .= '<div class="image-widget form-managed-file clearfix">';
// My uploaded element didn't have a preview array item, so this didn't work
//if (isset($element['preview'])) {
// $output .= '<div class="image-preview">';
// $output .= drupal_render($element['preview']);
// $output .= '</div>';
//}
// If image is uploaded show its thumbnail to the output HTML
if ($element['fid']['#value'] != 0) {
$output .= '<div class="image-preview">';
// Even though I was uploading to public:// the $element uri was pointing to temporary://system, so the path to the preview image was a 404
//$output .= theme('image_style', array('style_name' => 'thumbnail', 'path' => file_load($element['fid']['#value'])->uri, 'getsize' => FALSE));
$output .= theme('image_style', array('style_name' => 'thumbnail', 'path' => 'public://'.$element['#file']->filename, 'getsize' => FALSE));
$output .= '</div>';
}
$output .= '<div class="image-widget-data">';
if ($element['fid']['#value'] != 0) {
$element['filename']['#markup'] .= ' <span class="file-size">(' . format_size($element['#file']->filesize) . ')</span> ';
}
// The remove button is already taken care of by rendering the rest of the form. No need to hack up some HTML!
$output .= drupal_render_children($element);
$output .= '</div>';
$output .= '</div>';
return $output;
}
このテーマ関数を使用して、要素をレンダリングします。
/**
* Implements hook_theme().
*/
function mymodule_theme() {
return array(
'mymodule_thumb_upload' => array(
'render element' => 'element',
)
);
}
フォーム要素の定義:
$form['upload_image'] = array(
'#type' => 'managed_file',
'#default_value' => $value,
'#title' => t('Image'),
'#description' => t('Upload an image'),
'#upload_location' => 'public://',
'#theme' => 'mymodule_thumb_upload',
'#upload_validators' => array(
'file_validate_is_image' => array(),
'file_validate_extensions' => array('jpg jpeg gif png'),
'file_validate_image_resolution' => array('600x400','300x200'),
),
);
別のフォーム要素を追加して、画像プレビューのマークアップを含めます。以下のコードでは、$ vに対象のフォーム値が含まれています。特定のケースでは、ノードから、フォームの状態から、またはどこかからそれらをプルする場合があります。これは、配列にキャストされたファイルオブジェクトです。
// If there is a file id saved
if (!empty($v['fid'])) {
// If there is no file path, a new file is uploaded
// save it and try to fetch an image preview
if (empty($v['uri'])) {
$file = file_load($v['fid']);
// Change status to permanent so the image remains on the filesystem.
$file->status = FILE_STATUS_PERMANENT;
$file->title = $v['title'];
// Save.
file_save($file);
global $user;
file_usage_add($file, 'node', 'node', $user->uid);
$v = (array)$file;
}
$form['photos']['items'][$i]['preview']['#markup'] = theme(
'image_style',
array(
'style_name' => 'form_image_preview',
'path' => file_build_uri(file_uri_target($v['uri']))
)
);
}
ファイルのステータスを永続的に設定して再保存することに注意してください。これは、アップロードされた画像を正しくプレビューするためのものです。一時ストレージ内の画像に対して画像スタイルを生成することはできないため、それらにパーマとしてフラグを立てる必要があります。ユースケースとワークフローによっては、「孤立した」イメージに対処する必要がある場合があります。
私のフォーム構造($ form ['photos'] ['items'] [$ i])は、マルチエントリー画像フィールド用です。それらをまとめて drupal_add_tabledrag に入れるテーマテンプレートがあります。フォームの配列構造はおそらく異なります。