Magento2根据图片文件包导入产品图片

图片包给的图片文件是子产品的图片,如下图:A104255是主产品的sku

php 复制代码
<?php

/**
 * 根据图片包导入产品图片,包含子产品和主产品
 * 子产品是作为主图,主产品是作为附加图片
 */

use Magento\Framework\App\Bootstrap;

include('../app/bootstrap.php');
$bootstrap = Bootstrap::create(BP, $_SERVER);

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
/** @var \Magento\Framework\App\ResourceConnection $resource */
$resource = $objectManager->get('\Magento\Framework\App\ResourceConnection');
$connection = $resource->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);

$directory = $objectManager->get('\Magento\Framework\Filesystem\DirectoryList');

$obj = $bootstrap->getObjectManager();

$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('adminhtml');

/** @var  \Magento\Catalog\Model\ProductFactory $productFactory */
$productFactory = $objectManager->create('\Magento\Catalog\Model\ProductFactory');

/** @var  \Magento\Catalog\Model\ResourceModel\MediaImageDeleteProcessor $mediaImageDeleteProcessor */
$mediaImageDeleteProcessor = $objectManager->create('\Magento\Catalog\Model\ResourceModel\MediaImageDeleteProcessor');

$imageFolder = $directory->getRoot().'/pub/media/images_import';
$delUrl = $directory->getRoot().'/pub/media/catalog/product';

$existsSku = [];

try {
    // 指定搜索的文件夹和文件名进行搜索
    $folder = $imageFolder;
    //$fileName = $sku;
    $fileName = '*.jpg';

    // 执行搜索并获取结果数组
    $imgfiles = searchImagesInFolder($folder, $fileName);
    //print_r($imgfiles);die;

    if ($imgfiles) {
        foreach ($imgfiles as $imgfile) {
            try {
                $mainImagePath = $imgfile;
                if(is_file($mainImagePath)){
                    $pathArr = explode('/', $mainImagePath);
                    $imgName = end($pathArr);

                    $sku = explode('.', $imgName)[0];
                    if (in_array($sku, $existsSku)) continue;
                    //if ($sku != 'B302170-5g') continue;

                    //var_dump($sku);die;

                    $sql = $connection->select()->from('catalog_product_entity')
                        ->where('sku = ?', $sku);
                    $row = $connection->fetchRow($sql);
                    if (!$row) {
                        echo $sku,' 不存在',PHP_EOL;
                        continue;
                    }

                    $product = $productFactory->create()->loadByAttribute('sku',$sku);
                    $rowId = $product->getRowId();

                    if (strstr($sku, '-')){ #主图
                        #删除原有的图片
                        /*$del = $connection->fetchAll("SELECT * from catalog_product_entity_media_gallery where value_id in( select value_id from catalog_product_entity_media_gallery_value_to_entity where row_id='{$rowId}')");
                        foreach ($del as $key=>$value){
                            if (file_exists($delUrl.'/'.$value['value'])) {
                                unlink($delUrl . '/' . $value['value']);
                            }
                        }

                        # 删除产品和图片的关联关系
                        $connection->query("delete from catalog_product_entity_media_gallery where value_id in( select value_id from catalog_product_entity_media_gallery_value_to_entity where row_id='{$rowId}')");
                        $connection->query("delete from catalog_product_entity_media_gallery_value_to_entity where row_id='{$rowId}'");
                        $connection->query("delete from catalog_product_entity_varchar where row_id='{$rowId}' and attribute_id in(87,88,89)");*/

                        echo $sku,' 主图',PHP_EOL;
                        $product->setStoreId(0)->addImageToMediaGallery($mainImagePath, array('image', 'small_image', 'thumbnail'), false, false);
                    }

                    $product->save();

                    #作为主产品的附加图
                    $sku_master = explode('-', $sku)[0] ?? '';
//                    var_dump($sku_master);die;

                    if (!$sku_master) continue;
                    if (in_array($sku_master, $existsSku)) continue;

                    $sql = $connection->select()->from('catalog_product_entity')
                        ->where('sku = ?', $sku_master);
                    $row = $connection->fetchRow($sql);
                    if (!$row) {
                        echo $sku_master,' 不存在',PHP_EOL;
                        continue;
                    }

                    $product_master = $productFactory->create()->loadByAttribute('sku',$sku_master);
                    $rowId = $product_master->getRowId();

                    #主产品导完删除图片
                    $product_master->setStoreId(0)->addImageToMediaGallery($mainImagePath, [], true, false);
                    $product_master->save();
                    echo $sku_master,' 子图',PHP_EOL;
                }else{
                    echo $sku." skip\n";
                }
            } catch (\Exception $e){
                throw new Exception($e->getMessage());
            }
        }
    } else {
        echo "没有找到匹配的文件。",PHP_EOL;
    }

} catch (\Exception $e){
    echo $e->getMessage(),PHP_EOL;
}
//    }
//}

function searchImagesInFolder($folder, $fileName)
{
    // 检查文件夹是否存在
    if (!is_dir($folder)) {
        return [];
    }

    // 初始化结果数组
    $result = [];

    // 打开文件夹
    $handle = opendir($folder);

    // 遍历文件夹中的文件和子文件夹
    while (($file = readdir($handle)) !== false) {
        if ($file != '.' && $file != '..') {
            $path = $folder . DIRECTORY_SEPARATOR . $file;

            // 如果是文件夹,则递归调用自身进行进一步搜索
            if (is_dir($path)) {
                $result = array_merge($result, searchImagesInFolder($path, $fileName));
            } else {
                // 如果是图片文件并且文件名与模糊匹配成功,则将文件路径添加到结果数组中
                if (isImageFile($file) && fnmatch("*{$fileName}*", $file)) {
                    $result[] = $path;
                }
            }
        }
    }

    // 关闭文件夹
    closedir($handle);

    return $result;
}

// 检查文件是否为图片文件
function isImageFile($file)
{
    $imageExtensions = ["jpg", "jpeg", "png", "gif"];
    $fileExtension = pathinfo($file, PATHINFO_EXTENSION);
    return in_array($fileExtension, $imageExtensions);
}
相关推荐
JaguarJack1 天前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo1 天前
FrankenPHP 原生支持 Windows 了
后端·php
JaguarJack2 天前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo2 天前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack3 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay4 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954484 天前
CTF 伪协议
php
BingoGo6 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack6 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo7 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php