Magento API上传的产品没有出现在前端 - 除非它们在后端重新保存

时间:2009-06-15 15:58:18

标签: php sql magento entity-attribute-value

我通过Magento API上传产品,但它们没有出现在前端。我必须进入后端,打开它们,更改没有,保存产品然后它会出现。

知道为什么吗?我假设在后端保存它的行为,是在DB中保存一些额外的标志,我只是不知道是什么。

@Steve Madsen。这是代码,我不认为我错过任何关键的东西,因为后端界面会提示我,然后我打开产品。

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

3 个答案:

答案 0 :(得分:3)

我已经看到很多情况下,手动或通过API插入Magento数据库的内容将具有缺少的属性,无论出于何种原因,该属性在Magento UI中保存时都设置为默认值。 UI正在正确设置默认值,而API或数据库插入不设置属性。

所以,在你的情况下,我的第一行调试是

  1. “上传”[原文如此]使用API​​的产品(您使用的API方法是什么?或者您使用的是自定义API?)
  2. 拍摄该产品的属性值的快照
  3. 通过Magento UI保存产品
  4. 拍摄该产品的属性值的快照
  5. Diff#2和#4
  6. 确保您的“上传”[sic]方法设置#4中存在的所有属性,而不是#2
  7. Magento使用Entity Attribute Value建模方案,该方案优化数据库灵活性而非查询。简而言之,您可以运行以下查询来获取基本的产品属性值。

    您需要使用数据库中的产品ID替换[3455]的每个实例。您可以通过检查Magento管理界面中的自定义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;
    

答案 1 :(得分:1)

  

“我使用你的SQL进行比较,并且在那里有很多额外的属性用空字符串设置。所以我设置了所有这些。这似乎没有效果。最后它归结为我设置mageProduct.websites = new [] {“base”}; - Dan Jun 16 at 14:12“

谢谢丹!这对我有用。类代码示例显示了mageProduct.websites = new [] {“0”};这是不正确的,我把它改为mageProduct.websites = new [] {“base”};它有效。

答案 2 :(得分:1)

此页面最有帮助。在执行CSV导入时,我发现我必须添加: _product_websites并确保将其设置为每个导入产品的基础。还要确保将is_in_stock的字段设置为1,之后我发现导入工作正常。

对我有用的最小字段列表如下: SKU, _商店, _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