Question

Je développe actuellement un configurateur de produits. Je présente une forme qui envoie les valeurs d'option administrateur de mes attributs personnalisés via POST à ??une action du contrôleur. Si j'utilise l'option d'attribut de magasin actuel des étiquettes tout fonctionne très bien, la collection de produit est correctement filtré et un produit simple qui est associé à un produit configurable est retourné. Malheureusement, j'utilise les valeurs d'administration pour la génération de formulaire et URL parce que les valeurs par défaut de magasin suédois contiennent trop de caractères spéciaux.

Donc, ma question est: comment puis-je obtenir le bon produit de ma collection en utilisant les valeurs des options d'administration ou plus précis, comment puis-je obtenir l'ID de la valeur de l'option admin comme l'utilisation de cela pour les valeurs du magasin par défaut:

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

Je l'ai déjà essayé filtrage par addStoreFilter (0), mais cela ne fonctionne pas non plus. Je l'ai déjà lu qu'il pourrait avoir quelque chose à voir avec des tables plats utilisés en magasin par défaut, mais pas pour admin, mais je suis plutôt inexpérimentée avec Magento, donc je ne comprends pas vraiment la différence en utilisant des tables à plat et ce que signifie vraiment.

Voici ma dernière question concernant le filtrage de référence: addFieldToFilter ne retourne pas le bon produit pour une sélection des valeurs d'attribut

Voici ma fonction getProduct ():

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;

    }
Était-ce utile?

La solution

Comme tous Magento, la réponse est dans la source -. Tout ce que vous devez faire est d'aller creuser (ou sauter à la fin puis de ce post)

D'abord, trouver la classe pour la source d'attribut

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

Dans les versions modernes de Magento, cela devrait pointer vers la Mage_Eav_Model_Entity_Attribute_Source_Table de classe, qui est situé à

#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
{
    //...
}

Ensuite, nous allons chercher la définition de la méthode getOptionId sur cette classe et / ou ses classes mères. Nous verrons dans la classe Mage_Eav_Model_Entity_Attribute_Source_Abstract

#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;
}

L'examen de cette méthode, nous pouvons voir si des œuvres de foreaching sur une liste d'options de la méthode getAllOptions. Alors, regardons la définition de cette méthode.

#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! Maintenant, nous sommes à quelque chose. Cela semble être la méthode qui charge toutes les informations d'option. Plus précisément, nous nous intéressons à

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

Alors, Magento obtient l'ID de magasin pour les options à charge de l'attribut . Cela signifie que vous devrait être en mesure de faire quelque chose comme ce qui suit (en remplacement color et red avec vos propres variables, bien sûr)

    //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');
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top