Form API'sını kullanarak yükledikten sonra görüntüyü önizleyin


9

managed_fileForm API türünü kullanarak bir görüntü dosyası yükledim , ancak görüntüyü yükledikten sonra alanın yanında küçük resim olarak görünmüyor. Oluşturulan, görüntüye bağlantı ve küçük bir simge içeren görüntünün dosya adıdır.

Görüntüyü yükledikten sonra küçük resmini nasıl gösterebilirim (ana Görüntü alanındaki görüntü önizlemesi gibi)?

Ayrıca yanında varsayılan bir resmi nasıl gösterebilirim (varsayılan bir değeri varsa)?

Bu benim kodum:

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

Yanıtlar:


4

Sorunu basit bir düzeltme ile çözdüm. "Tbs_thumb_upload" form öğesine bir tema ekleyebilir ve tema dosyasında, tema dosya kodunda belirtildiği gibi öğeyi verebilirsiniz.

 // 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
Kodun son bölümü if (!empty($form['#file'])) {`` yazdırma drupal_render_children ($ form); ` .tpl.phpdosyaya yazacak mı? Değilse, bu bölümü nereye yazmalıyım?
Subhajyoti De

9

Alandaki temayı tanımlayın ve az önce yüklediğiniz görüntüyü önizlemek için kod yapısını simüle edin. Benim çözümüm şu,

$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 () öğenizde,

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

Theme_abc_thumb_upload () öğenizde,

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
Daha iyi kullanmak için olurdu image_style_url('thumbnail', $element['#file']->uri)yerine file_create_url($element['#file']->uri)ciddi kullanıcının yüklemeler şey bad eğer düzeni kırabilir cari kod -.
Mołot

Burada çok benzer bir çözüm var: stackoverflow.com/questions/18997423/…
ognockocaten

4

boyut hakkında bu doğrulamayı kontrol edin 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

Kaldır düğmesi için HTML'yi kesmek benim için işe yaramıyor. Sayfa, görüntüyü kaldırmadan yenilenir. Onun yerine bulunan çekirdek görüntü alanının theme_image_widgetgeri aramasından kopyaladım 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;
}

Öğeyi oluşturmak için bu tema işlevini kullanın:

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

Form öğesi tanımı:

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

Bu bir cevap olmalı, sonunda ajax çalışır, thx u !!!!
DarkteK

2

Görüntü önizlemeniz için işaretlemeyi içerecek başka bir form öğesi ekleyin. Aşağıdaki kodda, $ v ilgi çekici form değerlerini içerir. Özel durumunuz onları bir düğümden, form durumundan veya başka bir yerden alabilir. Bir diziye atanan bir dosya nesnesidir.

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

Dosya durumunu kalıcı olarak ayarladığımı ve yeniden kaydettiğimi unutmayın. Bu, yüklenen görüntülerin doğru bir şekilde önizlenmesi içindir. Geçici depolamadaki görüntüler için görüntü stilleri oluşturulamaz, bu yüzden bunları perma olarak işaretlemeniz gerekir. Kullanım durumunuza ve iş akışınıza bağlı olarak, "artık" görüntüleri ele almanız gerekebilir.

Form yapım ($ form ['photos'] ['items'] [$ i]) çok girişli bir görüntü alanı içindir. Onları toplar ve drupal_add_tabledrag koyar bir tema şablonu var . Form dizisi yapınız büyük olasılıkla farklı olacaktır.


teşekkür ederim jason ama ben bir veri varsa ve formda görüntülemek istiyorum (Ben $ v görüntünün uri olan bir nesne olduğunu düşünüyorum) durumunda ben görüntü alanında olduğu gibi görüntünün bir önizleme yapmak istiyorum düşünüyorum alanın yanındaki yükle düğmesini kullanarak resmi yüklerken alanın yanında görünür
Ahmed

Burada yaptığım şey bu. $ v, form öğesinin değeridir. AJAX / AHAH yenilemesi sırasında form yeniden oluşturulur ve değer, yeni yüklenen dosyanın yanında önizleme görüntüsünü göstermek için kullanılır. $ form ['photos'] ['items'], önizleme ve dosya yükleme widget'ınızı "gruplamak" için bir sargıdır. $ form ['photos'] ['items'] [x] ['photo'] widget'ınız olacaktır.
Jason Smith

AHAH (sadece Drupal 7 form api) kullanmıyorum ve upload refresh Tüm form
Ahmed

AJAX / AHAH kullanmadığının farkında olduğumu bilmenin bir yolu yok, üzgünüm daha fazla yardım olamazdım: /
Jason Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.