Chiamata di carico con nome dell'attributo - $ prodotto-> load ( 'nome_attributo');
-
16-10-2019 - |
Domanda
Guardando attraverso uno dei progetti che ho lavorato su, continuo imbattersi in codice che fa $product->load('attribute_name')
, dove il prodotto è un'istanza di Mage_Catalog_Model_Product
. Scavando verso il basso attraverso il codice per un modello di prodotto, non riesco a vedere che cosa questo dovrebbe fare. Questo è solo un malinteso da chi ha scritto questo codice personalizzato, o mi sto perdendo qualcosa?
Per quanto mi riguarda questo sarebbe tentare di caricare un prodotto con l'id di 'attribute_code', che non esiste. In questa situazione avrebbe colpito Mage_Eav_Model_Entity_Abstract::load
con $product, 'attribute_code', array()
come argomenti. Questo effettivamente consentirebbe il modello corrente come nuovo con isObjectNew(true)
in quanto non può essere caricato dal database, ma poiché è $attributes
svuotarlo innescherà Mage_Eav_Model_Entity_Abstract::loadAllAttributes
, che a causa del fatto il modello è stato parzialmente caricato e contiene quindi un'entity_id già, recupera tutti gli attributi dal database per quella entity_id
. Se questo è il caso, il 'attribute_code'
stringa è in qualche modo irrilevante (purché non sia l'entity_id di un altro prodotto) e tutti gli attributi verrà caricato per l'entity_id contenuta nel modello.
E 'la mia comprensione corretta, o mi sto perdendo qualcosa?
Soluzione
In breve, sì, quello che stai suggerendo è corretta. L'istruzione SELECT costruito quando si chiama il carico in voi questione sarebbe il seguente.
SELECT `catalog_product_entity`.* FROM `catalog_product_entity` WHERE (entity_id ='attribute_name')
Potete trovare questo fuori con l'aggiunta di un po 'di debug nel metodo di carico in Mage_Eav_Model_Entity_Abstract
Se si sta in realtà vogliono caricare un prodotto tramite un attributo che non è entity_id
il seguente frammento avrebbe fatto.
Mage::getModel('catalog/product')->loadByAttribute('sku', 'My Sku Value');
Nota: con loadByAttribute
se l'attributo non riguardano solo allora il primo oggetto trovato verrà restituito
seconda nota: questo restituirà sia un object
o false
(grazie Fabian)
Altri suggerimenti
Oltre a David Manners ...
Se si sta in realtà vogliono caricare tramite un attributo che è un prodotto Non
entity_id
il seguente frammento avrebbe fatto.Mage::getModel('catalog/product')->loadByAttribute('sku', 'My Sku Value');
per velocizzare il caricamento si dovrebbe prendere cura del parametro loadByAttribute
3.
/**
* Load entity by attribute
*
* @param Mage_Eav_Model_Entity_Attribute_Interface|integer|string|array $attribute
* @param null|string|array $value
* @param string $additionalAttributes
* @return bool|Mage_Catalog_Model_Abstract
*/
public function loadByAttribute($attribute, $value, $additionalAttributes = '*')
{
$collection = $this->getResourceCollection()
->addAttributeToSelect($additionalAttributes)
->addAttributeToFilter($attribute, $value)
->setPage(1,1);
foreach ($collection as $object) {
return $object;
}
return false;
}
Set $additionalAttributes
a null
(solo gli attributi di default) oppure array('your', 'attributes', 'here')
per il proprio.
$attributesToSelect = array('name');
Mage::getModel('catalog/product')->loadByAttribute('sku', 'My Sku Value', $attributesToSelect);