Comment définir la valeur sélectionnée dans l'attribut multiselect
-
16-10-2019 - |
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
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
.
- vous devez utiliser l'événement
save_before
- Ne pas
load()
à nouveau le produit,$product
contient déjà toutes les données - 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