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

¿Fue útil?

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.

  1. deberías usar el save_before evento
  2. No load() el producto de nuevo, $product ya contiene todos los datos
  3. 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á

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top