Jump to content

How to add image to product object in Prestashop 1.7


Recommended Posts

I write a custom module to create product, import product. Everything is fine but I have a problem with link to product image. When I check the link to product image in source view, when I see the front of the shop the link is:

    http://example.com/30-home_default/Array.jpg

There is an array in the URL because prestashop get in from:

    $product->link_rewrite = $link_rewrite;

And the $link_rewrite has two index (two language). How to resolved this problem ?  

  public function createProductsObject($productID, $productName, $price, $weight, $category, $description, $link_rewrite, $singleStock, $getCategoryID, $getImages, $attrs) {
            $product = new Product;
            $product->name = $productName;
            $product->ean13 = '';
            $product->reference = '';
            $product->id_category_default = $getCategoryID;
            $product->category = $getCategoryID;
            $product->indexed = 1;
            $product->description = $description;
            $product->condition = 'new';
            $product->redirect_type = '404';
            $product->visibility = 'both';
            $product->id_supplier = 1;
            $product->link_rewrite = $link_rewrite;
            $product->quantity = $singleStock;
            $product->price = round($price - (18.69 / 100) * $price, 2);
            $product->active = 1;
            $product->psoft_hurtobergamo_id = $productID;
            $product->add();
    
    
            $product->addToCategories($getCategoryID);
    
            $shops = 1;
            $count = 0;
            
            
            foreach ($getImages->children() AS $image) {
                $url = $image->attributes()->url->__toString();
    
                $id_product = $product->id;
                $image = new Image();
                $image->id_product = $id_product;
                $image->position = Image::getHighestPosition($id_product) + 1;
    
                if ($count == 0) {
                    $image->cover = true;
                    $count = 1;
                } else {
                    $image->cover = false;
                }
    
                if (($image->validateFields(false, true)) === true &&
                        ($image->validateFieldsLang(false, true)) === true && $image->add()) {
                    if (Configuration::get('PSOFT_HURTO_BERGAMO_THUMB') == '0') {
                        $productThumb = false;
                    } else {
                        $productThumb = true;
                    }
                    $image->associateTo($shops);
                    if (!self::copyImg($id_product, $image->id, $url, 'products', $productThumb)) {
                        $image->delete();
                    }
                }
            }


        protected static function copyImg($id_entity, $id_image = null, $url, $entity = 'products', $regenerate = false) {
            $tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'ps_import');
            $watermark_types = explode(',', Configuration::get('WATERMARK_TYPES'));
    
            switch ($entity) {
                default:
                case 'products':
                    $image_obj = new Image($id_image);
                    $path = $image_obj->getPathForCreation();
                    break;
            }
    
            $url = urldecode(trim($url));
            $parced_url = parse_url($url);
    
            if (isset($parced_url['path'])) {
                $uri = ltrim($parced_url['path'], '/');
                $parts = explode('/', $uri);
                foreach ($parts as &$part) {
                    $part = rawurlencode($part);
                }
                unset($part);
                $parced_url['path'] = '/' . implode('/', $parts);
            }
    
            if (isset($parced_url['query'])) {
                $query_parts = array();
                parse_str($parced_url['query'], $query_parts);
                $parced_url['query'] = http_build_query($query_parts);
            }
    
            if (!function_exists('http_build_url')) {
                require_once(_PS_TOOL_DIR_ . 'http_build_url/http_build_url.php');
            }
    
            $url = http_build_url('', $parced_url);
    
            $orig_tmpfile = $tmpfile;
    
            if (Tools::copy($url, $tmpfile)) {
    // Evaluate the memory required to resize the image: if it's too much, you can't resize it.
                if (!ImageManager::checkImageMemoryLimit($tmpfile)) {
                    @unlink($tmpfile);
                    return false;
                }
    
                $tgt_width = $tgt_height = 0;
                $src_width = $src_height = 0;
                $error = 0;
                ImageManager::resize($tmpfile, $path . '.jpg', null, null, 'jpg', false, $error, $tgt_width, $tgt_height, 5, $src_width, $src_height);
                $images_types = ImageType::getImagesTypes($entity, true);
    
                if ($regenerate) {
                    $previous_path = null;
                    $path_infos = array();
                    $path_infos[] = array($tgt_width, $tgt_height, $path . '.jpg');
                    foreach ($images_types as $image_type) {
                        $tmpfile = self::get_best_path($image_type['width'], $image_type['height'], $path_infos);
    
                        if (ImageManager::resize($tmpfile, $path . '-' . stripslashes($image_type['name']) . '.jpg', $image_type['width'], $image_type['height'], 'jpg', false, $error, $tgt_width, $tgt_height, 5, $src_width, $src_height)) {
    // the last image should not be added in the candidate list if it's bigger than the original image
                            if ($tgt_width <= $src_width && $tgt_height <= $src_height) {
                                $path_infos[] = array($tgt_width, $tgt_height, $path . '-' . stripslashes($image_type['name']) . '.jpg');
                            }
                            if ($entity == 'products') {
                                if (is_file(_PS_TMP_IMG_DIR_ . 'product_mini_' . (int) $id_entity . '.jpg')) {
                                    unlink(_PS_TMP_IMG_DIR_ . 'product_mini_' . (int) $id_entity . '.jpg');
                                }
                                if (is_file(_PS_TMP_IMG_DIR_ . 'product_mini_' . (int) $id_entity . '_' . (int) Context::getContext()->shop->id . '.jpg')) {
                                    unlink(_PS_TMP_IMG_DIR_ . 'product_mini_' . (int) $id_entity . '_' . (int) Context::getContext()->shop->id . '.jpg');
                                }
                            }
                        }
                        if (in_array($image_type['id_image_type'], $watermark_types)) {
                            Hook::exec('actionWatermark', array('id_image' => $id_image, 'id_product' => $id_entity));
                        }
                    }
                }
            } else {
                @unlink($orig_tmpfile);
                return false;
            }
            unlink($orig_tmpfile);
            return true;
        }
    
        protected static function get_best_path($tgt_width, $tgt_height, $path_infos) {
            $path_infos = array_reverse($path_infos);
            $path = '';
            foreach ($path_infos as $path_info) {
                list($width, $height, $path) = $path_info;
                if ($width >= $tgt_width && $height >= $tgt_height) {
                    return $path;
                }
            }
            return $path;
        }

I use a debug in Netbeans but I cant find how to resolved the problem.

Thanks

  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...