magento
Producttypen begrijpen
Zoeken…
Opmerkingen
Er zijn zes verschillende producttypen ingebouwd in Magento.
- Gemakkelijk
Een enkele stock-eenheid
- configureerbaar
Eerste van de samengestelde producten. Sta klanten toe hun product te configureren en één eenvoudig product toe te voegen aan winkelmandje.
- gegroepeerd
Het tweede samengestelde product, een gegroepeerd product, heeft betrekking op eenvoudige producten en biedt klanten de mogelijkheid om de hoeveelheden van elk artikel te kiezen.
- Bundel
Het derde samengestelde producttype, een bundel, verbindt eenvoudige producten samen om als één artikel te kopen.
- virtueel
Geen fysiek item vereist voor levering, bijv. Services
- downloadbare
Een digitaal in plaats van een fysiek product. De meeste producttypen worden geïmplementeerd als onderdeel van de Mage_Catalog-module, behalve Mage_Bundle en Mage_Downloadable.
Gegroepeerde, bundel- en configureerbare producten implementeren een ouder-kindrelatie waarbij een aantal andere (standaard, eenvoudige, virtuele of downloadbare) producten aan een hoofdproduct worden toegewezen. Dit verwerkt dan de productgegevens voor de hele verzameling (bijv. Groep, bundel of configureerbare productnaam, prijs en status).
Downloadbare en bundelproducten hebben extra tabellen in de database, terwijl de rest wordt gedeeld met alle andere productsoorten. Configureerbare producten hebben een extra tabel om te koppelen aan onderliggende producten, catalog_product_super_link.
Aangepast producttype
Als u een producttype wilt maken dat een van de ingebouwde producttypen uitbreidt, moet het overeenkomstige producttypemodel worden uitgebreid. Anders zou het nieuwe producttype de klasse Mage_Catalog_Model_Product_Type_Abstract moeten uitbreiden.
Een vermelding in config.xml van de module is ook vereist:
Voor meer gecompliceerde producten kunnen andere aangepaste gebieden nodig zijn, zoals prijsmodel en indexgegevensretriever.Prijsberekening
Wanneer het om één enkel product gaat, wordt de prijs altijd direct berekend. Het prijs-EAV-kenmerk wordt geladen met het product en de uiteindelijke prijs wordt berekend door het prijsmodel, Mage_Catalog_Model_Product_Type_Price.
Sommige productsoorten gaan er anders mee om. In welk geval ze deze klasse uitbreiden en hun eigen logica implementeren. Het configureerbare product overschrijft bijvoorbeeld getFinalPrice () en voegt extra logica toe. Dit aangepaste model kan vervolgens worden opgegeven in config.xml met een tag <price_model>.
Productcollecties gebruiken echter de prijsindex om vooraf berekende prijzen op te halen, waardoor het niet nodig is om het voor elk product te berekenen.
De uiteindelijke prijs kan worden aangepast door de waarnemers van het evenement catalog_product_get_final_price. Standaard neemt alleen de Mage_CatalogRule-module deze gebeurtenis waar.
Een andere methode om de productieprijs te overschrijven, is om deze eenvoudig op het product in te stellen. Als de prijs is ingesteld, zal het product deze niet opnieuw berekenen.
De prijs van de productlaag staat los van de normale prijs (hoewel er wel rekening mee wordt gehouden bij het berekenen van de prijs). Het is geïmplementeerd als een lijst met een klantengroep en minimumkwalificatie voor elke laag. Tierprijzen worden in een tabel weergegeven met behulp van de sjabloon catalog / product / view / tierprices.phtml.
Aangepaste productopties worden verwerkt bij het berekenen van de uiteindelijke prijs. Elke optie heeft zijn eigen prijs die wordt toegevoegd aan de uiteindelijke prijs.
Groeps-, niveau- en speciale prijzen worden allemaal tegelijkertijd overwogen ($priceModel->getBasePrice())
en de kleinste van de drie (of vier als u de normale prijs ($priceModel->getBasePrice())
) wordt gekozen als de basisproductprijs.
Belasting
De Mage_Tax-module gebruikt de belastingklasse van een product en of de productprijs inclusief of exclusief btw is om het juiste toe te passen tarief te identificeren.
De volgende factoren worden gebruikt om de belasting op producten te berekenen:
- Product belastingklasse
- Het belastingbedrag dat al is inbegrepen
- Factuur- en verzendadressen
- Belastingklasse klanten
- Instellingen opslaan
Gelaagde navigatie
De klassen die verantwoordelijk zijn voor het renderen van de gelaagde navigatie zijn:
Mage_Catalog_Block_Layer_View
-Handelt de filters en opties
Mage_Catalog_Block_Layer_State
-Bestuurt waarop momenteel wordt gefilterd
Om gelaagde navigatie op attributen met aangepaste bronmodellen te implementeren, moet de methode Mage_Catalog_Model_Layer_Filter_Abstract :: apply () worden overschreven om te dicteren hoe de productcollectie moet worden gefilterd.
Gelaagde navigatie wordt weergegeven door de blokken Mage_Catalog_Block_Layer_View en Mage_Catalog_Block_Layer_State, die filterblokken gebruiken voor individuele filters.
Gelaagde navigatie gebruikt indextabel voor de meeste filters, bijv. Prijs, productkenmerkindex, decimale productindex.
Categorieën
Categorieën in de database
Categoriehiërarchie wordt beheerd door het ouder-ID van een categorie op te slaan. De volledige hiërarchie wordt weergegeven in de padkolom (slash gescheiden ID's). Er is een speciale categorie met parent_id van 0. Dit is de echte rootcategorie en elk van de andere rootcategorieën zoals gedefinieerd in Magento gebruikt dit als een gedeelde ouder.
Om een categorieboom uit de database te lezen en te beheren, worden twee verschillende klassen gebruikt, afhankelijk van of flat catalog is ingeschakeld, Mage_Catalog_Model_Resource_Category_Tree en Mage_Catalog_Model_Resource_Category_Flat.
Het voordeel van platte categorieën is dat het sneller kan worden opgevraagd. Het moet echter telkens opnieuw worden opgebouwd vanuit de EAV-tabellen als er een wijziging is.
getChildren()
geeft een door komma's gescheiden reeks onmiddellijke ID's voor kinderen terug
getAllChildren()
geeft een string of array van alle kinder-ID's terug
getChildrenCategories()
geeft een verzameling van directe onderliggende categorieën terug NB Als platte catalogus is ingeschakeld, zijn de enige geretourneerde onderliggende categorieën die met include_in_menu = 1. In beide gevallen worden alleen actieve categorieën geretourneerd.
Catalogusprijsregels
Catalogusprijsregels passen kortingen toe op producten op basis van datum, product, website en klantengroep.
Wanneer getFinalPrice()
op een product wordt aangeroepen, wordt de event catalog_product_get_final_price getFinalPrice()
. Dit wordt waargenomen door Mage_CatalogRule_Model_Observer die vervolgens zal zoeken naar eventuele catalogusprijsregels die op het product van toepassing zijn. Indien van toepassing, wordt vervolgens naar de prijstabel van de database gekeken en wordt de prijs teruggeschreven naar het productmodel als een Varien-gegevensveld final_price.
Binnen de database beschrijft de catalogusregel regels, hun voorwaarden en hun acties. catalogrule_product bevat de overeenkomende producten en enige regelinformatie. Ondertussen bevat catalogrule_product_price de prijs nadat de regel is toegepast.
Indexering en platte tabellen
Platte catalogustabellen worden beheerd door catalogusindexers. Als automatisch opnieuw opbouwen van de indexen is ingeschakeld, worden de catalogusindexers opnieuw opgebouwd telkens wanneer een product, categorie of gerelateerde entiteiten worden bijgewerkt. De methode _afterSave () roept het indexeerproces aan. Anders moeten ze handmatig opnieuw worden geïndexeerd via admin.
Producttype is van invloed op prijsindex en aandelenindex, waarbij producten hun eigen aangepaste indexers (in config.xml) kunnen definiëren om hun gegevens voor deze indexen af te handelen.
De Mage_Index-module biedt het raamwerk waarmee aangepaste indexen kunnen worden gemaakt om de prestaties van de site te optimaliseren. De klasse Mage_Index_Model_Indexer_Abstract moet worden uitgebreid om een nieuwe index te maken met de methoden _registerEvent () en _processEvent (). Vergeet niet te registreren 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;
}
}
Beschrijf standaardproducttypen (eenvoudig, configureerbaar, gebundeld)
Gemakkelijk
Het type Simple Products moet hiervoor worden gebruikt en heeft doorgaans een enkele configuratie (one-size-fits-all). Dit kunnen items zijn zoals:
- Een doos kleurpotloden, klein (24 kleuren)
- Een doos kleurpotloden, groot (64 kleuren)
- SuperHighTech 26-inch HD-computermonitor
- Barrack Obama Action Figure (6 ")
gegroepeerd
Met gegroepeerde producten kunt u een nieuw product maken met een of meer bestaande producten in uw winkel. Laten we bijvoorbeeld aannemen dat u een "Barrack Obama Action Figure" en een "George W Bush Action Figure" al in uw winkel heeft en u ze als een bundel wilde verkopen. U zou eenvoudig een nieuw gegroepeerd product maken (laten we het "Obama + Bush (krijg beide en twee keer zoveel uitgeven!)" Noemen, en vervolgens beide actiefiguren aan de groep toevoegen via het tabblad "Bijbehorende producten".
Opmerking: helaas kunt u geen speciale "groepsprijs" rechtstreeks vanaf de productpagina instellen. Als u korting wilt geven voor het samen kopen van artikelen, moet u een nieuwe prijsregel voor het winkelwagentje maken.
configureerbaar
Configureerbaar product: met dit product kunnen uw klanten de gewenste variant selecteren door opties te kiezen. U kunt bijvoorbeeld T-shirts in twee kleuren en drie maten verkopen. U maakt zes eenvoudige producten als afzonderlijke producten (elk met zijn eigen SKU's) en voegt deze zes vervolgens toe aan een configureerbaar product waar klanten de grootte en kleur kunnen kiezen en vervolgens aan hun winkelwagentje toevoegen. Zeer vergelijkbare functionaliteit is mogelijk door aangepaste opties voor Simple-producten te gebruiken. Het verschil tussen een configureerbaar product en een product met aangepaste opties is dat de inventaris niet wordt gecontroleerd of bijgewerkt voor individuele opties tijdens de aankoop van de aangepaste opties.
virtueel
Virtuele producten zijn producten die geen fysieke of digitale tegenhanger hebben. Ze verzenden niet en hebben ook geen downloadlink. Dit producttype kan worden gebruikt voor services zoals:
- Huis schoonmaken
- Abonnement op nieuwsbrief van 1 jaar
Opmerking: als u virtuele producten gebruikt voor "abonnementen", is het belangrijk op te merken dat er geen ingebouwde manier is om automatisch vernieuwende abonnementen te beheren. Alle aankopen in Magento, ongeacht het producttype, zijn eenmalige aankopen.
Bundel
Dit producttype wordt ook wel een 'kit' genoemd in andere e-commerce-software. Dit producttype is ideaal voor omstandigheden waarin de gebruiker een aantal configureerbare opties moet selecteren, maar ten minste één optie. Dit kunnen producten zijn zoals:
- Aanpasbare computersystemen
- Aanpasbare smoking / pakken
- Klik hier voor een videozelfstudie over het gebruik van bundels
downloadbare
Downloadbare producten zijn vergelijkbaar met virtuele producten, behalve dat ze de mogelijkheid bieden om een of meer digitale bestanden toe te voegen om te downloaden. Bestanden kunnen worden geüpload via de beheerdersinterface of door ze rechtstreeks via FTP naar de server te uploaden en vervolgens per URL toe te voegen. Wanneer een klant een downloadbaar product koopt, genereert Magento een veilige, gecodeerde link (zodat de klanten de echte locatie van het bestand niet kunnen zien) voor die klant om hun bestand te downloaden.
Deze categorie kan producten omvatten zoals:
- Muziek / MP3's
- Computer software
Opmerking : als SSL is ingeschakeld voor uw site, kunnen downloads mislukken onder alle versies van IE omdat IE een bug bevat die downloaden via beveiligde verbindingen voorkomt als de no-cache-header is ingesteld. Dit kan eenvoudig worden opgelost in een htaccess-bestand door de no-cache en no-store headers te verwijderen, of door downloadlinks te dwingen om niet-veilig te zijn.