Ricerca…


Osservazioni

Esistono sei diversi tipi di prodotto integrati in Magento.

  • Semplice

Una singola unità di magazzino

  • configurabile

Primo dei prodotti compositi. Consenti ai clienti di configurare il proprio prodotto e aggiungere un singolo prodotto semplice al carrello.

  • raggruppate

Il secondo prodotto composito, un prodotto raggruppato mette in relazione prodotti semplici e offre ai clienti la possibilità di scegliere le quantità di ciascun articolo.

  • impacchettare

Il terzo tipo di prodotto composito, un pacchetto collega prodotti semplici insieme per l'acquisto come singolo articolo.

  • Virtuale

Nessun articolo fisico richiesto per la consegna, ad es. Servizi

  • Scaricabile

Un prodotto digitale piuttosto che fisico. La maggior parte dei tipi di prodotto sono implementati come parte del modulo Mage_Catalog, oltre a Mage_Bundle e Mage_Downloadable.

I prodotti raggruppati, bundle e configurabili implementano una relazione genitore-figlio in cui un numero di altri prodotti (di default, semplici, virtuali o scaricabili) vengono assegnati a un prodotto principale. In questo modo vengono gestiti i dati del prodotto per l'intera raccolta (ad es. Gruppo, pacchetto o nome prodotto, prezzo e stato configurabili).

I prodotti scaricabili e bundle hanno tabelle aggiuntive nel database, mentre il resto sono condivisi tra tutti gli altri tipi di prodotto. I prodotti configurabili dispongono di una tabella aggiuntiva per il collegamento ai prodotti secondari, catalog_product_super_link.

Tipo di prodotto personalizzato

Per creare un tipo di prodotto che estenda uno dei tipi di prodotto integrati, è necessario estendere il modello del tipo di prodotto corrispondente. In caso contrario, il nuovo tipo di prodotto dovrebbe estendere la classe Mage_Catalog_Model_Product_Type_Abstract.

È richiesta anche una voce nel config.xml del modulo:

Prodotti più complicati possono richiedere altre aree personalizzate come il modello di prezzo e il retriever dei dati dell'indice.

Calcolo del prezzo

Quando si tratta di un singolo prodotto, il prezzo viene sempre calcolato al volo. L'attributo EAV di prezzo viene caricato con il prodotto e il prezzo finale viene calcolato dal modello di prezzo, Mage_Catalog_Model_Product_Type_Price.

Alcuni tipi di prodotti si occupano in modo diverso. In tal caso estendono questa classe e implementano la loro logica. Ad esempio, il prodotto configurabile sovrascrive getFinalPrice () e aggiunge logica aggiuntiva. Questo modello personalizzato può quindi essere specificato in config.xml con un tag <price_model>.

Le raccolte di prodotti, tuttavia, utilizzano l'indice dei prezzi per recuperare i prezzi precalcolati, eliminando la necessità di calcolarlo per ciascun prodotto.

Il prezzo finale può essere regolato dagli osservatori dell'evento catalog_product_get_final_price. Per impostazione predefinita, solo il modulo Mage_CatalogRule osserva questo evento.

Un altro metodo per scavalcare il prezzo di produzione è semplicemente impostarlo sul prodotto. Se il prezzo è impostato, il prodotto non lo ricalcola.

Il prezzo del livello del prodotto è separato dal prezzo normale (sebbene preso in considerazione nel calcolo del prezzo). È implementato come un elenco con un gruppo di clienti e qualificatori di quantità minima per ogni livello. I prezzi di livello vengono visualizzati in una tabella, utilizzando il modello catalogo / prodotto / vista / tierprices.phtml.

Le opzioni di prodotto personalizzate vengono elaborate durante il calcolo del prezzo finale. Ogni opzione ha il suo prezzo definito, che viene aggiunto al prezzo finale.

I prezzi di gruppo, di livello e speciali vengono presi in considerazione contemporaneamente ($priceModel->getBasePrice()) e il più piccolo dei tre (o quattro se si include il prezzo normale) viene scelto come prezzo base del prodotto.

Imposta

Il modulo Mage_Tax utilizza la classe di tasse di un prodotto e indipendentemente dal fatto che il prezzo del prodotto sia inclusivo o esente da tasse al fine di identificare l'aliquota corretta da applicare.

I seguenti fattori vengono utilizzati per calcolare le imposte sui prodotti:

  • Classe fiscale del prodotto
  • L'importo della tassa già incluso
  • Indirizzi di fatturazione e spedizione
  • Classe fiscale cliente
  • Memorizza le impostazioni

Navigazione a strati

Le classi responsabili del rendering della navigazione a più livelli sono:

  • Mage_Catalog_Block_Layer_View

    - Gestisce i filtri e le opzioni

  • Mage_Catalog_Block_Layer_State

-Controlla ciò che viene attualmente filtrato da

Per implementare la navigazione a più livelli sugli attributi con modelli di origine personalizzati, il metodo Mage_Catalog_Model_Layer_Filter_Abstract :: apply () dovrebbe essere sovrascritto per dettare come deve essere filtrata la raccolta di prodotti.

La navigazione stratificata viene resa dai blocchi Mage_Catalog_Block_Layer_View e Mage_Catalog_Block_Layer_State, che utilizzano i blocchi filtro per i singoli filtri.

La navigazione stratificata utilizza la tabella degli indici per la maggior parte dei filtri, ad esempio prezzo, indice degli attributi dei prodotti, indice dei prodotti decimali.

categorie

Categorie nel database

La gerarchia di categorie viene gestita memorizzando l'ID genitore di una categoria. La gerarchia completa è mostrata nella colonna percorso (ID barra separata). C'è una categoria speciale con parent_id di 0. Questa è la vera categoria radice e ognuna delle altre categorie di root come definite in Magento usa questo come un genitore condiviso.

Per leggere e gestire un albero di categorie dal database vengono utilizzate due classi diverse a seconda che il catalogo sia attivato, Mage_Catalog_Model_Resource_Category_Tree e Mage_Catalog_Model_Resource_Category_Flat.

Il vantaggio delle categorie piatte è che è più veloce da interrogare. Tuttavia, deve essere ricostruito dalle tabelle EAV ogni volta che viene apportata una modifica.

getChildren()

restituisce una stringa separata da virgole di ID bambini immediati

getAllChildren()

restituisce una stringa o una matrice di tutti gli ID figli

getChildrenCategories()

restituisce una raccolta di categorie di bambini immediati NB Se il catalogo flat è abilitato, le sole categorie di figlio restituite saranno quelle con include_in_menu = 1. In entrambi i casi, vengono restituite solo le categorie attive.

Regole del prezzo del catalogo

Le regole del prezzo del catalogo applicano sconti ai prodotti in base alla data, al prodotto, al sito Web e al gruppo di clienti.

Quando viene chiamato getFinalPrice() su un prodotto, viene getFinalPrice() l'evento catalog_product_get_final_price. Questo è osservato da Mage_CatalogRule_Model_Observer che cercherà quindi qualsiasi regola del prezzo di catalogo applicabile al prodotto. Se applicabile, esamina quindi la tabella dei prezzi del database e scrive il prezzo sul modello del prodotto come un campo di dati Varien final_price.

All'interno del database, la tabella catalogrule descrive le regole, le loro condizioni e le loro azioni. catalogrule_product contiene i prodotti abbinati e alcune informazioni sulle regole. Nel frattempo catalogrule_product_price contiene il prezzo dopo l'applicazione della regola.

Indicizzazione e tabelle piatte

Le tabelle di catalogo semplici sono gestite dagli indicizzatori di catalogo. Se la ricostruzione automatica degli indici è attivata, gli indicizzatori del catalogo vengono ricreati ogni volta che un prodotto, una categoria o qualsiasi entità correlata vengono aggiornati. Il metodo _afterSave () chiama il processo dell'indicizzatore. Altrimenti devono essere reindicizzati manualmente tramite admin.

Il tipo di prodotto influisce sull'indice dei prezzi e sull'indice azionario in cui i prodotti possono definire i propri indicizzatori personalizzati (in config.xml) per gestire i loro dati per questi indici.

Il modulo Mage_Index fornisce il framework con il quale è possibile creare indici personalizzati per ottimizzare le prestazioni del sito. La classe Mage_Index_Model_Indexer_Abstract deve essere estesa per creare un nuovo indice, implementando i metodi _registerEvent () e _processEvent (). Senza dimenticare di registrarlo in config.xml:

<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;
    }
}

Descrivere tipi di prodotti standard (semplici, configurabili, in bundle)

Semplice

Il tipo di prodotti semplici dovrebbe essere usato in quanto generalmente hanno una configurazione singola (taglia unica). Questo potrebbe includere elementi come:

  • Una scatola di pastelli, piccola (24 colori)
  • Una scatola di pastelli, grande (64 colori)
  • Monitor per computer HD da 26 "SuperHighTech
  • Barrack Obama Action Figure (6 ")

raggruppate

I prodotti raggruppati ti consentono di creare un nuovo prodotto utilizzando uno o più prodotti esistenti nel tuo negozio. Ad esempio, supponiamo di avere già una "figura d'azione di Barrack Obama" e una "figura d'azione di George W. Bush" nel tuo negozio e volevi venderle come un pacchetto. Dovresti semplicemente creare un nuovo prodotto raggruppato (chiamiamolo "Obama + Bush (prendi entrambi e spendi due volte tanto!)", Quindi aggiungi entrambe le figure di azione al gruppo tramite la scheda "Prodotti associati".

Nota: Purtroppo, non è possibile impostare un prezzo speciale per "gruppo" direttamente dalla pagina del prodotto. Per offrire uno sconto per l'acquisto di articoli, dovrai creare una nuova regola del prezzo del carrello.

configurabile

Prodotto configurabile: questo prodotto consente ai clienti di selezionare la variante che desiderano scegliendo le opzioni. Ad esempio, puoi vendere magliette in due colori e tre taglie. Dovresti creare sei prodotti semplici come singoli prodotti (ciascuno con i propri SKU) e quindi aggiungere questi sei a un prodotto configurabile in cui i clienti possono scegliere la dimensione e il colore, quindi aggiungerlo al carrello. Funzionalità molto simile è possibile utilizzando le opzioni personalizzate per i prodotti semplici. La differenza tra un prodotto configurabile e un prodotto che include opzioni personalizzate è che l'inventario non viene controllato o aggiornato per le singole opzioni durante l'acquisto delle opzioni personalizzate.

Virtuale

I prodotti virtuali sono quelli che non hanno una controparte fisica o digitale. Non spediscono, né hanno un link per il download. Questo tipo di prodotto potrebbe essere utilizzato per servizi come:

  • Pulizie di casa
  • Iscrizione alla newsletter di 1 anno

Nota: se si utilizzano prodotti virtuali per "abbonamenti", è importante notare che non esiste un modo integrato per gestire gli abbonamenti con rinnovo automatico. Tutti gli acquisti effettuati in Magento, indipendentemente dal tipo di prodotto, sono acquisti una tantum.

impacchettare

Questo tipo di prodotto è anche noto come "kit" in altri software eCommerce. Questo tipo di prodotto è ideale per le circostanze in cui l'utente deve selezionare un numero di opzioni configurabili, ma almeno un'opzione. Questo potrebbe includere prodotti come:

  • Sistemi informatici personalizzabili
  • Smoking / tute personalizzabili
  • Fai clic qui per un'esercitazione video sull'utilizzo dei pacchetti

Scaricabile

I prodotti scaricabili sono simili ai prodotti virtuali, tranne che includono la possibilità di aggiungere uno o più file digitali per il download. I file possono essere caricati tramite l'interfaccia di amministrazione o caricati direttamente sul server tramite FTP e quindi aggiunti tramite URL. Quando un cliente acquista un prodotto scaricabile, Magento genererà un collegamento crittografato sicuro (in modo che i clienti non possano vedere la posizione reale del file) affinché quel cliente possa scaricare il proprio file.

Questa categoria potrebbe includere prodotti come:

  • Musica / Mp3
  • Software per il computer

Nota : se hai SSL abilitato per il tuo sito, i download potrebbero non riuscire in tutte le versioni di IE poiché IE contiene un bug che impedisce il download su connessioni sicure se è impostata l'intestazione no-cache. Questo può essere facilmente risolto in un file htaccess rimuovendo le intestazioni no-cache e no-store o forzando i link di download a non essere sicuri.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow