Domanda

Attualmente sto sviluppando un configuratore di prodotto. Sto presentando una forma che invia i valori delle opzioni di amministrazione dei miei attributi personalizzati via posta ad un'azione di controllo. Se io uso l'opzione attributo del negozio corrente etichette tutto funziona bene, la raccolta del prodotto viene filtrato correttamente e un prodotto semplice che è associato ad un prodotto configurabile viene restituito. Purtroppo sto usando i valori di amministrazione per la forma e l'URL generazione perché i valori di default dei negozi svedesi contengono troppi caratteri speciali.

Quindi la mia domanda è: come faccio ad avere il prodotto giusto dalla mia collezione quando si utilizzano i valori di opzione di amministrazione o più specifiche, come faccio ad ottenere l'ID del valore dell'opzione di amministrazione come l'utilizzo di questo per i valori del negozio di default:

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

Ho già provato filtraggio da addStoreFilter (0), ma che non ha funzionato neanche. Ho già letto che potrebbe avere qualcosa a che fare con le tabelle piatte utilizzato in negozio di default, ma non per admin, ma sto piuttosto inesperto con Magento, quindi non capisco davvero la differenza utilizzando tabelle piatte e cosa che realmente significa.

Questa è la mia ultima domanda riguardante il filtraggio per riferimento: addFieldToFilter non restituisce il prodotto giusto per selezionato valori di attributo

Questa è la mia funzione EsprProdotto ():

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;

    }
È stato utile?

Soluzione

Come tutti Magento, la risposta è nella fonte -. Tutto quello che dovete fare è andare a scavare (o saltare per poi fine di questo post)

In primo luogo, trovare la classe per la sorgente di attributo

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

Nelle versioni moderne di Magento, questo dovrebbe puntare al Mage_Eav_Model_Entity_Attribute_Source_Table di classe, che si trova a

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

Avanti, vedremo per la definizione del metodo getOptionId su questa classe e / o di classi genitore. Ci troveremo nella 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;
}

Esaminando questo metodo, possiamo vedere se opere foreaching oltre un elenco di opzioni dal metodo di getAllOptions. Quindi, diamo un'occhiata a definizione di questo metodo.

#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 ah! Ora siamo a qualcosa. Questo sembra essere il metodo che carica tutte le informazioni sulle opzioni. In particolare, siamo interessati a

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

Quindi, Magento ottiene l'ID negozio per le opzioni per caricare dall'attributo . Ciò significa che dovreste essere in grado di fare qualcosa di simile alla seguente (color sostituzione e red con le proprie variabili, ovviamente)

    //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');
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top