Suche…


Bemerkungen

In Magento sind sechs verschiedene Produkttypen integriert.

  • Einfach

Eine einzelne Lagereinheit

  • Konfigurierbar

Erste der zusammengesetzten Produkte. Erlauben Sie Kunden, Ihr Produkt zu konfigurieren und fügen Sie ein einfaches Produkt in den Warenkorb.

  • Gruppiert

Das zweite zusammengesetzte Produkt, ein gruppiertes Produkt, bezieht sich auf einfache Produkte und bietet Kunden die Möglichkeit, die Mengen jedes Artikels zu wählen.

  • Bündeln

Der dritte zusammengesetzte Produkttyp, ein Bundle, stellt einfache Produkte zusammen, um sie als Einzelartikel zu erwerben.

  • Virtuell

Kein physischer Artikel für die Lieferung erforderlich, z. B. Dienstleistungen

  • Herunterladbar

Ein digitales Produkt anstatt eines physischen Produkts. Die meisten Produkttypen sind, abgesehen von Mage_Bundle und Mage_Downloadable, als Teil des Moduls Mage_Catalog implementiert.

Gruppierte, gebündelte und konfigurierbare Produkte implementieren eine Eltern-Kind-Beziehung, bei der eine Reihe anderer (standardmäßig einfacher, virtueller oder herunterladbarer) Produkte einem Hauptprodukt zugewiesen werden. Diese verarbeitet dann die Produktdaten für die gesamte Sammlung (z. B. Gruppe, Bündel oder konfigurierbare Produktnamen, Preis und Status).

Herunterladbare Produkte und Bundle-Produkte enthalten zusätzliche Tabellen in der Datenbank, während der Rest unter allen anderen Produkttypen aufgeteilt wird. Konfigurierbare Produkte verfügen über eine zusätzliche Tabelle für die Verknüpfung mit untergeordneten Produkten, catalog_product_super_link.

Kundenspezifischer Produkttyp

Um einen Produkttyp zu erstellen, der einen der integrierten Produkttypen erweitert, sollte das entsprechende Produkttypmodell erweitert werden. Andernfalls sollte der neue Produkttyp die Klasse Mage_Catalog_Model_Product_Type_Abstract erweitern.

Ein Eintrag in der config.xml des Moduls ist ebenfalls erforderlich:

Für kompliziertere Produkte sind möglicherweise andere benutzerdefinierte Bereiche erforderlich, beispielsweise Preismodell und Indexdatenabruf.

Preisberechnung

Bei einem einzelnen Produkt wird der Preis immer im laufenden Betrieb berechnet. Das Preis-EAV-Attribut wird mit dem Produkt geladen, und der Endpreis wird vom Preismodell Mage_Catalog_Model_Product_Type_Price berechnet.

Einige Produkttypen gehen anders damit um. In diesem Fall erweitern sie diese Klasse und implementieren ihre eigene Logik. Das konfigurierbare Produkt überschreibt beispielsweise getFinalPrice () und fügt zusätzliche Logik hinzu. Dieses benutzerdefinierte Modell kann dann mit einem <price_model> -Tag in config.xml angegeben werden.

Bei Produktkollektionen wird der Preisindex jedoch zum Abrufen vorberechneter Preise verwendet, sodass keine Berechnung für jedes Produkt erforderlich ist.

Der endgültige Preis kann durch die Beobachter des catalog_product_get_final_price -Ereignisses angepasst werden. Standardmäßig beobachtet nur das Mage_CatalogRule-Modul dieses Ereignis.

Eine andere Methode, den Produktionspreis zu überschreiben, besteht darin, ihn einfach auf das Produkt zu setzen. Wenn der Preis festgelegt ist, berechnet das Produkt ihn nicht neu.

Der Preis der Produktstufe ist vom normalen Preis getrennt (wird jedoch bei der Preisberechnung berücksichtigt). Es ist als Liste mit einer Kundengruppe und Mindestanzahlqualifikatoren für jede Stufe implementiert. Tarifpreise werden in einer Tabelle mit der Vorlage catalog / product / view / tierprices.phtml angezeigt.

Benutzerdefinierte Produktoptionen werden bei der Berechnung des Endpreises verarbeitet. Für jede Option wird ein eigener Preis festgelegt, der zum Endpreis addiert wird.

($priceModel->getBasePrice()) und Sonderpreise werden gleichzeitig berücksichtigt ($priceModel->getBasePrice()) und der kleinste der drei (oder vier, wenn Sie den regulären Preis ($priceModel->getBasePrice()) ausgewählt.

MwSt

Das Mage_Tax-Modul verwendet die Steuerklasse eines Produkts und legt fest, ob der Produktpreis inklusiv oder nicht steuerpflichtig ist, um den korrekten anzuwendenden Steuersatz zu ermitteln.

Die folgenden Faktoren werden zur Berechnung der Produktsteuer verwendet:

  • Produktsteuerklasse
  • Die Höhe der Steuer ist bereits enthalten
  • Rechnungs- und Lieferadressen
  • Kundensteuerklasse
  • Einstellungen speichern

Layered Navigation

Die Klassen, die für das Rendern der mehrschichtigen Navigation verantwortlich sind, sind:

  • Mage_Catalog_Block_Layer_View

    -Handle die Filter und Optionen

  • Mage_Catalog_Block_Layer_State

-Controls, was aktuell durch gefiltert wird

Um die mehrstufige Navigation für Attribute mit benutzerdefinierten Quellmodellen zu implementieren, muss die Methode Mage_Catalog_Model_Layer_Filter_Abstract :: apply () überschrieben werden, um festzulegen, wie die Produktsammlung gefiltert werden soll.

Die mehrstufige Navigation wird von den Blöcken Mage_Catalog_Block_Layer_View und Mage_Catalog_Block_Layer_State dargestellt, die Filterblöcke für einzelne Filter verwenden.

Layered Navigation verwendet für die meisten Filter eine Indextabelle, z. B. Preis, Produktattributindex und Dezimalproduktindex.

Kategorien

Kategorien in der Datenbank

Die Kategoriehierarchie wird durch Speichern der übergeordneten ID einer Kategorie verwaltet. Die vollständige Hierarchie wird in der Pfadspalte angezeigt (durch Schrägstrich getrennte IDs). Es gibt eine spezielle Kategorie mit parent_id von 0. Dies ist die wahre Wurzelkategorie, und jede der anderen in Magento definierten Wurzelkategorien verwendet diese als gemeinsame übergeordnete Klasse.

Um einen Kategoriebaum aus der Datenbank zu lesen und zu verwalten, werden zwei verschiedene Klassen verwendet, abhängig davon, ob der Flache Katalog aktiviert ist: Mage_Catalog_Model_Resource_Category_Tree und Mage_Catalog_Model_Resource_Category_Flat.

Der Vorteil von flachen Kategorien ist, dass sie schneller abgefragt werden können. Es muss jedoch bei jeder Änderung aus den EAV-Tabellen neu erstellt werden.

getChildren()

Gibt eine durch Kommas getrennte Zeichenfolge der unmittelbar untergeordneten IDs zurück

getAllChildren()

gibt eine Zeichenfolge oder ein Array aller untergeordneten IDs zurück

getChildrenCategories()

Gibt eine Sammlung von untergeordneten Kategorien zurück. Hinweis: Wenn der flache Katalog aktiviert ist, werden nur die untergeordneten Kategorien mit include_in_menu = 1 zurückgegeben. In beiden Fällen werden nur aktive Kategorien zurückgegeben.

Katalogpreisregeln

Für Katalogpreisregeln gelten Rabatte für Produkte nach Datum, Produkt, Website und Kundengruppe.

Wenn für ein Produkt getFinalPrice() aufgerufen wird, wird das Ereignis catalog_product_get_final_price ausgelöst. Dies wird von Mage_CatalogRule_Model_Observer beobachtet, der dann nach einer Katalogpreisregel sucht, die für das Produkt gilt. Gegebenenfalls betrachtet er die Datenbankpreistabelle und schreibt den Preis als Varien-Datenfeld final_price zurück in das Produktmodell.

Innerhalb der Datenbank beschreibt die Tabelle der Katalogregeln Regeln, ihre Bedingungen und ihre Aktionen. catalogrule_product enthält die übereinstimmenden Produkte und einige Regelinformationen. Inzwischen enthält catalogrule_product_price den Preis, nachdem die Regel angewendet wurde.

Indexierung und flache Tabellen

Flache Katalogtabellen werden von Katalogindexern verwaltet. Wenn die automatische Neuerstellung der Indizes aktiviert ist, werden die Katalogindexierer jedes Mal neu erstellt, wenn ein Produkt, eine Kategorie oder verwandte Entitäten aktualisiert werden. Die _afterSave () - Methode ruft den Indexerprozess auf. Andernfalls müssen sie manuell über admin neu indiziert werden.

Der Produkttyp beeinflusst den Preisindex und den Aktienindex, wobei Produkte eigene benutzerdefinierte Indexer (in config.xml) definieren können, um ihre Daten für diese Indizes zu verarbeiten.

Das Mage_Index-Modul bietet das Framework, mit dem benutzerdefinierte Indizes erstellt werden können, um die Leistung der Website zu optimieren. Die Mage_Index_Model_Indexer_Abstract-Klasse sollte erweitert werden, um einen neuen Index zu erstellen, der die Methoden _registerEvent () und _processEvent () implementiert. Vergessen Sie nicht, es in config.xml zu registrieren:

<global>
    <index>
        <indexer>
            <{name}>{model}</{name}>
        </indexer>
    </index>
</global>

Mage_Catalog_Model_Product_Type

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/osl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to [email protected] so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     Mage_Catalog
 * @copyright   Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */

/**
 * Product type model
 *
 * @category    Mage
 * @package     Mage_Catalog
 * @author      Magento Core Team 
 */
class Mage_Catalog_Model_Product_Type
{
    /**
     * Available product types
     */
    const TYPE_SIMPLE       = 'simple';
    const TYPE_BUNDLE       = 'bundle';
    const TYPE_CONFIGURABLE = 'configurable';
    const TYPE_GROUPED      = 'grouped';
    const TYPE_VIRTUAL      = 'virtual';

    const DEFAULT_TYPE      = 'simple';
    const DEFAULT_TYPE_MODEL    = 'catalog/product_type_simple';
    const DEFAULT_PRICE_MODEL   = 'catalog/product_type_price';

    static protected $_types;
    static protected $_compositeTypes;
    static protected $_priceModels;
    static protected $_typesPriority;

    /**
     * Product type instance factory
     *
     * @param   Mage_Catalog_Model_Product $product
     * @param   bool $singleton
     * @return  Mage_Catalog_Model_Product_Type_Abstract
     */
    public static function factory($product, $singleton = false)
    {
        $types = self::getTypes();
        $typeId = $product->getTypeId();

        if (!empty($types[$typeId]['model'])) {
            $typeModelName = $types[$typeId]['model'];
        } else {
            $typeModelName = self::DEFAULT_TYPE_MODEL;
            $typeId = self::DEFAULT_TYPE;
        }

        if ($singleton === true) {
            $typeModel = Mage::getSingleton($typeModelName);
        }
        else {
            $typeModel = Mage::getModel($typeModelName);
            $typeModel->setProduct($product);
        }
        $typeModel->setConfig($types[$typeId]);
        return $typeModel;
    }

    /**
     * Product type price model factory
     *
     * @param   string $productType
     * @return  Mage_Catalog_Model_Product_Type_Price
     */
    public static function priceFactory($productType)
    {
        if (isset(self::$_priceModels[$productType])) {
            return self::$_priceModels[$productType];
        }

        $types = self::getTypes();

        if (!empty($types[$productType]['price_model'])) {
            $priceModelName = $types[$productType]['price_model'];
        } else {
            $priceModelName = self::DEFAULT_PRICE_MODEL;
        }

        self::$_priceModels[$productType] = Mage::getModel($priceModelName);
        return self::$_priceModels[$productType];
    }

    static public function getOptionArray()
    {
        $options = array();
        foreach(self::getTypes() as $typeId=>$type) {
            $options[$typeId] = Mage::helper('catalog')->__($type['label']);
        }

        return $options;
    }

    static public function getAllOption()
    {
        $options = self::getOptionArray();
        array_unshift($options, array('value'=>'', 'label'=>''));
        return $options;
    }

    static public function getAllOptions()
    {
        $res = array();
        $res[] = array('value'=>'', 'label'=>'');
        foreach (self::getOptionArray() as $index => $value) {
            $res[] = array(
               'value' => $index,
               'label' => $value
            );
        }
        return $res;
    }

    static public function getOptions()
    {
        $res = array();
        foreach (self::getOptionArray() as $index => $value) {
            $res[] = array(
               'value' => $index,
               'label' => $value
            );
        }
        return $res;
    }

    static public function getOptionText($optionId)
    {
        $options = self::getOptionArray();
        return isset($options[$optionId]) ? $options[$optionId] : null;
    }

    static public function getTypes()
    {
        if (is_null(self::$_types)) {
            $productTypes = Mage::getConfig()->getNode('global/catalog/product/type')->asArray();
            foreach ($productTypes as $productKey => $productConfig) {
                $moduleName = 'catalog';
                if (isset($productConfig['@']['module'])) {
                    $moduleName = $productConfig['@']['module'];
                }
                $translatedLabel = Mage::helper($moduleName)->__($productConfig['label']);
                $productTypes[$productKey]['label'] = $translatedLabel;
            }
            self::$_types = $productTypes;
        }

        return self::$_types;
    }

    /**
     * Return composite product type Ids
     *
     * @return array
     */
    static public function getCompositeTypes()
    {
        if (is_null(self::$_compositeTypes)) {
            self::$_compositeTypes = array();
            $types = self::getTypes();
            foreach ($types as $typeId=>$typeInfo) {
                if (array_key_exists('composite', $typeInfo) && $typeInfo['composite']) {
                    self::$_compositeTypes[] = $typeId;
                }
            }
        }
        return self::$_compositeTypes;
    }

    /**
     * Return product types by type indexing priority
     *
     * @return array
     */
    public static function getTypesByPriority()
    {
        if (is_null(self::$_typesPriority)) {
            self::$_typesPriority = array();
            $a = array();
            $b = array();

            $types = self::getTypes();
            foreach ($types as $typeId => $typeInfo) {
                $priority = isset($typeInfo['index_priority']) ? abs(intval($typeInfo['index_priority'])) : 0;
                if (!empty($typeInfo['composite'])) {
                    $b[$typeId] = $priority;
                } else {
                    $a[$typeId] = $priority;
                }
            }

            asort($a, SORT_NUMERIC);
            asort($b, SORT_NUMERIC);

            foreach (array_keys($a) as $typeId) {
                self::$_typesPriority[$typeId] = $types[$typeId];
            }
            foreach (array_keys($b) as $typeId) {
                self::$_typesPriority[$typeId] = $types[$typeId];
            }
        }
        return self::$_typesPriority;
    }
}

Beschreiben von Standardprodukttypen (einfach, konfigurierbar, gebündelt)

Einfach

Der Typ Einfache Produkte sollte dafür verwendet werden, da er in der Regel eine einzige Konfiguration hat (Einheitsgröße). Dies kann beispielsweise Folgendes beinhalten:

  • Eine Schachtel Buntstifte, klein (24 Farben)
  • Eine Schachtel Buntstifte, groß (64 Farben)
  • SuperHighTech 26 "HD-Computerbildschirm
  • Baracke Obama Action Figure (6 ")

Gruppiert

Mit gruppierten Produkten können Sie ein neues Produkt mit einem oder mehreren in Ihrem Geschäft vorhandenen Produkten erstellen. Nehmen wir zum Beispiel an, Sie haben bereits eine „Barrack Obama Action Figure“ und eine „George W Bush Action Figure“ in Ihrem Geschäft und möchten diese als Bundle verkaufen. Sie würden einfach ein neues gruppiertes Produkt erstellen (nennen wir es "Obama + Bush (Holen Sie sich beides und geben Sie doppelt so viel aus!")), Und fügen Sie beide Aktionsfiguren über die Registerkarte "Zugehörige Produkte" zur Gruppe hinzu.

Hinweis: Leider können Sie keinen speziellen Gruppenpreis direkt auf der Produktseite festlegen. Um einen Rabatt für den Kauf von Artikeln anzubieten, müssen Sie eine neue Warenkorbpreisregel erstellen.

Konfigurierbar

Konfigurierbares Produkt: Mit diesem Produkt können Ihre Kunden die gewünschte Variante durch Auswahl von Optionen auswählen. Zum Beispiel können Sie T-Shirts in zwei Farben und drei Größen verkaufen. Sie erstellen sechs einfache Produkte als einzelne Produkte (jeweils mit eigenen SKUs) und fügen diese sechs dann zu einem konfigurierbaren Produkt hinzu, in dem die Kunden die Größe und Farbe auswählen und sie dann in den Warenkorb legen können. Eine sehr ähnliche Funktionalität ist möglich, wenn Sie Benutzerdefinierte Optionen für einfache Produkte verwenden. Der Unterschied zwischen einem konfigurierbaren Produkt und einem Produkt einschließlich benutzerdefinierter Optionen besteht darin, dass das Inventar beim Kauf der benutzerdefinierten Optionen nicht für einzelne Optionen geprüft oder aktualisiert wird.

Virtuell

Virtuelle Produkte sind Produkte, die weder physisch noch digital sind. Sie versenden nicht und haben auch keinen Download-Link. Dieser Produkttyp kann für folgende Dienste verwendet werden:

  • Hausputz
  • 1-Jahres-Newsletter-Abonnement

Hinweis: Wenn Sie virtuelle Produkte für "Abonnements" verwenden, ist es wichtig zu beachten, dass es keine integrierte Methode zum Verwalten von Abonnements mit automatischer Verlängerung gibt. Alle Einkäufe, die unabhängig von der Produktart in Magento getätigt werden, sind einmalig.

Bündeln

Dieser Produkttyp wird in anderen E-Commerce-Software auch als "Kit" bezeichnet. Dieser Produkttyp ist ideal für Situationen, in denen der Benutzer eine Anzahl konfigurierbarer Optionen auswählen muss, mindestens jedoch eine Option. Dies kann Produkte wie:

  • Anpassbare Computersysteme
  • Anpassbare Smoking / Anzüge
  • Klicken Sie hier für ein Video-Tutorial zur Verwendung von Bundles

Herunterladbar

Herunterladbare Produkte ähneln virtuellen Produkten, haben jedoch die Möglichkeit, eine oder mehrere digitale Dateien zum Download hinzuzufügen. Dateien können entweder über die Admin-Oberfläche hochgeladen werden oder direkt per FTP auf den Server hochgeladen und dann über die URL hinzugefügt werden. Wenn ein Kunde ein herunterladbares Produkt erwirbt, generiert Magento einen sicheren, verschlüsselten Link (damit der Kunde den tatsächlichen Speicherort der Datei nicht sehen kann), damit der Kunde seine Datei herunterladen kann.

Diese Kategorie kann folgende Produkte umfassen:

  • Musik / MP3s
  • Computer Software

Hinweis : Wenn Sie SSL für Ihre Site aktiviert haben, schlagen die Downloads möglicherweise bei allen IE-Versionen fehl, da IE einen Fehler enthält, der das Herunterladen über sichere Verbindungen verhindert, wenn der Header ohne Cache festgelegt ist. Dies kann leicht in einer htaccess-Datei behoben werden, indem die Header No-Cache und No-Store entfernt werden oder Download-Links als nicht sicher erzwungen werden.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow