2016-09-21 4 views
0

Я работаю с prestashop и позволяю пользователям загружать свои собственные файлы при добавлении продукта в корзину.PrestaShop: Сохраняйте имя и расширение файлов при загрузке настроек продукта (или, по крайней мере, расширения)

Я включил его на бэкэнд и на переднем конце, я следил за this tutorial, чтобы настроить его.

Вот блок кода, который обрабатывает вызовы ajax и загрузку файлов. Я бы хотел, чтобы оно сохраняло исходное имя и расширение файла, который пользователь дал ему, когда он загружается.

Возможно ли это?

var files = new Array(); 
$('.customizationUploadLine').find('input[type="file"]').on('change', prepareUpload); 
// Grab the files and set them to our variable 
function prepareUpload(event) 
{ 
    files.push({'name' : event.target.name, 'file' :event.target.files[0]}); 
} 



function previewFile(target, file) { 

    $('#uniform-'+target.attr('id')).before($('<img id="preview-'+target.attr('id')+'"/>')); 
    var preview = $('#preview-'+target.attr('id')); 
    var reader = new FileReader(); 

    preview.attr('width', 64); 

    reader.onloadend = function() { 
     preview.attr('src', reader.result); 
    } 

    if (file) { 
     reader.readAsDataURL(file); 
    } else { 
     preview.attr('src', ""); 
    } 
} 


$('#uploadTrigger').click(function(e) { 


    if(files.length > 0) 
    { 

     $('<div class="myoverlay"></div>').css({ 

      'position' : 'fixed', 
      'top' : 0, 
      'left' : 0, 
      'background' : 'black', 
      'background' : 'rgba(0,0,0,.5)', 
      'z-index' : 5999, 
      'width' : '100%', 
      'height' : '100%', 
      'cursor' : 'pointer' 
     }).appendTo('body'); 

     $('<div class="uploadingfiles">Your files are being uploaded...<img src="'+baseUri+'themes/default-bootstrap/img/ajax-loader.gif"></div>') 
      .css({ 
       'position' : 'absolute', 
       'top' : '30%', 
       'left' : '50%', 
       'width' : '300px', 
       'margin-left' : '-150px', 
       'text-align' : 'center', 
       'padding' : '10px', 
       'background' : 'white' 
      }) 
      .appendTo('.myoverlay'); 


     var data = new FormData(); 

     $.each(files, function(key, obj) 
     { 
      data.append(obj.name, obj.file); 
     }); 

     data.append('submitCustomizedDatas', 1); 
     data.append('ajax', 1); 
     $.ajax({ 
      url: $('#customizationForm').attr('action'), 
      type: 'POST', 
      data: data, 
      cache: false, 
      dataType: 'json', 
      processData: false, 
      contentType: false, 
      success: function(data, textStatus, jqXHR) 
      { 
       if(typeof data.errors === 'undefined') 
       { 
        $.each(files, function(key, obj) 
        { 
         $('input[name="'+obj.name+'"]').addClass('filled'); 
         previewFile($('input[name="'+obj.name+'"]'), obj.file); 

        }); 
        $('.uploadingfiles').text('Upload Complete!'); 
       } 
       else 
       { 
        $('.uploadingfiles').text('Error while uploading, please refresh the page and try again'); 
       } 
       $('.myoverlay').click(function(){$(this).remove()}); 
      }, 
      error: function(jqXHR, textStatus, errorThrown) 
      { 
       $('.uploadingfiles').text('ERRORS: ' + errorThrown); 
       $('.myoverlay').click(function(){$(this).remove()}); 
      } 
     }); 

    } // end checking files length 
    else alert('Nothing to upload!'); 
}); 

В настоящее время файловых добавлений в каталог загрузок (отлично!), Но он имеет очень напуганное имя без расширения, привязанного к нему. Я хотел бы, чтобы изображение сохраняло имя и расширение, чтобы я мог передать эту информацию на экран проверки и отобразить их загруженное изображение.

ответ

1

Возможно, но я не предлагаю это делать. Однако вам необходимо сделать переопределение ProductController, а именно метода pictureUpload().

Создать новый файл в prestashop/overidde/controllers/front/ имени ProductController.php с содержанием writed ниже:

class ProductController extends ProductControllerCore { 

    protected function pictureUpload() 
    { 
     if (!$field_ids = $this->product->getCustomizationFieldIds()) { 
      return false; 
     } 
     $authorized_file_fields = array(); 
     foreach ($field_ids as $field_id) { 
      if ($field_id['type'] == Product::CUSTOMIZE_FILE) { 
       $authorized_file_fields[(int)$field_id['id_customization_field']] = 'file'.(int)$field_id['id_customization_field']; 
      } 
     } 
     $indexes = array_flip($authorized_file_fields); 

     foreach ($_FILES as $field_name => $file) { 
      if (in_array($field_name, $authorized_file_fields) && isset($file['tmp_name']) && !empty($file['tmp_name'])) { 
       // $file_name = md5(uniqid(rand(), true));// Change this 
       $file_name = $file['name']; // In this 
       if ($error = ImageManager::validateUpload($file, (int)Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE'))) { 
        $this->errors[] = $error; 
       } 

       $product_picture_width = (int)Configuration::get('PS_PRODUCT_PICTURE_WIDTH'); 
       $product_picture_height = (int)Configuration::get('PS_PRODUCT_PICTURE_HEIGHT'); 
       $tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS'); 
       if ($error || (!$tmp_name || !move_uploaded_file($file['tmp_name'], $tmp_name))) { 
        return false; 
       } 
       /* Original file */ 
       if (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_.$file_name)) { 
        $this->errors[] = Tools::displayError('An error occurred during the image upload process.'); 
       } 
       /* A smaller one */ 
       elseif (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_.$file_name.'_small', $product_picture_width, $product_picture_height)) { 
        $this->errors[] = Tools::displayError('An error occurred during the image upload process.'); 
       } elseif (!chmod(_PS_UPLOAD_DIR_.$file_name, 0777) || !chmod(_PS_UPLOAD_DIR_.$file_name.'_small', 0777)) { 
        $this->errors[] = Tools::displayError('An error occurred during the image upload process.'); 
       } else { 
        $this->context->cart->addPictureToProduct($this->product->id, $indexes[$field_name], Product::CUSTOMIZE_FILE, $file_name); 
       } 
       unlink($tmp_name); 
      } 
     } 
     return true; 
    } 
} 

Теперь загруженный файл имеет такое же имя. Не забудьте удалить class_index.php в prestashop/cache/

Если вам необходимо расширение я думаю, что теперь это более легко сделать :)

+0

Спасибо! Вопрос: почему вы не рекомендовали бы это делать? Существует ли риск для безопасности? – Hanny

+0

Риск безопасности Я не думаю, но была удаленная (но не слишком) возможность того, что два клиента будут загружать файл с тем же именем, например. «1.jpg», остальное следует;) – sarcom

+0

Ах! Хорошая точка зрения. Возможно, я добавлю к нему дату/время, чтобы это не произошло. Спасибо за помощь! – Hanny