如何将PrestaShop 1.6制造商Logo导入至PrestaShop 1.7?
如何在PrestaShop 1.6到1.7的制造商导入中同步Logo
好的,我来帮你搞定制造商Logo的导入问题!你的现有代码已经能同步基本信息,但Logo是文件资源,WebService不会把图片内容包含在JSON响应里,所以我们需要主动从PS1.6服务器下载Logo,再上传到PS1.7。下面是具体的实现方案和修改后的代码:
核心思路
PrestaShop 1.6默认将制造商Logo存储在站点的img/m/目录下,命名规则为{制造商ID}.jpg(比如ID为3的制造商Logo就是3.jpg)。我们需要:
- 构造PS1.6的Logo完整URL
- 下载Logo到本地临时文件
- 利用PS1.7的
Manufacturer类方法将Logo保存到新站点
修改后的完整代码
// 替换成你的PrestaShop 1.6站点域名(注意结尾不要加斜杠) $ps16Domain = 'http://your-ps16-site.com'; $params = [ 'resource' => 'manufacturers', 'contentType' => 'JSON' ]; $ps16manufacturers = json_decode($this->ps16Client->get($params))->manufacturers; foreach($ps16manufacturers as $ps16manufacturer) { $params = [ 'resource' => 'manufacturers', 'contentType' => 'JSON', 'id' => $ps16manufacturer->id ]; $ps16manufacturersObject = json_decode($this->ps16Client->get($params), true)['manufacturer']; $ps17Manufacturer = new \Manufacturer(); $ps17Manufacturer->hydrate($ps16manufacturersObject, \Configuration::get('PS_LANG_DEFAULT')); $ps17Manufacturer->force_id = true; // 处理Logo导入 $logoUrl = $ps16Domain . '/img/m/' . $ps16manufacturer->id . '.jpg'; // 尝试下载Logo,@符号用于屏蔽图片不存在时的警告 $logoContent = @file_get_contents($logoUrl); if ($logoContent !== false) { // 创建临时文件存储Logo内容 $tmpFilePath = tempnam(sys_get_temp_dir(), 'ps_manufacturer_logo'); file_put_contents($tmpFilePath, $logoContent); // 模拟$_FILES数组结构,适配PS1.7的saveImage方法要求 $file = [ 'name' => $ps16manufacturer->id . '.jpg', 'type' => 'image/jpeg', 'tmp_name' => $tmpFilePath, 'error' => 0, 'size' => filesize($tmpFilePath) ]; // 保存Logo到PS1.7站点 $ps17Manufacturer->saveImage($file); // 清理临时文件,避免占用服务器空间 unlink($tmpFilePath); } $ps17Manufacturer->add(false); }
关键细节说明
- Logo路径调整:如果你的PS1.6站点Logo使用了其他格式(比如
.png)或者存储路径不同(比如启用了图片重命名功能),需要对应修改$logoUrl的构造逻辑。 - 权限问题:确保PS1.7站点的
img/m/目录具备写入权限,否则Logo无法成功保存。 - 替代下载方式:如果你的服务器禁用了
file_get_contents,可以改用cURL来下载图片,示例代码如下:
function downloadLogo($url) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $content = curl_exec($ch); curl_close($ch); return $content; } // 替换原来的$logoContent = @file_get_contents($logoUrl); $logoContent = downloadLogo($logoUrl);
- 错误日志优化:如果需要更严谨的错误记录,可以去掉
file_get_contents前的@符号,添加try-catch块来捕获异常并写入日志。
内容的提问来源于stack exchange,提问作者JarsOfJam-Scheduler
相关产品推荐
相关产品推荐

