Cómo establecer el valor seleccionado en el atributo multiselecto
-
16-10-2019 - |
Pregunta
Cómo establecer el valor seleccionado en el atributo multiselecto progmáticamente. Probé este pero no funciona para mí.
Cómo establecer programáticamente el atributo multiselecto de un producto por etiquetas
El código en el enlace de arriba no deja de cargar
$productObj = Mage::getModel('catalog/product')->load($product->getId());
$productObj->setData('filter_category','51,52');
$productObj->save();
El código anterior es invocar después catalog_product_save_after
Solución
Ya que quieres hacer esto en la acción catalog_product_save_after
Puede actualizar simple el atributo de producto individual y no el producto completo, deteniendo así el problema de bucle infinito.
$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);
Otros consejos
Como otros han mencionado, el problema es que entras en un bucle infinito si guardas el producto nuevamente en el save_after
evento.
- deberías usar el
save_before
evento - No
load()
el producto de nuevo,$product
ya contiene todos los datos - No
save()
Como los datos en los que establece$product
se guardará después de que el evento haya terminado
Entonces, el código para su nuevo observador se ve así:
public function setFilterCategoryBeforeSave(Varien_Event_Observer $observer)
{
$observer->getProduct()->setData('filter_category','51,52');
}
Eso es todo.
Puede filtrar múltiples seleccionar usando Finset. A continuación se muestra un pequeño ejemplo de cómo filtrarlo
$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);
Aquí $ Selection es el valor del atributo seleccionado múltiple que se filtrará