Magento-向现有可配置产品添加/删除属性


18

正确的步骤是什么-而不是删除产品,然后再次开始向现有可配置产品添加或删除属性。

创建可配置产品时,系统会要求您选择要用于该产品的属性。

我有很多产品,现在我需要删除一些最初选择的属性,有些还需要添加最初没有选择的属性。

感谢您提供任何帮助-删除产品似乎并不是解决此问题的最佳方法。尤其是与产品相关的许多其他事物。


正确的答案是:删除产品并创建一个新产品,但是有解决此问题的方法(我认为是模块),但我认为您可以使用google自己,我没有针对此问题的解决方案
Fabian Blechschmidt

您是否找到了解决方案?以下是答案吗?请更新。
philwinkle

我还没有尝试过。但是我很快就会对此进行测试。非常感谢您的回答-如果有效,我会标记为已回答
11

就像我有一个color属性,它已与所有可配置产品链接在一起,以防万一该属性已被删除。因此,它不会在那里找到链接的属性并在“ /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php在线中显示为” Notice:Undefined offset:0” 43“。需要一些帮助来处理这种情况。
Bhagyashree

Answers:


14

这是适合我的工作,可用于从可配置产品中删除属性。
这是方案。
所有可配置产品的属性创建错误,brand因为该属性是具有约200个简单关联产品的约50个可配置产品的可配置属性。
与可配置属性关联的所有简单产品均具有相同的品牌。这个想法是brand从可配置属性中删除,并将其作为简单属性分配给具有一个简单产品之一的值的可配置产品。
这是执行此操作的代码。该代码仅运行一次。可以将其添加到升级脚本或简单的php文件中。

<?php
//==>this is required only if you use a simple php file
error_reporting(E_ALL | E_STRICT);
$mageFilename = 'app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
umask(0);
Mage::app();
//<==

$brand = 'brand';
//get the attribute instance
$brandAttribute = Mage::getModel('eav/config')->getAttribute('catalog_product', $brand);
//if this attribute exists
if ($brandAttribute->getId()){
    //make the attribute apply to al types of products in case it's not
    $brandAttribute->setApplyTo(null);
    $brandAttribute->save();
    $resource = Mage::getSingleton('core/resource');
    //get an object with access to direct queries
    $connection = $resource->getConnection('core_write');
    //get all configurable products - you can specify additional filters here
    $collection = Mage::getModel('catalog/product')->getCollection()
        ->addAttributeToFilter('type_id', 'configurable');
    foreach ($collection as $product){
        //the configurable attributes are stored in the table 'catalog_product_super_attribute'
        //remove the attribute references from that table. 
        //The constraints will take care of the cleanup.
        $q = "DELETE FROM {$resource->getTableName('catalog_product_super_attribute')}
            WHERE attribute_id = {$brandAttribute->getId()} AND product_id = {$product->getId()}";
        $connection->query($q);
        //get the simple products in the configurable product
        $usedProducts =  $product->getTypeInstance(true)->getUsedProducts(null, $product);
        foreach ($usedProducts as $p){
            //identify the first simple product that has a value for brand 
            //set that value to the configurable product.
            if ($brandValue = $p->getData($brand)){
                Mage::getSingleton('catalog/product_action')
                    ->updateAttributes(array($product->getId()), array($brand=>$brandValue), 0);
                break;
            }
        }
    }
}

对于上面列出的数字,这需要大约15秒才能在我的本地计算机(不是功能强大的计算机)上运行。我确信可以对此进行优化。很有可能没有必要获得可配置产品的所有简单产品来获得brand价值,但是我没有打扰。


2
我讨厌必须以这种方式完成,并且没有方法可以实现相同的目的,但是感谢您提供的信息。
webnoob

@Marius,此版本适用于1.9吗?
Magento Learner

@MagentoLearner。我不确定,但我预感它确实有效。
马里乌斯

@Marius,非常快速的回复!!!非常感谢
Magento Learner

@Marius,假设我要添加一个超级属性。通过将具有product_id和attribute_id的行添加到表catalog_product_super_attribute中将起作用?否则我需要修改其他表?就像在stackoverflow.com/a/13381381/1749007
Magento Learner

5

这需要直接编辑数据库,而Magento的第一个定律是不直接编辑数据库

但是,如果您疯狂到足以继续进行,几个月前的StackOverflow上已经介绍了这一点:

ucts。我已经在CE 1.6.2上测试了以下数据库变通方法黑客,它似乎正在起作用:

  • 创建属性
  • 将其拖动到适当的属性集
  • 转到数据库编辑器或phpmyadmin,表'catalog_eav_attribute'并查看最后一个,记下'attribute id',还记下产品ID->转到catalog_product_entity并查找所需的可配置产品,并记下entity_id->此是product_id
  • 转到catalog_product_super_attribute并插入带有product_id和attribute_id的新记录,注意product_super_attribute_id
  • 转到catalog_product_super_attribute_label并插入带有product_super_attribute_id和新属性值的新记录,例如在管理中添加该属性时使用的“颜色”或“大小”
  • 返回到admin并单击可配置产品,您将注意到没有任何子产品与可配置产品相​​关联。
  • 单击其中一个子产品,然后选择适当的属性值,也可以更改sku。
  • 导出所有子产品,然后向其添加新的属性和sku值,然后将其重新导入,就可以完成了,或者您可能必须在管理员中手动更改所有内容而不使用数据流。

图片来源:https//stackoverflow.com/questions/5658197/add-new-attribute-to-existing-configurable-product-magento

未经测试-YMMV。


2

要从所有可配置产品中删除一个超级产品属性(称为),您可以在数据库中执行以下SQL查询:

DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;

在这里,是存储在eav_attribute表中关于attribute_code的属性的id。表catalog_product_super_attribute将产品链接到超级产品属性。您可以在其中添加和删除属性以创建可配置产品。


1
如果只从一个特定的单一产品除去超产品属性你可以扩展上面的SQL查询,过滤器还对产品ID DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
颤动

0

有一个肮脏的技巧来打开可配置产品,然后选择重复项,选择旧属性和新属性,在没有SKU的情况下进行重复,然后删除原始可配置产品和简单产品。之后,您可以给相同的SKU复制。然后,您只需要制造新的简单产品即可。

如果没有那么多简单的产品,这是一种快速的解决方法。


不正确的答案
Deepak Rai

0

我已经设法在更新模式下使用Free Magmi导入导出工具来更干净地完成此操作。(理解版本)

导出关键字段,更改configurable_attributes列设置以在简单和可配置的SKUS上指定可配置的属性,然后使用Magmi重新导入

作为一名前Oracle顾问,我同意不要惹数据库,尤其是像Magento数据结构这样复杂的数据库-最好使用经过良好测试的工具来做到这一点。


0

我需要从“可配置产品”的“可配置”属性之一中删除一个属性。

  • 上面有关catalog_product_super_attribute的引用是正确的。使用Navicat数据库工具,我依次进行了一些操作。

    为了测试更改了Attribute_Id,将其更改为其他产品中正在使用的另一个字段。(确认这是有争议的记录)。为防万一,写下了完整的记录数据集(product_super_attribute_id,product_id,attribute_id,位置)

    最后一起删除记录。

做到了。我还记下了我假设需要再次执行此操作的注意事项。

再次:删除“ catalog_product_super_attribute”中的记录解决了我的问题,该问题似乎与上述其他问题有关。

额外信息:要将“ attribute_id”与正确的命名列表相关联,请务必注意:catalog_super_attribute_label->并通过product_super_attribute_id进行关联。
我一直在寻找一个相关的“ attribute_id”字段(尚未找到)。

“ product_super_attribute_id”起到了告诉您“ attribute_id”实际上是什么的作用。(我仍然想找到“ attribute_id”的“默认”数据集,以了解如何在数据库中首先定义属性)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.