Magento - добавление / удаление атрибутов к существующим конфигурируемым продуктам

18

Какова правильная процедура - вместо удаления продукта и повторного запуска, чтобы добавить или удалить атрибуты к существующим настраиваемым продуктам.

При создании настраиваемого продукта вам предлагается выбрать, какие атрибуты использовать для продукта.

У меня есть много продуктов, которые мне теперь нужно удалить некоторые атрибуты, которые были выбраны изначально, и некоторые, которые также нуждаются в добавлении атрибутов, которые не были выбраны изначально.

Любая помощь с этим приветствуется - поскольку удаление продуктов не кажется лучшим подходом к этому. Тем более, что с продукцией связано много других вещей.

eleven11
источник
Правильный ответ здесь: удалите продукт и создайте новый, но есть решения для этой проблемы (и я думаю, модули), но я думаю, что вы можете гуглить самостоятельно, у меня нет решения для этого
Фабиан Блехшмидт
Вы нашли решение для этого? Ниже ответ на решение? Пожалуйста, дайте обновление.
Филвинкл
Я еще не пробовал. Но я буду проверять это очень скоро. Большое спасибо за ответ - я
отмечу
Как у меня был атрибут цвета, и он был связан со всем настраиваемым продуктом. В случае, если этот атрибут был удален. Таким образом, он не находит там этот связанный атрибут и показывает ошибку как «Примечание: неопределенное смещение: 0 в /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php онлайн 43" . Нужна помощь, чтобы справиться с этой ситуацией. Спасибо заранее.
Бхагьяшри

Ответы:

14

Вот что мне нужно для удаления атрибута из настраиваемого продукта.
Это сценарий.
Все настраиваемые продукты были созданы неправильно с атрибутом brandв качестве настраиваемого атрибута для примерно 50 настраиваемых продуктов, имеющих около 200 простых связанных продуктов.
Все простые продукты, связанные с настраиваемым атрибутом, имеют одну и ту же марку. Идея состоит в том, чтобы удалить 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
@MagentoLearner. Я не знаю точно, но у меня есть предчувствие, что это работает.
Мариус
@Мариус, очень быстрый ответ !!! Большое спасибо
Magento Learner
@Marius, предположим, я хочу добавить один супер атрибут. Добавление строки с product_id и attribute_id в таблицу catalog_product_super_attributeбудет работать? Или мне нужно изменить другие таблицы? Как в stackoverflow.com/a/13381381/1749007
Ученик Magento
5

Это требует прямого редактирования базы данных, и первый закон Magento - не редактировать базу данных напрямую .

Но если вы достаточно сумасшедший, чтобы продолжить, это было описано в StackOverflow несколько месяцев назад:

дуктов. Я протестировал приведенный ниже способ обхода БД на CE 1.6.2, и, похоже, он работает:

  • Создать атрибут
  • Перетащите его в соответствующий набор атрибутов
  • Перейдите в db editor или phpmyadmin, таблица 'catalog_eav_attribute' и посмотрите на последний, отметьте «идентификатор атрибута», также обратите внимание на идентификатор продукта -> перейдите к catalog_product_entity и найдите требуемый конфигурируемый продукт, и обратите внимание на entity_id -> this это идентификатор продукта
  • Перейдите в catalog_product_super_attribute и вставьте новую запись с product_id и attribute_id, примечанием product_super_attribute_id
  • Перейдите в catalog_product_super_attribute_label и вставьте новую запись с product_super_attribute_id и значением вашего нового атрибута, например «Цвет» или «Размер», который вы использовали при добавлении атрибута в администраторе.
  • Вернитесь к администратору и выберите настраиваемый продукт, вы заметите, что ни один из ваших дочерних продуктов не связан с вашим настраиваемым продуктом.
  • Выберите один из дочерних продуктов и выберите соответствующее значение атрибута, вы также можете поменять артикул.
  • Экспортируйте все дочерние продукты и добавьте в них новый атрибут и значения sku, импортируйте их обратно, и все готово, или вам, возможно, придется вручную изменить все в админке, не используя поток данных.

Кредит: /programming/5658197/add-new-attribute-to-existing-configurable-product-magento

Не проверено - YMMV.

philwinkle
источник
2

Чтобы удалить один атрибут супер-продукта (как он называется) из всех настраиваемых продуктов, вы можете выполнить этот SQL-запрос в базе данных:

DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;

Здесь идентификатор атрибута, хранящийся в таблице eav_attribute относительно атрибута_кода. Таблица catalog_product_super_attribute связывает продукты с атрибутами супер продукта. Вы можете добавлять и удалять атрибуты для создания настраиваемых продуктов там.

Абхинав Сингх
источник
1
Чтобы удалить только атрибут супер-продукта из определенного отдельного продукта, вы можете расширить вышеуказанный SQL-запрос, чтобы отфильтровать его также по идентификатору продукта DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
Judder
0

Существует грязный взлом, чтобы открыть настраиваемый продукт, затем выбрать дубликат, выбрать старый и новый атрибут, дубликат создается без SKU, затем удалить оригинальный настраиваемый продукт и простые продукты. После этого вы можете дать тот же SKU для дублирования. Тогда вам просто нужно сделать новые простые продукты.

Это быстрый обходной путь, если не так много простых продуктов.

Dinko
источник
Не правильный ответ
Дипак Рай
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, position)

    Наконец-то удалили запись все вместе.

Это добилось цели. Я также вел записку о том, что сделал, предполагая, что мне нужно будет сделать это снова.

Опять же: удаление записи в "catalog_product_super_attribute" решило мою проблему, которая, казалось, была связана с другими выше.

Дополнительная информация: чтобы соотнести «attribute_id» с правильным именованным списком, важно взглянуть на: catalog_super_attribute_label -> и сопоставить через product_super_attribute_id.
Я искал связанное поле "attribute_id" (пока не нашел).

«product_super_attribute_id» позволяет вам узнать, что на самом деле представляет собой «attribute_id». (Я хотел бы все еще найти набор данных «по умолчанию» для «attribute_id», чтобы увидеть, как атрибут впервые определяется в базе данных).

Л Арнольд
источник