当前位置: 首页 > news >正文

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

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

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

相关文章:

  • 解决火绒启动时,报安全服务异常,无法保障计算机安全
  • 工具介绍《netcat》
  • 电脑如何拦截端口号,实现阻断访问?
  • 物联网设备数据割裂难题:基于OAuth2.0的分布式用户画像系统设计!格行代理是不是套路?2025有什么比较好的副业?低成本的创业好项目有哪些?
  • 股票交易所官方api接口有哪些?获取和使用需要满足什么条件
  • segment-anything分割万物python环境部署和实现
  • Seata:分布式事务的终极解决方案
  • vue3中插槽
  • ElementUI 级联选择器el-cascader启用选择任意一级选项,选中后关闭下拉框
  • 微服务的认识与拆分
  • 9.1go结构体
  • 第9章 管理日志(网络安全防御实战--蓝军武器库)
  • Linux13-TCP\HTTP
  • 条码扫描手持pda,推动服装零售门店管理效率
  • 大模型开发(四):PET项目——新零售决策评价系统(上)
  • 大白话CSS 优先级计算规则的详细推导与示例
  • HarmonyOS NEXT开发实战:DevEco Studio中DeepSeek的使用
  • uniapp小程序对接腾讯IM即时通讯无ui集成(1)
  • 手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机
  • 77.ObservableCollection使用介绍1 C#例子 WPF例子
  • 二次疫情最新通报今天/官网seo是什么
  • 做淘客网站需要多大的空间/百度推广账号注册流程
  • 五合一营销型网站/百度贴吧怎么发广告
  • 常熟市建设局网站/网店营销与推广策划方案
  • 台州seo网站管理/百度入口提交
  • 网站建设前期如何做好市场定位分析/痘痘该怎么去除效果好