Frage

Ich entwickle derzeit einen Produktkonfigurator. Ich sende ein Formular, das die Administrator -Optionswerte meiner benutzerdefinierten Attribute per Post an eine Controller -Aktion sendet. Wenn ich die Attributoptionsbezeichnungen des aktuellen Speichers verwende, funktioniert alles in Ordnung, die Produktsammlung wird korrekt gefiltert und ein einfaches Produkt, das einem konfigurierbaren Produkt zugeordnet ist. Leider verwende ich die Administratorwerte für Form und URL -Generierung, da die Standard -Swedish -Store -Werte zu viele Sonderzeichen enthalten.

Meine Frage lautet also: Wie erhalte ich das richtige Produkt aus meiner Sammlung, wenn ich die Administrator -Optionswerte oder genauer gesagt kann?

$id = Mage::getResourceModel('catalog/product')
                                    ->getAttribute($key)
                                    ->getSource()
                                    ->getOptionId($value); 

Ich habe bereits versucht, von AddStorefilter (0) zu filtern, aber das hat auch nicht funktioniert. Ich habe bereits gelesen, dass es etwas mit flachen Tischen zu tun hat, die im Standard -Store verwendet werden, aber nicht für Administrator, aber ich bin ziemlich unerfahren mit Magento, daher verstehe ich den Unterschied nicht wirklich mit Flachtischen und was das wirklich bedeutet.

Hier ist meine letzte Frage zur Filterung als Referenz:AddfieldToFilter gibt das richtige Produkt für ausgewählte Attributwerte nicht zurück

Hier ist meine GetProduct () -Funktion:

public function getProduct($attributes)
    {

        Mage::Log($attributes);

        $productModel = Mage::getModel('catalog/product');

        //Get Product Collection
        $collection = $productModel->getCollection()


        //Filter for Selected Product
        $collection->addAttributeToSelect('status');
        $collection->addAttributeToSelect('doorconfig_enable');
        $collection->addAttributeToFilter('doorconfig_enable',array('eq' => 1));

        foreach ($attributes as $key => $value) 
        {
            $collection->addAttributeToSelect($key);

            $id = Mage::getResourceModel('catalog/product')
                                    ->getAttribute($key)
                                    ->getSource()
                                    ->getOptionId($value);

            $collection->addAttributeToFilter($key,
                array(
                        'eq' => $id
                     )
            );

        }

        $selection = $collection->getSelect()->__toString();

        Mage::Log($selection);

        Mage::log($collection->getSize(),null,'custom.log');

        $product = $collection->getFirstItem();

        return $product;

    }
War es hilfreich?

Lösung

Wie alle Magento ist die Antwort in der Quelle - lediglich, was Sie tun müssen, ist zu graben (oder zu Ende dieses Beitrags zu beenden).

Suchen Sie zuerst die Klasse für die Attributquelle

$source = Mage::getResourceModel('catalog/product')
->getAttribute('color')
->getSource();        
var_dump(get_class($source));
exit;

In modernen Versionen von Magento sollte dies auf die Klasse hinweisen Mage_Eav_Model_Entity_Attribute_Source_Table, was sich an befindet bei

#File: app/code/core/Mage/Eav/Model/Entity/Attribute/Source/Table.php
class Mage_Eav_Model_Entity_Attribute_Source_Table extends Mage_Eav_Model_Entity_Attribute_Source_Abstract
{
    //...
}

Als nächstes suchen wir nach der Definition der getOptionId Methode in dieser Klasse und/oder über Elternklassen. Wir werden es in der finden Mage_Eav_Model_Entity_Attribute_Source_Abstract Klasse

#File: app/code/core/Mage/Eav/Model/Entity/Attribute/Source/Abstract.php
public function getOptionId($value)
{
    foreach ($this->getAllOptions() as $option) {
        if (strcasecmp($option['label'], $value)==0 || $option['value'] == $value) {
            return $option['value'];
        }
    }
    return null;
}

Wenn wir diese Methode untersuchen, können wir sehen, ob funktioniert foreachüber eine Liste von Optionen aus dem getAllOptions Methode. Schauen wir uns also die Definition dieser Methode an.

#File: app/code/core/Mage/Eav/Model/Entity/Attribute/Source/Table.php
public function getAllOptions($withEmpty = true, $defaultValues = false)
{
    $storeId = $this->getAttribute()->getStoreId();
    if (!is_array($this->_options)) {
        $this->_options = array();
    }
    if (!is_array($this->_optionsDefault)) {
        $this->_optionsDefault = array();
    }
    if (!isset($this->_options[$storeId])) {
        $collection = Mage::getResourceModel('eav/entity_attribute_option_collection')
            ->setPositionOrder('asc')
            ->setAttributeFilter($this->getAttribute()->getId())
            ->setStoreFilter($this->getAttribute()->getStoreId())
            ->load();
        $this->_options[$storeId]        = $collection->toOptionArray();
        $this->_optionsDefault[$storeId] = $collection->toOptionArray('default_value');
    }
    $options = ($defaultValues ? $this->_optionsDefault[$storeId] : $this->_options[$storeId]);
    if ($withEmpty) {
        array_unshift($options, array('label' => '', 'value' => ''));
    }

    return $options;
}

Ah ha! Jetzt sind wir auf etwas. Dies scheint die Methode zu sein, die alle Optionsinformationen lädt. Insbesondere interessieren wir uns für

$storeId = $this->getAttribute()->getStoreId();

Also erhält Magento die Store -ID für die Optionen zum Laden Aus dem Attribut. Dies bedeutet color und red mit Ihren eigenen Variablen natürlich)

    //get the attribute
    $attribute = Mage::getResourceModel('catalog/product')
    ->getAttribute('color');

    //set the store id on the attribute
    $attribute->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID);

    //get the source
    $source = $attribute->getSource();

    //get the id
    $id = $source->getOptionId('red');
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top