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?

È stato utile?

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.

https://github.com/OpenMage/magento-lts/blob/1.9.3.x/app/code/core/Mage/Catalog/Model/Abstract.php#L216- L235

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