Frage

So setzen Sie den ausgewählten Wert im Multiselect -Attribut progmatisch fest. Ich habe es versucht, aber es funktioniert nicht für mich.

So setzen Sie das Multi-Select-Attribut eines Produkts programmgesteuert nach Beschriftungen

Der Code auf dem obigen Link hört nicht zum Laden ab

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

Der obige Code wird danach aufgerufen catalog_product_save_after

War es hilfreich?

Lösung

Da möchten Sie dies in der Aktion tun catalog_product_save_after Sie können das individuelle Produktattribut und nicht das vollständige Produkt einfach aktualisieren, wodurch das Problem der Infinite Loop gestoppt wird.

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

Andere Tipps

Wie andere erwähnt haben, ist das Problem, dass Sie in eine unendliche Schleife gehen, wenn Sie das Produkt erneut in der speichern save_after Veranstaltung.

  1. Sie sollten die verwenden save_before Veranstaltung
  2. Nicht load() das Produkt wieder, $product Enthält bereits alle Daten
  3. Nicht save() als die Daten, die Sie festgelegt haben $product wird gerettet, nachdem die Veranstaltung beendet ist

Der Code für Ihren neuen Beobachter sieht also so aus:

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

Das ist alles.

Sie können mehrere SELECT -FINSET mit Finset filtern. Unten finden Sie ein kleines Beispiel dafür, wie Filtern es filtern

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

Hier ist $ Selection der Wert des zu filternen Multiple -Select -Attributs

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top