製品を削除して、既存の構成可能な製品に属性を追加または削除し直すよりも、正しい手順は何ですか。
構成可能製品を作成するとき、製品に使用する属性を選択するように求められます。
最初に選択された属性の一部を削除する必要がある製品がたくさんあります。また、最初に選択されなかった属性の追加が必要な製品もあります。
製品の削除は、これに対する最善のアプローチとは思えないため、これに関するヘルプは大歓迎です。特に他の多くのものが製品に関連付けられているため。
製品を削除して、既存の構成可能な製品に属性を追加または削除し直すよりも、正しい手順は何ですか。
構成可能製品を作成するとき、製品に使用する属性を選択するように求められます。
最初に選択された属性の一部を削除する必要がある製品がたくさんあります。また、最初に選択されなかった属性の追加が必要な製品もあります。
製品の削除は、これに対する最善のアプローチとは思えないため、これに関するヘルプは大歓迎です。特に他の多くのものが製品に関連付けられているため。
回答:
以下は、構成可能な製品から属性を削除するために私が使用する継ぎ目です。
これがシナリオです。
すべての構成可能製品は、brand
約200の単純な関連製品を持つ約50の構成可能製品の構成可能属性としての属性で誤って作成されました。
構成可能な属性に関連付けられているすべての単純な製品は同じブランドを持っています。構想はbrand
、構成可能な属性から削除し、構成可能な製品の1つの値を持つ構成可能な製品にそれを単純な属性として割り当てることです。
これを行うコードを次に示します。コードは1回だけ実行されます。アップグレードスクリプトまたは単純な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
場合、価値を得るために構成可能な製品のすべての単純な製品を入手する必要はありませんが、私は気にしませんでした。
catalog_product_super_attribute
ことで機能しますか?または、他のテーブルを変更する必要がありますか?以下のようstackoverflow.com/a/13381381/1749007
これにはデータベースを直接編集する必要があり、Magentoの最初の法則はデータベースを直接編集しないことです。
しかし、あなたが先に進むのに夢中なら、これは数ヶ月前にStackOverflowでカバーされていました:
ucts。CE 1.6.2で以下のDB回避策ハックをテストしましたが、動作しているようです:
- 属性を作成
- 適切な属性セットにドラッグします
- dbエディターまたはphpmyadminの表 'catalog_eav_attribute'に移動し、最後の項目を確認し、 'attribute id'に注意し、製品IDにも注意してください-> catalog_product_entityに移動して、必要な構成可能な製品を探し、entity_id-> thisに注意してくださいはproduct_idです
- catalog_product_super_attributeに移動し、product_idおよびattribute_idを含む新しいレコードを挿入します。product_super_attribute_idに注意してください
- catalog_product_super_attribute_labelに移動し、product_super_attribute_idと、管理で属性を追加するときに使用した「Color」や「Size」などの新しい属性の値を持つ新しいレコードを挿入します
- 管理者に戻り、構成可能な製品をクリックすると、子製品が構成可能な製品に関連付けられていないことがわかります。
- 子製品の1つをクリックし、適切な属性値を選択します。SKUを変更することもできます。
- すべての子製品をエクスポートして、新しい属性とsku値を追加し、インポートし直します。または、データフローを使用せずに管理者ですべてを手動で変更する必要があります。
クレジット:https : //stackoverflow.com/questions/5658197/add-new-attribute-to-existing-configurable-product-magento
未テスト-YMMV。
すべての構成可能な製品から1つのスーパー製品属性(呼び出されたときに)を削除するには、データベースで次のSQLクエリを実行できます。
DELETE FROM catalog_product_super_attribute
WHERE attribute_id = <id>;
ここに、attribute_codeに関してeav_attributeテーブルに保存されている属性のidがあります。catalog_product_super_attributeテーブルは、製品をスーパー製品属性にリンクします。属性を追加および削除して、構成可能な製品を作成できます。
DELETE FROM catalog_product_super_attribute WHERE attribute_id = <attribute_id> AND product_id = <product_id>;
構成可能製品の「構成可能」属性の1つである属性を削除する必要がありました。
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」の「デフォルト」データセットを検索して、データベースで属性が最初に定義される方法を確認したい)。