Recherche…


Remarques

Il existe six types de produits différents intégrés à Magento.

  • Simple

Une unité de stock unique

  • Configurable

Premier des produits composites. Autoriser les clients à configurer leur produit et ajouter un seul produit simple au panier.

  • Groupé

Le deuxième produit composite, un produit groupé, associe des produits simples et permet aux clients de choisir des quantités de chaque article.

  • Paquet

Troisième type de produit composite, un bundle relie des produits simples à un achat unique.

  • Virtuel

Aucun article physique requis pour la livraison, p.ex. services

  • Téléchargeable

Un produit numérique plutôt que physique. La plupart des types de produits sont implémentés dans le module Mage_Catalog, à l'exception de Mage_Bundle et Mage_Downloadable.

Les produits groupés, groupés et configurables implémentent une relation parent-enfant dans laquelle un certain nombre d'autres produits (par défaut, simples, virtuels ou téléchargeables) sont affectés à un produit principal. Cela traite ensuite les données de produit pour l'ensemble de la collection (par exemple, nom du groupe, du lot ou du produit configurable, prix et statut).

Les produits téléchargeables et regroupés ont des tables supplémentaires dans la base de données, tandis que le reste est partagé entre tous les autres types de produits. Les produits configurables ont une table supplémentaire à relier aux produits enfants, catalog_product_super_link.

Type de produit personnalisé

Pour créer un type de produit qui étend l'un des types de produits intégrés, le modèle de type de produit correspondant doit être étendu. Sinon, le nouveau type de produit devrait étendre la classe Mage_Catalog_Model_Product_Type_Abstract.

Une entrée dans le fichier config.xml du module est également requise:

Des produits plus compliqués peuvent nécessiter d'autres domaines personnalisés tels que le modèle de prix et la récupération des données d'index.

Calcul du prix

Lorsqu'il s'agit d'un seul produit, le prix est toujours calculé à la volée. L'attribut prix EAV est chargé avec le produit et le prix final est calculé par le modèle de prix, Mage_Catalog_Model_Product_Type_Price.

Certains types de produits le traitent différemment. Dans ce cas, ils étendent cette classe et implémentent leur propre logique. Par exemple, le produit configurable écrase getFinalPrice () et ajoute une logique supplémentaire. Ce modèle personnalisé peut ensuite être spécifié dans config.xml avec une balise <price_model>.

Les collections de produits, cependant, utilisent l'indice de prix pour récupérer les prix pré-calculés, éliminant ainsi le besoin de le calculer pour chaque produit.

Le prix final peut être ajusté par les observateurs de l'événement catalog_product_get_final_price. Par défaut, seul le module Mage_CatalogRule observe cet événement.

Une autre méthode pour remplacer le prix des produits consiste simplement à la définir sur le produit. Si le prix est défini, le produit ne le recalculera pas.

Le prix du produit est distinct du prix normal (bien que pris en compte lors du calcul du prix). Il est implémenté sous forme de liste avec un groupe de clients et des qualificateurs de quantité minimum pour chaque niveau. Les prix de niveau sont affichés dans un tableau à l'aide du modèle catalog / product / view / tierprices.phtml.

Les options de produits personnalisés sont traitées lors du calcul du prix final. Chaque option a son propre prix défini, qui s'ajoute au prix final.

Les prix de groupe, de niveau et spéciaux sont tous pris en compte en même temps ($priceModel->getBasePrice()) et le plus petit des trois (ou quatre si vous incluez le prix normal) est choisi comme prix de base du produit.

Impôt

Le module Mage_Tax utilise la classe de taxe d'un produit et indique si le prix du produit est inclus ou non, afin d'identifier le bon taux à appliquer.

Les facteurs suivants sont utilisés pour calculer la taxe sur les produits:

  • Classe de taxe sur les produits
  • Le montant de la taxe déjà inclus
  • Adresses de facturation et d'expédition
  • Classe de taxe client
  • Paramètres de magasin

Navigation en couches

Les classes responsables du rendu de la navigation en couches sont les suivantes:

  • Mage_Catalog_Block_Layer_View

    -Porte les filtres et les options

  • Mage_Catalog_Block_Layer_State

-Contrôle ce qui est actuellement filtré par

Pour implémenter la navigation en couches sur des attributs avec des modèles sources personnalisés, la méthode Mage_Catalog_Model_Layer_Filter_Abstract :: apply () doit être remplacée pour déterminer la manière dont la collection de produits doit être filtrée.

La navigation en couches est rendue par les blocs Mage_Catalog_Block_Layer_View et Mage_Catalog_Block_Layer_State, qui utilisent des blocs de filtrage pour des filtres individuels.

La navigation par couches utilise la table d'index pour la plupart des filtres, par exemple le prix, l'indice d'attribut de produit, l'index de produit décimal.

Catégories

Catégories dans la base de données

La hiérarchie des catégories est gérée en stockant l'ID parent d'une catégorie. La hiérarchie complète est affichée dans la colonne du chemin (identifiants séparés par une barre oblique). Il y a une catégorie spéciale avec parent_id de 0. C'est la vraie catégorie racine et chacune des autres catégories racine telles que définies dans Magento l'utilisent comme parent partagé.

Pour lire et gérer une arborescence de catégories à partir de la base de données, deux classes différentes sont utilisées selon que le catalogue à plat est activé, Mage_Catalog_Model_Resource_Category_Tree et Mage_Catalog_Model_Resource_Category_Flat.

L'avantage des catégories plates est qu'il est plus rapide d'interroger. Cependant, il doit être reconstruit à partir des tables EAV chaque fois qu’il ya un changement.

getChildren()

renvoie une chaîne séparée par des virgules d'ID enfants immédiats

getAllChildren()

renvoie une chaîne ou un tableau de tous les ID enfants

getChildrenCategories()

renvoie une collection de catégories d'enfants immédiates. NB: Si le catalogue à plat est activé, les seules catégories enfants renvoyées seront celles avec include_in_menu = 1. Dans les deux cas, seules les catégories actives sont renvoyées.

Règles de prix catalogue

Les règles de prix du catalogue appliquent des remises aux produits en fonction de la date, du produit, du site Web et du groupe de clients.

Lorsque getFinalPrice() est appelé sur un produit, l'événement catalog_product_get_final_price est déclenché. Ceci est observé par Mage_CatalogRule_Model_Observer qui recherchera alors toute règle de prix catalogue applicable au produit. S'il y a lieu, il examine ensuite la table de prix de la base de données et inscrit le prix dans le modèle de produit en tant que champ de données Varien final_price.

Dans la base de données, la table catalogrule décrit les règles, leurs conditions et leurs actions. catalogrule_product contient les produits correspondants et des informations sur les règles. Pendant ce temps catalogrule_product_price contient le prix après application de la règle.

Tables d'indexation et plates

Les tables de catalogue plates sont gérées par des indexeurs de catalogue. Si la reconstruction automatique des index est activée, les indexeurs de catalogue sont reconstruits chaque fois qu'un produit, une catégorie ou toute entité associée est mise à jour. La méthode _afterSave () appelle le processus de l'indexeur. Sinon, ils doivent être réindexés manuellement via admin.

Le type de produit affecte l'index des prix et l'index boursier dans lesquels les produits peuvent définir leurs propres indexeurs personnalisés (dans config.xml) pour gérer leurs données pour ces index.

Le module Mage_Index fournit la structure avec laquelle des index personnalisés peuvent être créés pour optimiser les performances du site. La classe Mage_Index_Model_Indexer_Abstract doit être étendue pour créer un nouvel index, en implémentant les méthodes _registerEvent () et _processEvent (). Sans oublier de l'enregistrer dans 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;
    }
}

Décrire les types de produits standard (simple, configurable, groupé)

Simple

Le type Simple Products doit être utilisé pour ceux qui ont généralement une seule configuration (one-size-fits-all). Cela pourrait inclure des éléments tels que:

  • Une boîte de crayons, petite (24 couleurs)
  • Une boîte de crayons, grande (64 couleurs)
  • Moniteur d'ordinateur HD 26 po SuperHighTech
  • Figurine Barrack Obama (6 ”)

Groupé

Les produits groupés vous permettent de créer un nouveau produit en utilisant un ou plusieurs produits existants dans votre magasin. Par exemple, supposons que vous ayez déjà dans votre magasin une «Figurine d'action Barrack Obama» et une «Figurine d'action George W Bush» et que vous vouliez les vendre en groupe. Vous devez simplement créer un nouveau produit groupé (appelons-le «Obama + Bush (Obtenir les deux et dépenser deux fois plus!)», Puis ajoutez les deux chiffres d'action au groupe via l'onglet «Produits associés».

Remarque: Malheureusement, vous ne pouvez pas définir un prix spécial «groupe» directement à partir de la page du produit. Pour offrir un rabais sur les achats groupés, vous devez créer une nouvelle règle sur les prix du panier.

Configurable

Produit configurable: ce produit permet à vos clients de sélectionner la variante de leur choix en choisissant des options. Par exemple, vous pouvez vendre des T-shirts en deux couleurs et trois tailles. Vous créez six produits simples en tant que produits individuels (chacun avec ses propres références), puis vous les ajoutez à un produit configurable où les clients peuvent choisir la taille et la couleur, puis les ajouter à leur panier. Des fonctionnalités très similaires sont possibles en utilisant les options personnalisées pour les produits simples. La différence entre un produit configurable et un produit, y compris les options personnalisées, est que l’inventaire n’est ni vérifié ni mis à jour pour les options individuelles lors de l’achat des options personnalisées.

Virtuel

Les produits virtuels sont ceux qui n'ont pas de contrepartie physique ou numérique. Ils ne sont pas expédiés, et ils n’ont pas de lien de téléchargement. Ce type de produit peut être utilisé pour des services tels que:

  • Nettoyage de la maison
  • Abonnement de 1 an à la newsletter

Remarque: Si vous utilisez des produits virtuels pour les «abonnements», il est important de noter qu’il n’existe aucun moyen intégré de gérer le renouvellement automatique des abonnements. Tous les achats effectués dans Magento, quel que soit le type de produit, sont des achats ponctuels.

Paquet

Ce type de produit est également appelé «kit» dans d’autres logiciels de commerce électronique. Ce type de produit est idéal dans les cas où l'utilisateur doit sélectionner un certain nombre d'options configurables, mais au moins une option. Cela pourrait inclure des produits comme:

  • Systèmes informatiques personnalisables
  • Smokings / costumes personnalisables
  • Cliquez ici pour un tutoriel vidéo sur l'utilisation de bundles

Téléchargeable

Les produits téléchargeables sont similaires aux produits virtuels, sauf qu'ils permettent d'ajouter un ou plusieurs fichiers numériques au téléchargement. Les fichiers peuvent être téléchargés via l'interface d'administration ou en téléchargeant directement sur le serveur via FTP, puis ajoutés par URL. Lorsqu'un client achète un produit téléchargeable, Magento génère un lien sécurisé et crypté (afin que les clients ne puissent pas voir l'emplacement réel du fichier) pour que ce client télécharge son fichier.

Cette catégorie peut inclure des produits tels que:

  • Musique / MP3
  • Logiciel

Remarque : Si SSL est activé pour votre site, les téléchargements peuvent échouer sous toutes les versions d'IE, car IE contient un bogue qui empêche le téléchargement via des connexions sécurisées si l'en-tête no-cache est défini. Cela peut être facilement corrigé dans un fichier htaccess en supprimant les en-têtes no-cache et no-store, ou en forçant les liens de téléchargement à ne plus être sécurisés.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow