Найти тему

Поиск и замена изображений по содержимому в Opencart

Есть у нас замечательный клиент, а у клиента есть не замечательные поставщики. И эти поставщики любят немного пошалить.

К примеру: Поставщик передает клиенту файл для выгрузки товаров на сайт, это конечно замечательно, честь им и хвала.

В файле выгрузки есть 2 столбца: "Основное изображение" и "Дополнительное изображение". Это тоже хорошо.

Но вот что плохо в столбце "Основное изображение" не всегда изображение товара. Иногда там попадается ссылка на "заглушку" и что самое обидное ссылка всегда разная. А вот в "дополнительных изображениях" такой проблемы нет.

Клиента как и нам, такой нюанс, немного раздражал. Клиенту не нравились заглушки, а нам не нравилось проверять 14 000 товаров и заменять изображения.

Как итог, клиент немного счастлив от того, что у него правильные изображения у товаров. И сильно счастлив от того, что не надо доплачивать за проверку 14 000 товаров.

Жадничать не будем поделимся черновым вариантом кода. В будущем планируем реализовать полноценный плагин для <b>Opencart</b>, который будет работать полностью автоматически и без необходимости корректировать код вручную. Но это уже потом=)


...

// Первичная проврерка работы функции
// if (compareImages($im1, $im2)) {
// echo "Они одинаковые!";
// } else {
// echo "Разные! Детей подминили!";
// }

// Получаем все уникальные имена файлов изображений
// WHERE product_id = 111 OR product_id = 222
$stmt = $pdo->query("SELECT product_id, image FROM `oc_product` LIMIT 14500,1500");
$data = $stmt->fetchAll();

$badproduct = array();

foreach ($data as $key => $value) {
$db_image = $main_file_path . $value['image'];
$db_image = str_replace("//", "/", $db_image);
if ($value['image'] != "" && file_exists($db_image)) {
// Вот тут сравниваем
if (compareImages($im1, $db_image)) {
$badproduct[] = $value["product_id"];
}
}
}

// Тут можно убрать foreach, чтобы он не проходился по каждому товару отдельно,
// а работал сразу с несколькими (для этого оставил другие foreach внутри)
foreach ($badproduct as $key => $value) {
$sql = 'SELECT * FROM `oc_product_image` WHERE `product_id` =' . $value;

$stmt2 = $pdo->query($sql);
$data2 = $stmt2->fetchAll();

// Один массив можно убрать и проходится по массиву ключей, пока просто руки не дошли
$id_deletes_nm_images = array();
$new_main_images_path = array();
$new_id_products_update = array();

// Если надо работать со всеми доп изображениями, то убираем foreach
// foreach ($data2 as $key => $value) {
if ($data2[0]['image'] != "") {
$id_deletes_nm_images[] = $data2[0]['product_image_id'];
$new_id_products_update[] = $data2[0]['product_id'];
$new_main_images_path[$data2[0]['product_id']] = $data2[0]['image'];
}
// }

// Чтобы убрать основное изображение просто из системы, то слудует поменять запрос
// $queryUpdate = "UPDATE `oc_product` SET image = '' WHERE product_id = ''";

// Меняем основное изображение на 1е из дополнительных
foreach ($new_main_images_path as $key => $value) {
$queryUpdate = "UPDATE `oc_product` SET `image` = '" . $value . "' WHERE `oc_product`.`product_id` = " . $key . "";
$pdo->query($queryUpdate);
}

// Удаляем первое дополнительное изображение
foreach ($id_deletes_nm_images as $key => $value) {
$queryDelete = 'DELETE FROM `oc_product_image` WHERE product_image_id = ' . $value . '';
$pdo->query($queryDelete);
...