Magento Certified Developer

Kurzinfo


Andreas von Studnitz

  • Diplom-Informatiker
  • 6 Jahre Entwicklungs- und Projektleitungserfahrung in einer Internet-Agentur
  • Magento-Freelancer
  • Magento Certified Developer
  • 4 Jahre Magento-Erfahrung

mehr »

Kontakt

Telefon:
02408 937 965 1 oder
0170 486 0 464

E-Mail:
avs(at)avs-webentwicklung.de 

Twitter: twitter.com/avstudnitz

mehr »

< Magento: Anzeigen von Bestellbedingungen in einem Fenster statt einer Textbox

Magento: Schnelles Auslesen von Attributen

27.10.2010 16:21

Magento braucht dank des EAV-Datenbankmodells, das es sehr flexibel macht, relativ viele Ressourcen zum Laden und Speichern von Datensätzen wie Produkten, Kategorien, Kunden und Kundenadressen. Will man nur einzelne oder wenige Attribute auslesen oder ändern, entsteht ein deutlicher Overhead.

Wie man einzelne Attribute schnell speichern kann, ohne das ganze Produkt (z.B.) speichern zu müssen, hat die Agentur flagbit bereits vor einiger Zeit veröffentlicht.

In Kürze: statt $product->save() wird $product->getResource()->saveAttribute($product, 'sku') aufgerufen, um nur die Artikelnummer ("SKU") eines Produktes zu speichern. 

Zum Auslesen war mir das bisher nicht bekannt. Eine Recherche hat allerdings ergeben, dass eine Methode dafür existiert. Sie befindet sich in der Klasse Mage_Catalog_Model_Resource_Eav_Mysql4_Abstract und sieht wie folgt aus:

/**
* Retrieve attribute's raw value from DB.
*
* @param int $entityId
* @param int|string $attribute atrribute's id or code
* @param int|Mage_Core_Model_Store $store
* @return bool|string
*/
public function getAttributeRawValue($entityId, $attribute, $store)
{ ...

Aufgerufen wird diese Funktion z.B. wie folgt:

$attributeValue = Mage::getModel('catalog/product')->getResource()->getAttributeRawValue($productId, 'sku', Mage_Core_Model_App::ADMIN_STORE_ID);

Hiermit ist es möglich, einzelne Attribute vieler Produkte deutlich schneller auszulesen, da nicht das ganze Produkt geladen werden muss, sondern nur das Attribut. Benötigt habe ich das für eine Importfunktion, aber auch andere Anwendungsfälle könnte ich mir vorstellen.

Kommentare

Dominik , 23.08.11 13:29:
Genau was ich gesucht habe. Damit bin ich in meiner Projektumsetzung einen großen Schritt weitergekommen. Danke!
Jan , 08.10.11 15:48:
Fantastisch! Neben der besseren Performance gibt es einen anderen Vorteil: wenn ein Shop product_flat_table benutzt, kann man so den flat table "cache" umgehen und immer aktuelle werte auslesen auch wenn der index veraltet ist!! Hat mir sehr geholfen!
Florian , 24.10.11 01:07:
Andreas, GENIAL!!! Bastel seit jetzt 3 Wochen an einer Funktion in Magento und konnte die Attribute nicht auslesen - weil protected. Mit der Funktion gehts! Perfekt, besten Dank!
Florian , 24.10.11 02:01:
Eine Frage hätte ich noch: Wie lese ich die Kategorie ID aus, wenn ich die Canonical URL nutze?
$category = Mage::getModel('catalog/category')->load(Mage::registry('current_category')->getID());

gibt mir das hier als Fehlermeldung zurueck:
Fatal error: Call to a member function getID() on a non-object in .../app/code/core/Mage/Catalog/Block/Product/Mostviewed.php on line 12


Dank dir fuer jeden Denkansatz!
Lais Lais, 28.03.12 14:51:
Figured out a fix for the international spihping. In the else statement forif ($r->getDestCountryId() == self::USA_COUNTRY_ID || $r->getDestCountryId() == self::PUERTORICO_COUNTRY_ID) {I added a similar modifier. Here it is in between my comments below} else { if (is_object($xml->Package) && is_object($xml->Package->Service)) { foreach ($xml->Package->Service as $service) { //CTT update for the latest USPS changes $service->SvcDescription = str_replace( <sup> </sup> , ",(string)$service->SvcDescription); //CTT end update

Kommentar hinzufügen

* - Pflichtfeld

*




*