Dzisiaj pokażemy dość ciekawą modyfikację umożliwiającą obsługę dodatkowych formatów plików dla konfigurowalnych produktów (customized products) w Prestashop 1.7. Domyślnie Prestashop umożliwia obsługę jedynie ograniczonej listy formatów plików dla produktów z możliwością dostosowywania. Są to podstawowe formaty graficzne – to znaczy JPG, JPEG, PNG i GIF. Klient podczas zakupu konfigurowalnego produktu może wrzucić jedynie plik w określonych powyżej formatach. W innym wypadku zostanie poinformowany o niewłaściwym formacie pliku. Jest to co prawda prawidłowe zachowanie systemu, jednak ogranicza to znacznie możliwości sprzedawców, którzy np. prowadzą drukarnie i chcą umożliwić swoim klientom wrzucenie pliku np. w formacie AI (Adobe Illustrator), CDR (Corel Draw), PSD (Adobe Photoshop) czy dokumentów PDF.
Dopuszczanie jedynie podstawowych formatów plików to dość duże ograniczenie i utrudnienie dla takich sprzedawców, którzy muszą prosić klienta o dosłanie odpowiedniego pliku poza systemem – może być to dość uciążliwe – dlatego zdecydowaliśmy się napisać ten prosty tutorial, który rozwiązuje tą niedogodność. Dzięki tej modyfikacji możesz dopuścić dowolny format pliku dla konfigurowalnych produktów (customized products) w Prestashop 1.7.
UWAGA! Pamiętaj, że wszystkie zmiany w plikach sklepu dokonujesz na własne ryzyko i odpowiedzialność! Zawsze możesz skorzystać z płatnych modułów które taki problem rozwiązują, być może w bardziej elegancki sposób natomiast my pokażemy prostą i bezpieczną modyfikację która jest tańszą alternatywą dla takich modułów.
Zaczynamy!
Właściwa część modyfikacji będzie rozgrywana w controllers/front/ProductController.php
Funkcja, która nas interesuje to pictureUpload(). Funkcję zmodyfikujemy w całości i w sprytny sposób dopuścimy dodatkowe, określone przez nas formaty plików .ai, .cdr, .psd, .pdf. Funkcja pictureUpload() przed modyfikacją ma mniej więcej poniższy kształt (w zależności od wersji Prestashop):
protected function pictureUpload()
{
if (!$field_ids = $this->product->getCustomizationFieldIds()) {
return false;
}
$authorized_file_fields = [];
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(mt_rand(0, mt_getrandmax()), true));
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[] = $this->trans('An error occurred during the image upload process.', [], 'Shop.Notifications.Error');
} elseif (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_ . $file_name . '_small', $product_picture_width, $product_picture_height)) {
$this->errors[] = $this->trans('An error occurred during the image upload process.', [], 'Shop.Notifications.Error');
} else {
$this->context->cart->addPictureToProduct($this->product->id, $indexes[$field_name], Product::CUSTOMIZE_FILE, $file_name);
}
unlink($tmp_name);
}
}
return true;
}
Zastępujemy tą funkcję w całości, zmodyfikowana wersja funkcji pictureUpload(), która realizuje nasze wszystkie założenia ma poniższy kształt: