Magento API 上传的产品没有出现在前端 - 除非它们被重新保存在后端
Posted
技术标签:
【中文标题】Magento API 上传的产品没有出现在前端 - 除非它们被重新保存在后端【英文标题】:Magento API Uploaded products not appearing in frontend - Unless they are re-saved in backend 【发布时间】:2009-06-15 15:58:17 【问题描述】:我正在通过 Magento API 上传产品,但它们没有显示在前端。我必须进入后端,打开它们,更改nothing,保存产品,然后它就会出现。
知道为什么吗?我假设将它保存在后端的行为是在数据库中保存一些额外的标志,我只是不知道是什么。
@史蒂夫马德森。这是代码,我认为我没有遗漏任何重要的东西,因为后端界面会提示我,然后我打开产品。
public void Import(Product product)
var mageProduct = new catalogProductCreateEntity();
mageProduct.name = product.Name;
mageProduct.description = product.Description;
mageProduct.price = product.Price.ToString();
mageProduct.short_description = product.ShortDescription;
mageProduct.description = product.Description;
mageProduct.status = "1";
mageProduct.weight = "0";
mageProduct.tax_class_id = "2";
mageProduct.gift_message_available = "0";
var additionalattributes = new associativeEntity[4];
var entity = new associativeEntity();
entity.key = "ship_price";
entity.value = product.PostageCost;
additionalattributes[0] = entity;
entity = new associativeEntity();
entity.key = "depth_cm";
entity.value = product.Depth;
additionalattributes[1] = entity;
entity = new associativeEntity();
entity.key = "height_cm";
entity.value = product.Height;
additionalattributes[2] = entity;
entity = new associativeEntity();
entity.key = "width_cm";
entity.value = product.Width;
additionalattributes[3] = entity;
mageProduct.additional_attributes = additionalattributes;
_m.catalogProductCreate(MageSessionProvider.GetSession(), "simple", "26", product.SKU, mageProduct);
var stock = new catalogInventoryStockItemUpdateEntity();
stock.manage_stock = 0;
stock.qty = "0";
_m.catalogInventoryStockItemUpdate(MageSessionProvider.GetSession(), product.SKU, stock);
Console.WriteLine(product.Name + " imported");
【问题讨论】:
发布上传新产品的代码。没有它,就不可能知道你是否遗漏了一个重要的属性。 【参考方案1】:我已经看到很多手动或通过 API 插入 Magento 数据库的内容会缺少属性,无论出于何种原因,当保存在 Magento UI 中时,该属性被设置为默认值。 UI 正在正确设置默认值,而 API 或数据库插入没有设置属性。
所以,在你的情况下,我的第一行调试将是
-
“上传”[原文如此] 带有 API 的产品(您使用什么 API 方法?或者您使用的是自定义 API?)
对该产品的属性值进行快照
通过 Magento UI 保存产品
对该产品的属性值进行快照
区分 #2 和 #4
确保您的“上传”[原文如此] 方法设置了 #4 中存在但 #2 中不存在的所有属性
Magento 使用Entity Attribute Value 建模方案,优化数据库灵活性而不是查询。长话短说,您可以运行以下查询来获取您的基本产品属性值。
您需要用数据库中的产品 ID 替换 [3455] 的每个实例。您可以通过在 Magento Admin UI 中检查产品的 URL 来获取此 ID。您可以不使用 WHERE 子句运行查询,尽管默认索引并未针对此用例进行优化,并且根据您的数据库大小,您将获得较慢的查询。
SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_varchar.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_varchar ON catalog_product_entity.entity_id = catalog_product_entity_varchar.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_varchar.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455
UNION
SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_text.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_text ON catalog_product_entity.entity_id = catalog_product_entity_text.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_text.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455
UNION
SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_datetime.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_datetime ON catalog_product_entity.entity_id = catalog_product_entity_datetime.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_datetime.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455
UNION
SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_decimal.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_decimal ON catalog_product_entity.entity_id = catalog_product_entity_decimal.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_decimal.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455
UNION
SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_gallery.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_gallery ON catalog_product_entity.entity_id = catalog_product_entity_gallery.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_gallery.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455
UNION
SELECT eav_attribute.frontend_label, eav_attribute.attribute_code,
catalog_product_entity_int.value
FROM catalog_product_entity
LEFT JOIN catalog_product_entity_int ON catalog_product_entity.entity_id = catalog_product_entity_int.entity_id
LEFT JOIN eav_attribute on catalog_product_entity_int.attribute_id = eav_attribute.attribute_id
WHERE catalog_product_entity.entity_id = 3455;
【讨论】:
谢谢艾伦!非常感谢你发布这个。这非常令人沮丧,我试试你所说的并返回结果。 我使用您的 SQL 进行比较,那里有很多用空字符串设置的额外属性。所以我设置了所有这些。这似乎没有效果。最后归结为我设置 mageProduct.websites = new[] "base" ;【参考方案2】:“我使用您的 SQL 进行比较,那里有很多用空字符串设置的额外属性。所以我设置了所有这些属性。这似乎没有效果。最后它归结为我设置 mageProduct.websites = new[] "base" ; – Dan Jun 16 at 14:12"
谢谢丹!这对我有用。类代码示例显示了 mageProduct.websites = new[] "0" ;这是不正确的,我将其更改为 mageProduct.websites = new[] "base" ;并且有效。
【讨论】:
【参考方案3】:这个页面是最有帮助的。在执行 CSV 导入时,我发现我必须添加: _product_websites 并确保将其设置为每个导入产品的基础。还要确保将 is_in_stock 的字段设置为 1,之后我发现导入工作正常。
对我有用的最小字段列表是: 货号, _店铺, _attribute_set, _类型, _类别, _root_category, 描述, msrp_display_actual_price_type, msrp_enabled, 姓名, 简短的介绍, 数量, is_in_stock, 地位, tax_class_id, 能见度, 价格, 重量, _product_websites
样本记录:
ku,_store,_attribute_set,_type,_category,_root_category,description,msrp_display_actual_price_type,msrp_enabled,name,short_description,status,tax_class_id,visibility,price,weight,_product_websites,qty,is_in_stock
CC0003,,Default,simple,Specialist Therapeutics,Products,Conn Test #3,Use config,Use config,Conn Test #3,ConnTest,1,0,4,0,1,base,3000,1
【讨论】:
以上是关于Magento API 上传的产品没有出现在前端 - 除非它们被重新保存在后端的主要内容,如果未能解决你的问题,请参考以下文章
Magento API:将预先存在的简单产品分配给可配置产品