Jump to content

Edit History

jmauclair

jmauclair

 

Finally find a way to do this easily ;)

The packedproductID  is the ID of the new product and the productID is the ID of the original product, the one you want to take pictures.

function setProductImage($packedProductID, $productID)
{
    $packedProdImgs = getProductImage($packedProductID);
    foreach ($packedProdImgs as $imgs) {
        $image = new Image();
        $image->id_product = $productID;
        $image->position = $imgs['position'];
        if ($imgs['cover'] == 1) {
            $image->cover = true; // or false;
        } else {
            $image->cover = false;
        }
        if ($image->add()) {
            if (!copyImg($productID, $image->id, $imgs['url'], 'products', true)) {
                $image->delete();
            }
        }
    }
}

Aux functions :

 

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 = 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;
}

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;
}

These functions are normally available in AdminImportController

jmauclair

jmauclair

 

Finally find a way to do this easily ;)

The packedproductID  is the ID of the new product and the productID is the ID of the original product, the one you want to take pictures.

function setProductImage($packedProductID, $productID)
{
    $packedProdImgs = getProductImage($packedProductID);
    foreach ($packedProdImgs as $imgs) {
        $image = new Image();
        $image->id_product = $productID;
        $image->position = $imgs['position'];
        if ($imgs['cover'] == 1) {
            $image->cover = true; // or false;
        } else {
            $image->cover = false;
        }
        if ($image->add()) {
            if (!copyImg($productID, $image->id, $imgs['url'], 'products', true)) {
                $image->delete();
            }
        }
    }
}

Aux functions :

 

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 = 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;
}

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;
}

 

×
×
  • Create New...