英文:
Prestashop - php script to add attachements to product
问题
我已经创建了一个PHP脚本,允许我为已导入的产品添加附件(请参见下文)。
一切都正常,3个表ps_attachemnt、lang...都已正确填充。
在后台,在产品文件的“选项”选项卡中,我可以看到我的附件已被选中。
问题:
我在前端(产品文件)看不到它,除非我点击:预览和/或保存。
已采取的措施:
- 清空缓存
- 删除var/cache文件夹中的缓存文件(dev/prod)
- 创建一个使用save()函数的PHP脚本;($product->save();)
有人有线索吗?
谢谢
<?php
$csvFile = "xxxx.csv";
if (($handle = fopen($csvFile, "r")) !== FALSE) {
// Parcours des lignes du fichier CSV
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$reference = $data[0]; // 产品引用
$files = explode(",", $data[1]); // 文件路径(用逗号分隔)
// 获取产品ID
$sql = "SELECT id_product FROM ps_product WHERE reference = '$reference'";
$result = $conn->query($sql);
echo "$reference";
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
$productId = $row["id_product"];
echo "$productId";
// 遍历附加文件
foreach ($files as $file) {
// 获取文件大小(以字节为单位)
$fileSize = filesize($file);
$fileName = basename($file); // 文件名
// 检查文件是否已存在于给定的产品中
$sqlCheck = "SELECT id_attachment FROM ps_product_attachment WHERE id_product = '$productId'";
$resultCheck = $conn->query($sqlCheck);
$attachmentId = null;
if ($resultCheck->num_rows > 0) {
// 遍历结果以检查文件是否已存在
while ($rowCheck = $resultCheck->fetch_assoc()) {
$existingAttachmentId = $rowCheck["id_attachment"];
// 检查文件是否已与产品关联
$sqlFileCheck = "SELECT id_attachment FROM ps_attachment WHERE id_attachment = '$existingAttachmentId' AND file = '$file'";
$resultFileCheck = $conn->query($sqlFileCheck);
if ($resultFileCheck->num_rows > 0) {
// 文件已经存在于给定的产品中
$attachmentId = $existingAttachmentId;
break;
}
}
}
if ($attachmentId === null) {
// 产品中尚不存在该文件,将其插入到ps_attachment中
$sqlInsertAttachment = "INSERT INTO ps_attachment (file, file_name, file_size, mime) VALUES ('$file', '$fileName', '$fileSize', 'application/pdf')";
if ($conn->query($sqlInsertAttachment) === TRUE) {
$attachmentId = $conn->insert_id;
} else {
echo "添加附加文件时出错:" . $conn->error . "\n";
}
}
if ($attachmentId !== null) {
// 在ps_product_attachment中将附件关联到产品
$sqlInsertProductAttachment = "INSERT INTO ps_product_attachment (id_product, id_attachment) VALUES ('$productId', '$attachmentId')";
if ($conn->query($sqlInsertProductAttachment) === TRUE) {
echo "成功为产品 $reference 添加附件。\n";
// 插入后获取附件ID
$idAttachment = $attachmentId;
// 遍历支持的语言
$idLang = 1;
$name = $data[$idLang]; // 获取指定语言的附件名称
$description = $data[$idLang]; // 获取指定语言的附件描述
// 在ps_attachment_lang表中插入语言信息
$sqlInsertAttachmentLang = "INSERT INTO ps_attachment_lang (id_attachment, id_lang, name, description) VALUES ('$idAttachment', '$idLang', '$name', '$description')";
if ($conn->query($sqlInsertAttachmentLang) === TRUE) {
echo "为附件 $idAttachment 和语言 $idLang 成功添加语言信息。\n";
} else {
echo "添加语言信息时出错:" . $conn->error . "\n";
}
} else {
echo "将附件关联到产品 $reference 时出错:" . $conn->error . "\n";
}
}
}
} else {
echo "未找到产品的引用:$reference。\n";
}
}
fclose($handle);
}
$conn->close();
?>
更新脚本尝试:
<?php
require(dirname(__FILE__).'/config/config.inc.php');
define('_PS_ROOT_DIR_', dirname(dirname(__FILE__)).'/');
// 包含Product类
require_once _PS_ROOT_DIR_ . '/classes/Product.php';
// 要定位的产品引用列表
$targetReferences = array(
'20052'
);
foreach ($targetReferences as $reference) {
// 根据引用查找产品
$productId = Product::getIdByReference($reference);
if ($productId) {
$product = new Product($productId);
// 保存选项而不进行修改
$product->save();
echo "产品已更新,引用:" . $reference .
"<br>";
} else {
// 处理产品引用未找到的情况
echo "未找到引用为:" . $reference .
"<br>";
}
}
?>
英文:
I've created a php script that allows me to add attachments to products that have already been imported (see below).
Everything works fine, the 3 tables ps_attachemnt, lang... are filled in correctly.
In the back office, in the product file, in the 'options' tab, I can see that my attachment is ticked.
Problem :
I can't see it in the front end (on the product file) EXCEPT if I click on : Preview and/or Save.
Action taken :
- Empty cache
- Delete the cache folders in var/cache ( dev / prod)
- Create a php script that uses the save() function; ($product->save();)
Does anyone have any clues?
Thank you
<?php
$csvFile = "xxxx.csv";
if (($handle = fopen($csvFile, "r")) !== FALSE) {
// Parcours des lignes du fichier CSV
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$reference = $data[0]; // Référence du produit
$files = explode(",", $data[1]); // Chemins vers les fichiers (séparés par une virgule)
// Récupération de l'ID du produit
$sql = "SELECT id_product FROM ps_product WHERE reference = '$reference'";
$result = $conn->query($sql);
echo "$reference";
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
$productId = $row["id_product"];
echo "$productId";
// Parcours des fichiers joints
foreach ($files as $file) {
// Obtention de la taille du fichier en octets
$fileSize = filesize($file);
$fileName = basename($file); // Nom du fichier
// Vérification si le fichier existe déjà pour le produit donné
$sqlCheck = "SELECT id_attachment FROM ps_product_attachment WHERE id_product = '$productId'";
$resultCheck = $conn->query($sqlCheck);
$attachmentId = null;
if ($resultCheck->num_rows > 0) {
// Parcourir les résultats pour vérifier si le fichier existe déjà
while ($rowCheck = $resultCheck->fetch_assoc()) {
$existingAttachmentId = $rowCheck["id_attachment"];
// Vérifier si le fichier est déjà associé au produit
$sqlFileCheck = "SELECT id_attachment FROM ps_attachment WHERE id_attachment = '$existingAttachmentId' AND file = '$file'";
$resultFileCheck = $conn->query($sqlFileCheck);
if ($resultFileCheck->num_rows > 0) {
// Le fichier existe déjà pour le produit donné
$attachmentId = $existingAttachmentId;
break;
}
}
}
if ($attachmentId === null) {
// Le fichier n'existe pas encore pour le produit, l'insérer dans ps_attachment
$sqlInsertAttachment = "INSERT INTO ps_attachment (file, file_name, file_size, mime) VALUES ('$file', '$fileName', '$fileSize', 'application/pdf')";
if ($conn->query($sqlInsertAttachment) === TRUE) {
$attachmentId = $conn->insert_id;
} else {
echo "Erreur lors de l'ajout du fichier joint : " . $conn->error . "\n";
}
}
if ($attachmentId !== null) {
// Associer le fichier joint au produit dans ps_product_attachment
$sqlInsertProductAttachment = "INSERT INTO ps_product_attachment (id_product, id_attachment) VALUES ('$productId', '$attachmentId')";
if ($conn->query($sqlInsertProductAttachment) === TRUE) {
echo "Fichier joint ajouté avec succès pour le produit $reference.\n";
// Récupération de l'ID de l'attachment après insertion
$idAttachment = $attachmentId;
// Parcours des langues prises en charge
$idLang = 1;
$name = $data[$idLang]; // Récupération du nom du fichier joint dans la langue spécifiée
$description = $data[$idLang]; // Récupération de la description du fichier joint dans la langue spécifiée
// Insertion des informations de langue dans la table ps_attachment_lang
$sqlInsertAttachmentLang = "INSERT INTO ps_attachment_lang (id_attachment, id_lang, name, description) VALUES ('$idAttachment', '$idLang', '$name', '$description')";
if ($conn->query($sqlInsertAttachmentLang) === TRUE) {
echo "Informations de langue ajoutées avec succès pour l'attachment $idAttachment et la langue $idLang.\n";
} else {
echo "Erreur lors de l'ajout des informations de langue : " . $conn->error . "\n";
}
} else {
echo "Erreur lors de l'association du fichier joint pour le produit $reference : " . $conn->error . "\n";
}
}
}
} else {
echo "Produit non trouvé pour la référence : $reference.\n";
}
}
fclose($handle);
}
$conn->close();
?>
Update script try :
<?php
require(dirname(__FILE__).'/config/config.inc.php');
define('_PS_ROOT_DIR_', dirname(dirname(__FILE__)).'/');
// Inclusion de la classe Product
require_once _PS_ROOT_DIR_ . '/classes/Product.php';
// Liste des références de produits à cibler
$targetReferences = array(
'20052'
);
foreach ($targetReferences as $reference) {
// Recherche du produit par référence
$productId = Product::getIdByReference($reference);
if ($productId) {
$product = new Product($productId);
// Enregistrer les options sans modification
$product->save();
echo "Produit mis à jour pour la référence : " . $reference .
"<br>";
} else {
// Gérer le cas où la référence du produit n'est pas trouvée
echo "Produit non trouvé pour la référence : " . $reference .
"<br>";
}
}
?>
答案1
得分: 0
确保在保存产品之前设置属性:
$product->cache_has_attachments = 1;
我之前也遇到过相同的问题,花了一些时间才解决了它
英文:
Make sure to set the property
$product->cache_has_attachments = 1;
before saving the product.
I encountered the same issue some time ago, and it took me quite a while to figure it out
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论