Pratinjau gambar setelah mengunggah menggunakan API Formulir


9

Saya mengunggah file gambar menggunakan managed_filetipe API Formulir, tetapi setelah mengunggah gambar itu tidak muncul sebagai thumbnail di samping bidang. Yang dirender adalah nama file gambar dengan tautan ke gambar dan ikon kecil.

Bagaimana cara menampilkan thumbnail gambar setelah mengunggahnya (seperti pratinjau gambar dari bidang Gambar inti)?

Juga bagaimana saya bisa menampilkan gambar default di sebelahnya (jika memiliki nilai default)?

Ini kode saya:

$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),
  )

Jawaban:


4

Saya telah menyelesaikan masalah dengan perbaikan sederhana. Anda dapat menambahkan tema ke elemen bentuk "tbs_thumb_upload" dan di file tema berikan elemen seperti yang disebutkan dalam kode file tema.

 // 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);

1
Akankah bagian terakhir dari kode dari if (!empty($form['#file'])) {ke `print drupal_render_children ($ form);` tulis dalam .tpl.phpfile? Jika tidak maka di mana saya harus menulis bagian ini?
Subhajyoti De

9

Tetapkan tema di lapangan, dan simulasikan struktur kode untuk melihat pratinjau gambar yang baru saja Anda unggah. Solusi saya adalah sebagai berikut,

$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/'
    );

Di hook_theme Anda (),

return array(
    'abc_thumb_upload' => array(
        'render element' => 'element',
        'file'           => 'abc.module',
));

Di theme_abc_thumb_upload () Anda,

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;
    }
}

3
Akan lebih baik untuk digunakan image_style_url('thumbnail', $element['#file']->uri)di tempat file_create_url($element['#file']->uri)- kode saat ini serius dapat merusak tata letak jika pengguna mengunggah sesuatu yang buruk.
Mołot

Ada solusi yang sangat mirip di sini: stackoverflow.com/questions/18997423/…
ognockocaten

4

tentang dimensi, periksa validasi ini 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'),
  )

3

Meretas HTML untuk menghapus tombol tidak berfungsi untuk saya. Halaman disegarkan tanpa menghapus gambar. Alih-alih, saya menyalin dari theme_image_widgetcallback bidang gambar inti yang ditemukan di 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;
}

Gunakan fungsi tema ini untuk merender elemen:

/**
* Implements hook_theme().
*/
function mymodule_theme() {
  return array(
    'mymodule_thumb_upload' => array(
      'render element' => 'element',
    )
  );
}

Definisi elemen bentuk:

$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'),
  ),
);

Yang ini harus menjadi jawabannya, akhirnya ajax bekerja, terima kasih !!!!
DarkteK

2

Tambahkan elemen formulir lain untuk berisi markup untuk pratinjau gambar Anda. Dalam kode di bawah ini, $ v berisi nilai formulir yang menarik. Kasing spesifik Anda dapat menarik mereka dari suatu simpul, dari keadaan formulir atau di tempat lain. Ini adalah objek file yang dilemparkan ke array.

// 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']))
    )
  );
}

Perhatikan bahwa saya mengatur status file ke permanen dan menyimpan kembali. Ini untuk gambar yang diunggah untuk dipratinjau dengan benar. Gaya gambar tidak dapat dibuat untuk gambar dalam penyimpanan sementara, jadi Anda harus menandainya sebagai perm. Bergantung pada kasus penggunaan dan alur kerja Anda, Anda mungkin harus mengatasi gambar "yatim".

Struktur formulir saya ($ form ['foto'] ['item'] [$ i]) adalah untuk bidang gambar multi-entri. Saya memiliki template tema yang mengumpulkan mereka dan meletakkannya di drupal_add_tabledrag . Struktur susunan formulir Anda kemungkinan akan berbeda.


terima kasih jason tapi saya pikir ini kalau-kalau saya punya data dan saya ingin melihatnya dalam bentuk (saya pikir $ v adalah objek yang memiliki uri dari gambar) Saya ingin membuat pratinjau gambar seperti di bidang gambar ketika mengunggah gambar menggunakan tombol unggah di sebelah bidang itu muncul di sebelah lapangan
Ahmed

Itu yang saya lakukan di sini. $ v adalah nilai item formulir. Selama penyegaran AJAX / AHAH formulir dibuat ulang dan nilainya akan digunakan untuk menampilkan gambar pratinjau di sebelah file yang baru diunggah. $ form ['photos'] ['items'] adalah pembungkus untuk "mengelompokkan" pratinjau Anda dan widget unggah file. $ form ['photos'] ['items'] [x] ['photo'] akan menjadi widget Anda.
Jason Smith

Saya tidak menggunakan AHAH (hanya Drupal 7 formulir api) dan sedang mengunggah menyegarkan Semua formulir
Ahmed

Tidak ada cara untuk melakukan ini yang saya tahu tidak menggunakan AJAX / AHAH, maaf saya tidak bisa membantu: /
Jason Smith
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.