Warum eigentlich immer alle Attribute eines Sets laden?

Besondere Anforderungen bringen besondere Probleme mit sich. So besitzt ein Kunden-Shop ca. 2500 Attribute in einem Attribute-Set. Davon sind aber längst nicht alle Werte immer gesetzt. Viel mehr war es beim automatischen Import nicht möglich diese logisch in Attribute-Sets zu gliedern. Leider brachte das einige Schwierigkeiten mit: Es wurde langsamer. Aber auch das konnten wir, erst mal mal schnell und "dreckig" lösen:

Der Trick bestand darin nur die Attribute eines Produktes zu laden bei denen wir auch Werte erwarten können. Das lässt sich, sehr einfach mit einer einzelnen SQL-Anweisung und ein paar Unions verbinden:

SELECT attribute_id FROM catalog_product_entity_varchar WHERE entity_id = XX

Dieses SQL liefert uns alle Attribute vom Typ varchar die zum jeweiligen Produkt gesetzt sind. Wiederholen muss man das ganze nun für die übrigen Entitäten. Dazu gehören z.B. decimal oder text.

Mit dem Wissen habe wir nun ganz böse und schnell die Mage_Eav_Model_Config gepachted. Diese ist dafür zuständig die Attribute zurückzugeben welche im nächsten Schritt geladen werden sollen. Heraus kamen ein paar Zeilen Code mit sehr guten Auswirkungen auf die Geschwindigkeit:

<?php

class Codex_HideNoAttributes_Model_Eav_Config extends Mage_Eav_Model_Config {

    protected $_attribute_prefix = 'customer_attribute_prefix';

    public function getEntityAttributeCodes($entityType, $object=null) {

        if ( $entityType->getEntityTypeCode() == 'catalog_product' && $object ) {

            $conn = Mage::getSingleton('core/resource')->getConnection('core_read');

            $subselects = array();
            foreach( array('catalog_product_entity_datetime',
                           'catalog_product_entity_decimal',
                           'catalog_product_entity_int',
                           'catalog_product_entity_text',
                           'catalog_product_entity_varchar') AS $tablename ) {

                    $subselects[] = "SELECT attribute_id FROM $tablename WHERE entity_id=".$object->getId();
            }

            $result = $conn->fetchAll("SELECT DISTINCT attribute_code FROM eav_attribute WHERE attribute_code LIKE '".$this->_attribute_prefix."%' AND attribute_id IN ( ".join(' UNION ', $subselects )." )" );

            $data = array();
            foreach( $result AS $item ) {
                $data[] = $item['attribute_code'];
            }

            foreach( parent::getEntityAttributeCodes( $entityType, $object ) AS $attribute_code ) {
                list($str) = explode('_', $attribute_code);
                if ( $str !=  $this->_attribute_prefix ) {
                    $data[] = $attribute_code;
                }
            }

            return $data;
        }

        return parent::getEntityAttributeCodes( $entityType, $object );
    }

}

Natürlich räumen wir noch auf :)



Ein Beitrag von Tobias Vogt
Tobias's avatar

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Seit 2016 ist er Mitgründer und CTO bei der connect-io GmbH, einer Magento-Agentur mit Sitz im idyllischen Paderborn-Salzkotten. Er gehört zum Gründer-Team der Webguys und ist seit November 2011 Bachelor of Science (Wirtschaftsinformatik). Sie erreichen Ihn per E-Mail unter tobi@webguys.de.

Alle Beiträge von Tobias

Dein Kommentar