Question

Comment définir la valeur sélectionnée dans l'attribut multiselect progmatically. J'ai essayé celui-ci, mais il ne fonctionne pas pour moi.

Comment définir par programme un attribut multi-Select produit par étiquettes

le code sur le lien ci-dessus n'empêche pas de chargement

$productObj = Mage::getModel('catalog/product')->load($product->getId());
$productObj->setData('filter_category','51,52');
$productObj->save();    

le code ci-dessus est invocation après catalog_product_save_after

Était-ce utile?

La solution

Puisque vous voulez faire dans le catalog_product_save_after d'action que vous pouvez mettre à jour simple, l'attribut du produit et non le produit complet, stoppant ainsi le problème de boucle infinie.

$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);

Autres conseils

Comme d'autres l'ont mentionné, le problème est que vous allez dans une boucle infinie si vous enregistrez le produit à nouveau en cas de save_after.

  1. vous devez utiliser l'événement save_before
  2. Ne pas load() à nouveau le produit, $product contient déjà toutes les données
  3. Ne pas save() que les données que vous avez définies sur $product seront sauvegardés après l'événement terminé

Alors le code de vos nouveaux regards d'observateurs comme ceci:

public function setFilterCategoryBeforeSave(Varien_Event_Observer $observer)
{
    $observer->getProduct()->setData('filter_category','51,52');
}

C'est tout.

Vous pouvez filtrer plusieurs sélection avec finset. Voici un petit exemple de la façon dont il filtre

$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); 

ici $ sélection est la valeur de plusieurs attribut select à filtrer

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top