Come filtrare collezione di prodotti dai valori delle opzioni di amministrazione di attributi?
-
16-10-2019 - |
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;
}
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 foreach
ing 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');