josembell Posted June 21, 2019 Share Posted June 21, 2019 I'm trying to do an automatic upload of products using a SOAP API with Prestashop PHP coding. The product seems to be upload correctly, but the images are not rendering correctly in the frontoffice (the backoffice does). I've tried several pieces of code I found on the internet but none satisfied what I needed. I have a class named Jubaconfig.php where I execute the code to import the products. Each product is created by the following way: $product = new Product(); $product->name[1] = $productInfo->name; $product->reference = $productInfo->product_id; $product->description[1] = $productInfo->description; $product->description_short[1] = $productInfo->short_description; $product->active = 1; $product->condition = "new"; $product->id_tax_rules_group = 1; $product->id_manufacturer = 3; $product->id_category_default = 49; $product->add(); $product->save(); $product->addToCategories(array(49)); StockAvailable::setQuantity((int)$product->id, 0, $product->quantity); // Añadimos la imagen al producto $cover = true; $image_url = ($productInfo->additional_attributes[0]->value); var_dump($image_url); echo "<br>"; $image = new Image(); $image->id_product = $product->id; $image->position = Image::getHighestPosition($product->id) + 1; $image->cover = $cover; if (($image->validateFields(false, true)) === true && ($image->validateFieldsLang(false, true)) === true && $image->add()) { $image->associateTo($product->id_shop_default); if (!Jubaconfig::copyImg($product->id, $image->id, $image_url, 'products', false)) { $image->delete(); } } The function copyImg is the following: public function copyImg($id_entity, $id_image = null, $url = '', $entity = 'products', $regenerate = true) { $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; case 'categories': $path = _PS_CAT_IMG_DIR_ . (int) $id_entity; break; case 'manufacturers': $path = _PS_MANU_IMG_DIR_ . (int) $id_entity; break; case 'suppliers': $path = _PS_SUPP_IMG_DIR_ . (int) $id_entity; break; case 'stores': $path = _PS_STORE_IMG_DIR_ . (int) $id_entity; 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; } When I go to the Products section in the backoffice, the products are correctly uploaded, even the pictures. However, in the frontoffice, the products are still showing, but the images are not rendered because the image source is not the correct one. Tip: If I edit a recently added product and save it, the image starts displaying in the frontoffice. But what I need is to display all the images I imported without having to save each product one by one Link to comment Share on other sites More sharing options...
NemoPS Posted June 24, 2019 Share Posted June 24, 2019 What happens if you go to the image preferences and regenerate them after importing? Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now