質問

マルチセレクト属性で選択された値をプログラムで設定する方法。私はこれを試しましたが、それは私にとってはうまくいきません。

ラベル別に製品のマルチ選択属性をプログラム的に設定する方法

上記のリンクのコードはロードを停止しません

$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 イベント。

  1. を使用する必要があります save_before イベント
  2. しないでください load() 再び製品、 $product すでにすべてのデータが含まれています
  3. しないでください 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); 

ここで$選択は、フィルタリングする複数の選択属性の値です

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top