Obsługa dodatkowych formatów plików w dostosowywaniu produktu w Prestashop 1.7 AI, CDR, PSD, PDF dla konfigurowalnych produktów (customized products) w Prestashop 1.7

Obsługa dodatkowych formatów plików w dostosowywaniu produktu w Prestashop 1.7 AI, CDR, PSD, PDF dla konfigurowalnych produktów (customized products) w Prestashop 1.7

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:

UPS! Trudne sprawy. Tym razem nie będzie zupełnie "za darmo".

Ten samouczek jest płatny. Wykup dostęp i wpisz hasło aby zapoznać się z całą treścią tutoriala.

Skontaktuj się z nami aby wykupić dostęp!

Przewiń do góry