Импорт фото товаров со стороннего сайта

Есть партнерский сайт, с него есть ссылки на фото картинок. Есть файл соответствий артикул - картинка. На товаре может быть несколько картинок. Как можно загрузить все это богатство на наш сайт на cs-cart? Вариант предварительно скачать и поместить в локальную папку не рассматриваю: товаров много, файлов с картинками еще больше. Нужно забирать фото программно.
Я ни капли не php-программист. Попробовала написать скрипт, ориентируясь на форумы, но к результату не приблизилась… Прошу помощи.
Есть файл:
Артикул; URL картинки; тип загрузки (основная или дополнительная, A / M)
При выполнении вылетает ошибка:

Uncaught Error: Call to undefined function fn_update_product_image()

Код

<?php
define('AREA', 'A');
define('ACCOUNT_TYPE', 'admin');

require(dirname(__FILE__) . '/init.php');

$short_filename = "url_photo_import";
$data_filename = "/var/files/1/scripts/data/".$short_filename.".txt";
$log_filename =  "/var/files/1/scripts/logs/".$short_filename.".log";

if (file_exists($data_filename)) {
  $row = 1;
  if (($handle = fopen($data_filename, "r")) !== FALSE) {
  while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    $num = count($data);
        $row++;
    for ($c=0; $c < $num; $c++) {
        $data_c = preg_replace('/[\x00-\x1F\x7F\xEF\xBB\xBF]/', '', $data[$c]);
        $arr[]= $data_c;
    }
    }

foreach ($arr as $key => $value) {
    if($key % 3 == 0){
    $product_code = $arr[$key];
    $key = $key+1;
    $image_type = $arr[$key];
    $key = $key+1;
    $image_url = $arr[$key];

    $res = db_query('select product_id from ?:products where product_code = ?s', $product_code);
    if ($res -> num_rows > 0) {
      while ($row = $res -> fetch_assoc()) {
        $product_id = $row["product_id"];
      }
    } else {
      error_log("Данных нет по ".$product_code.PHP_EOL, 3, $log_filename);
    }
    // Взято с https://qna.habr.com/q/1261894?ysclid=ljcq24qgtz432235898
    //$image_url = 'http://example.com/image.jpg'; // URL-адрес изображения для товара
    $image_data = @file_get_contents($image_url); // Получить данные изображения по URL
        
    if ($image_data !== false) {
        $image_extension = pathinfo($image_url, PATHINFO_EXTENSION); // Получить расширение файла изображения
        $image_filename = $product_code . '.' . $image_extension; // Сформировать имя файла изображения
        $image_path = fn_update_product_image($product_id, $image_filename, $image_data); // Добавить изображение и получить путь к файлу
        if($image_type = "M"){
        fn_update_product_image_pairs($product_id, array($image_filename => array('main_pair' => true))); // Сделать изображение основным для товара
        } else {
        fn_update_product_image_pairs($product_id, array($image_filename => array('main_pair' => false))); // Сделать изображение основным для товара
        }
    }
    error_log($product_code.': ID='.$product_id.'; '.$image_url.'; '.$image_data.PHP_EOL, 3, $log_filename);

    }      
}

fclose($handle);

}

}

а если через старый импорт


файл должен подойти

1 лайк

Это надо копировать все картинки с партнерского сайта на наш руками. А у меня больше 10т номенклатуры :frowning:

А если экспортнуть с партнерского переделать шаблон и импортнуть себе на сайт, в любом случае придется ручками потрудиться.

там url на картинку как раз с партнерского сайта и можно использовать

1 лайк

Можете с базы данных экпорт товаров сделать и на ваш сайт импортнуть.

Ребята, я опять за помощью.
php не знаю. Нужно взять картинку по url и поставить ее в базу
Руками делаю текстовый файл. Артикул, тип картинки (первая или последующая), ссылка на картинку.

NAP;A;https://cdn1.ozone.ru/s3/multimedia-a/6123483538.jpg
NAP;M;https://cdn1.ozone.ru/s3/multimedia-9/6123483537.jpg
NAT;M;https://cdn1.ozone.ru/s3/multimedia-r/6123487659.jpg

К нему написала скрипт:

<?php
define('AREA', 'A');
define('ACCOUNT_TYPE', 'admin');
require(dirname(__FILE__) . '/init.php');

$short_filename = "url_photo_import";
$data_filename = "/var/files/1/scripts/data/".$short_filename.".txt";
$log_filename =  "/var/files/1/scripts/logs/".$short_filename.".log";

if (file_exists($data_filename)) {
  $row = 1;
  if (($handle = fopen($data_filename, "r")) !== FALSE) {
  while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    $num = count($data);
        $row++;
    for ($c=0; $c < $num; $c++) {
        $data_c = preg_replace('/[\x00-\x1F\x7F\xEF\xBB\xBF]/', '', $data[$c]);
        $arr[]= $data_c;
    }
    }

    error_log(date("m.d.y").' '.date("H:i:s").PHP_EOL, 3, $log_filename);

foreach ($arr as $key => $value) {
    if($key % 3 == 0){
    $product_code = $arr[$key];
    $key = $key+1;
    $image_type = $arr[$key];
    $key = $key+1;
    $image_url = $arr[$key];

    $res = db_query('select product_id from ?:products where product_code = ?s', $product_code);
    if ($res -> num_rows > 0) {
      while ($row = $res -> fetch_assoc()) {
        $product_id = $row["product_id"];
      }
    } else {
      error_log("Данных нет по ".$product_code.PHP_EOL, 3, $log_filename);
    }
    error_log($product_id." - ".$image_url, 3, $log_filename);
    
    $image_data = @file_get_contents($image_url); // Получить данные изображения по URL
            
    if ($image_data !== false) {
        $image_extension = pathinfo($image_url, PATHINFO_EXTENSION); // Получить расширение файла изображения
        $image_filename = $product_code . '.' . $image_extension; // Сформировать имя файла изображения
        $image_path = fn_update_image($product_id, $image_filename, $image_data); // Добавить изображение и получить путь к файлу
        error_log("1".$product_id.";".$image_filename.";".$image_path.PHP_EOL, 3, $log_filename);
        if($image_type = "M"){
        fn_update_image_pairs($product_id, array($image_filename => array('main_pair' => true))); // Сделать изображение основным для товара
        } else {
        fn_update_image_pairs($product_id, array($image_filename => array('main_pair' => false))); // Сделать изображение основным для товара
        }
    }
    error_log($product_code.': ID='.$product_id.'; '.$image_url.'; '.$image_data.PHP_EOL, 3, $log_filename);

    }      
}

fclose($handle);

}

}

В результате я получаю изображение, нахожу по моему коду product_id. А дальше упираюсь в функции и не знаю, как передать параметры. Как я понимаю мне нужны fn_update_image_pairs или fn_update_image. Нашла их в /app/functions

/**
 * Function creates or updates image
 *
 * @param array{name: string, path: string, params?: array<string, string>, size: int} $image_data Array with image data
 * @param int                                                                          $image_id   Image ID
 * @param string                                                                       $image_type Type (object) of image (may be product, category, and so on)
 * @param string                                                                       $lang_code  Two letters language code
 * @param bool                                                                         $is_clone   True if image is copied from an existing image object
 *
 * @return int Updated or inserted image ID. False on failure.
 */
function fn_update_image(array $image_data, $image_id = 0, $image_type = 'product', $lang_code = CART_LANGUAGE, $is_clone = false){}

/**
 * Create/Update image pairs (icon -> detailed image)
 *
 * @param array  $icons            Data of the object icon
 * @param array  $detailed         Data of the object detailed image
 * @param array  $pairs_data       Required image data for updating
 * @param int    $object_id        Object identifier
 * @param string $object_type      Object type
 * @param array  $object_ids       Used instead object identifier if there are several objects
 * @param bool   $update_alt_desc  True if image alt text should be updated
 * @param string $lang_code        Two-letter language code
 * @param bool   $from_exist_pairs True if image is copied from an existing image object
 *
 * @return array Identifiers updated images links
 */
function fn_update_image_pairs($icons, $detailed, $pairs_data, $object_id = 0, $object_type = 'product_lists', $object_ids = array(), $update_alt_desc = true, $lang_code = CART_LANGUAGE, $from_exist_pairs = false)
{}

Помогите с параметрами, пожалуйста :pray:, до счастливого хеппи-энда осталась пара шагов :slight_smile:

А зачем вы пишете это прям в базу? почему обычным импортом не импортируете?

1 лайк

Картинки не надо копировать, достаточно ссылок на них.

И можно не городить такую структуру.
Новый импорт воспринимает картинки все сразу перечисленные через ;

Артикул товара - https://cdn1.ozone.ru/s3/multimedia-a/6123483538.jpg;https://cdn1.ozone.ru/s3/multimedia-9/6123483537.jpg;https://cdn1.ozone.ru/s3/multimedia-r/6123487659.jpg

1 лайк

С ума сойти, насколько все было просто! Я с самого начала попробовала через стандартный импорт, но картинки не вставали. И начались мои мытарства… :frowning:
Все получилось, огромное спасибо всем, кто отвечал, помогал, советовал…

2 лайка