Magento - додавання / видалення атрибутів до існуючих настроюваних продуктів


18

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

Під час створення продукту, що настроюється, вам пропонується вибрати, які атрибути використовувати для продукту.

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

Будь-яка допомога в цьому вдячна - оскільки видалення продуктів здається не найкращим підходом до цього. Тим більше, що з продуктами пов'язано багато інших речей.


Правильна відповідь тут: видаліть продукт і створіть новий, але для цієї проблеми є рішення (і я думаю, що модулі), але я думаю, ви можете самі
гуглювати

Ви знайшли рішення для цього? Чи відповідає відповідь нижче? Будь ласка, дайте оновлення.
philwinkle

Я ще не пробував це. Але я буду тестувати це дуже скоро. Велике спасибі за відповідь - я
відзначу

Як у мене був атрибут кольору, і він був пов'язаний з усім настроюваним продуктом. У разі, якщо цей атрибут був видалений. Так що його не знайдений там пов'язаний атрибут та відображається помилка як "Повідомлення: Не визначене зміщення: 0 в /home/not1son/public_html/vendor/magento/module-configure-product/model/Product/Type/VariationMatrix.php on line 43 ". Потрібна допомога для вирішення цієї ситуації. Дякую заздалегідь.
Bhagyashree

Відповіді:


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 Learner

@MagentoLearner. Я точно не знаю, але в мене є думка, що це працює.
Маріус

@Marius, дуже швидка відповідь !!! велике спасибі
Magento Learner

@Marius, Припустимо, я хочу додати один супер атрибут. Додавши рядок з product_id та attribute_id до таблиці, catalog_product_super_attributeбуде працювати? Або мені потрібно змінити інші таблиці? Як у stackoverflow.com/a/13381381/1749007
Magento Learner

5

Це вимагає прямого редагування бази даних, і перший закон Магенто - це не безпосередньо редагувати базу даних .

Але якщо ви досить божевільні, щоб продовжити, це було висвітлено в StackOverflow кілька місяців тому:

укти. Я протестував нижченаведене вирішення проблеми взяття БД на CE 1.6.2 і, здається, працює:

  • Створити атрибут
  • Перетягніть його у відповідний набір атрибутів
  • Перейдіть до редактора db або phpmyadmin, таблиця 'catalog_eav_attribute' і перегляньте останній, відмітьте 'ідентифікатор атрибута', також відмітьте ідентифікатор продукту -> перейдіть до каталогу_product_entity і шукайте потрібний вам настроюваний продукт, і зверніть увагу на entit_id -> це є product_id
  • Перейдіть до каталогу_product_super_attribute та вставте новий запис із product_id та attribute_id, примітка product_super_attribute_id
  • Перейдіть до каталогу_product_super_attribute_label і вставте новий запис із product_super_attribute_id та значенням вашого нового атрибута, наприклад "Color" або "Size", який ви використовували під час додавання атрибута в адміністраторі
  • Поверніться до адміністратора і натисніть на конфігуруваний продукт, ви помітите, що жоден із ваших дочірніх продуктів не асоціюється з вашим продуктом, який можна настроювати.
  • Клацніть один із дочірніх продуктів і виберіть відповідне значення атрибута, ви також можете змінити sku.
  • Експортуйте всі дочірні продукти та додайте до нього нові значення атрибутів та sku, імпортуйте їх назад, і ви закінчите, або вам, можливо, доведеться вручну змінити все в адміністраторі без використання потоку даних.

Кредит: /programming/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. Таблиця catalog_product_super_attribute посилає продукти на атрибути супер продукту. Ви можете додавати та видаляти атрибути, щоб створити там настроювані продукти.


1
Щоб видалити атрибут супер продукту з конкретного окремого продукту, ви можете розширити вищезазначений запит SQL для фільтрації також за ідентифікатором продукту DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
Суддя

0

Існує брудний злом, щоб відкрити продукт, що настроюється, потім вибирається дублікат, вибирається старий і новий атрибут, дублікат робиться без SKU, потім видаляється оригінальний продукт, що настроюється, і прості продукти. Після цього ви можете надати той самий SKU для копіювання. Тоді потрібно просто виготовити нові прості вироби.

Це швидко вирішити, якщо не так багато простих продуктів.


Не правильна відповідь
Діпак Рай

0

Щойно мені вдалося це зробити більш чисто, використовуючи інструмент експорту експорту безкоштовного імпорту Magmi в режимі оновлення. (версія для розуміння)

Експортуйте ключові поля, змініть налаштування стовпців configigurable_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", щоб побачити, як атрибут спочатку визначається в базі даних).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.