マルチセレクト属性で選択された値を設定する方法
-
16-10-2019 - |
質問
マルチセレクト属性で選択された値をプログラムで設定する方法。私はこれを試しましたが、それは私にとってはうまくいきません。
上記のリンクのコードはロードを停止しません
$productObj = Mage::getModel('catalog/product')->load($product->getId());
$productObj->setData('filter_category','51,52');
$productObj->save();
上記のコードは後に呼び出されます catalog_product_save_after
解決
アクションでこれを行いたいので catalog_product_save_after
完全な製品ではなく、個々の製品属性を簡単に更新できるため、無限のループの問題を停止できます。
$attrCode = 'your_attribute';
$sourceModel = Mage::getModel('catalog/product')->getResource()
->getAttribute($attrCode)->getSource();
$valuesText = explode(',', 'red,green,blue');
$valuesIds = array_map(array($sourceModel, 'getOptionId'), $valuesText);
$product->setData($attrCode, $valuesIds);
$product->getResource()->saveAttribute($product, $attrCode);
他のヒント
他の人が述べたように、問題は、製品を再度保存すると、無限のループに入ることです。 save_after
イベント。
- を使用する必要があります
save_before
イベント - しないでください
load()
再び製品、$product
すでにすべてのデータが含まれています - しないでください
save()
設定したデータとして$product
イベントが終了した後に保存されます
したがって、新しいオブザーバーのコードは次のようになります:
public function setFilterCategoryBeforeSave(Varien_Event_Observer $observer)
{
$observer->getProduct()->setData('filter_category','51,52');
}
それで全部です。
Finsetを使用して複数の選択をフィルタリングできます。以下は、どのようにフィルタリングするかの小さな例です
$collection = $this->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('visibility', $visibility)
->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED)
->addAttributeToFilter($attribute,array('finset'=>array_search($selection,$valueId)))
->setPageSize($limit)
->load();
Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collection);
ここで$選択は、フィルタリングする複数の選択属性の値です
所属していません magento.stackexchange