Pregunta

Actualmente estoy desarrollando un configurador de producto.Estoy presentando un formulario que envía el administrador de la opción de valores de mis atributos personalizados a través de correo postal a una acción del controlador.Si yo uso el almacén actual del atributo opción de etiquetas que todo está funcionando bien, la recogida del producto se filtra correctamente y un simple producto que se asocia a una configurable producto es devuelto.Lamentablemente yo estoy usando la de administración de valores de la forma y el URL de la generación, porque el defecto sueco de la tienda valores contienen demasiados caracteres especiales.

Así que mi pregunta es:¿cómo puedo obtener el producto correcto en mi colección cuando se utiliza el administrador de valores de opción o más específico, ¿qué puedo obtener de la administración el valor de la opción de ID de como usar esto para el defecto de la tienda valores:

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

Ya lo he intentado filtrar por addStoreFilter(0), pero que no funciona tampoco.Ya he leído que podría tener algo que ver con tv de tablas que se utilizan en defecto de la tienda, pero no para la administración, pero soy bastante inexperto con Magento, por lo que yo no entiendo muy bien la diferencia con tv de tablas y lo que realmente significa.

Aquí está mi última pregunta sobre el filtrado de referencia:addFieldToFilter no devuelve el producto adecuado para una selección de valores de atributo

Aquí está mi getProduct() función:

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;

    }
¿Fue útil?

Solución

Como todos los de Magento, la respuesta está en la fuente — todo lo que necesitas hacer es ir a cavar (o hop a finales de este post).

En primer lugar, encontrar la clase para el atributo de fuente

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

En las versiones modernas de Magento, este debe apuntar a la clase Mage_Eav_Model_Entity_Attribute_Source_Table, que se encuentra en

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

A continuación, veremos la definición de la getOptionId método de esta clase y/o clases para los padres.Nos encontrará en el Mage_Eav_Model_Entity_Attribute_Source_Abstract clase

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

El examen de este método, podemos ver si funciona foreaching a través de una lista de opciones de la getAllOptions método.Así que echemos un vistazo a este método de definición.

#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 ja!Ahora estamos en algo.Este parece ser el método que carga toda la información de la opción.En concreto, estamos interesados en

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

Así, Magento obtiene el IDENTIFICADOR de almacén para las opciones de carga desde el atributo.Esto significa que usted debería ser capaz de hacer algo como lo siguiente (en sustitución de color y red con sus propias variables, por supuesto)

    //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');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top