Sök…


Anmärkningar

Det finns sex olika produkttyper inbyggda i Magento.

  • Enkel

En enda lagerenhet

  • konfigurerbar

Först av de sammansatta produkterna. Låt kunderna konfigurera sin produkt och lägga till en enda enkel produkt i korgen.

  • grupperade

Den andra kompositprodukten, en grupperad produkt hänför sig till enkla produkter och ger kunderna möjlighet att välja mängder av varje artikel.

  • Bunt

Den tredje sammansatta produkttypen, ett paket relaterar enkla produkter att köpa som en enda artikel.

  • Virtuell

Ingen fysisk artikel krävs för leverans, t.ex. tjänster

  • Nedladdningsbara

En digital snarare än fysisk produkt. De flesta produkttyper implementeras som en del av Mage_Catalog-modulen, förutom Mage_Bundle och Mage_Downloadable.

Grupperade, paketerade och konfigurerbara produkter implementerar en förälder-barn-relation där ett antal andra (som standard, enkla, virtuella eller nedladdningsbara) produkter tilldelas en huvudprodukt. Detta hanterar sedan produktdata för hela samlingen (t.ex. grupp, paket eller konfigurerbart produktnamn, pris och status).

Nedladdningsbara produkter och paketprodukter har extra tabeller i databasen, medan resten delas mellan alla andra produkttyper. Konfigurerbara produkter har en extra tabell för att länka till barnprodukter, catalog_product_super_link.

Anpassad produkttyp

För att skapa en produkttyp som utvidgar en av de inbyggda produkttyperna, bör motsvarande produkttypsmodell utvidgas. Annars borde den nya produkttypen utvidga klassen Mage_Catalog_Model_Product_Type_Abstract.

En post i modulens config.xml krävs också:

Mer komplicerade produkter kan kräva andra anpassade områden, till exempel prismodell och indexhämtning av index.

Prisberäkning

När du handlar med en enda produkt beräknas alltid priset. Priset EAV-attributet laddas med produkten och slutpriset beräknas av prismodellen Mage_Catalog_Model_Product_Type_Price.

Vissa produkttyper hanterar det annorlunda. I vilket fall utökar de denna klass och implementerar sin egen logik. Till exempel skrivs den konfigurerbara produkten överFinalPrice () och lägger till ytterligare logik. Den här anpassade modellen kan sedan specificeras i config.xml med en <price_model> -tagg.

Produktsamlingar använder dock prisindexet för att hämta förberäknade priser, vilket eliminerar behovet av att beräkna det för varje produkt.

Det slutliga priset kan justeras av observatörerna av händelsen catalog_product_get_final_price. Som standard är det bara Mage_CatalogRule-modulen som observerar denna händelse.

En annan metod för att åsidosätta produktionspriset är att helt enkelt ställa in det på produkten. Om priset är inställt beräknar produkten inte det igen.

Produktnivåpriset är separat från normalt pris (även om det beaktas vid beräkning av pris). Den implementeras som en lista med en kundgrupp och kvalificeringskrav för minsta kvantitet för varje nivå. Tierpriser visas i en tabell med katalogen / produkt / visa / tierprices.phtml-mallen.

Anpassade produktalternativ behandlas vid beräkning av slutpris. Varje alternativ har sitt eget pris definierat, vilket läggs till det slutliga priset.

Grupp-, nivå- och specialpriser övervägs samtidigt ($priceModel->getBasePrice()) och den minsta av de tre (eller fyra om du inkluderar ordinarie pris) väljs som basproduktspris.

Beskatta

Mage_Tax-modulen använder en produkts skatteklass och huruvida produktpriset är inklusive eller exklusive skatt för att identifiera den korrekta skattesatsen som ska tillämpas.

Följande faktorer används för att beräkna moms på produkter:

  • Produkt skattklass
  • Skattebeloppet som redan ingår
  • Fakturerings- och leveransadresser
  • Kundskattklass
  • Lagra inställningar

Layered Navigation

De klasser som ansvarar för att göra den skiktade navigeringen är:

  • Mage_Catalog_Block_Layer_View

    -Hanterar filter och alternativ

  • Mage_Catalog_Block_Layer_State

-Kontrollerar vad som för närvarande filtreras av

För att implementera lagrad navigering på attribut med anpassade källmodeller måste metoden Mage_Catalog_Model_Layer_Filter_Abstract :: Apply () skrivas över för att diktera hur produktsamlingen ska filtreras.

Lagrad navigering återges av Mage_Catalog_Block_Layer_View och Mage_Catalog_Block_Layer_State-blocken, som använder filterblock för enskilda filter.

Layered Navigation använder indextabell för de flesta filter, t.ex. pris, produktattributindex, decimalproduktindex.

kategorier

Kategorier i databasen

Kategorihierarkin hanteras genom att lagra en kategoris överordnade id. Den fullständiga hierarkin visas i sökkolumnen (snedställd separata ID). Det finns en speciell kategori med parent_id på 0. Detta är den verkliga rotkategorin och var och en av de andra rotkategorierna som definieras i Magento använder detta som en delad överordnad.

För att läsa och hantera ett kategoriträd från databasen används två olika klasser beroende på om platt katalog är aktiverad, Mage_Catalog_Model_Resource_Category_Tree och Mage_Catalog_Model_Resource_Category_Flat.

Fördelen med platta kategorier är att det går snabbare att fråga. Men det måste byggas om från EAV-tabellerna varje gång det sker en förändring.

getChildren()

returnerar en kommaseparerad sträng med omedelbara barn-ID

getAllChildren()

returnerar en sträng eller grupp av alla barn-ID

getChildrenCategories()

returnerar en samling av omedelbara barnkategorier OBS! Om platt katalog är aktiverad kommer de enda barnkategorier som returneras vara de med include_in_menu = 1. I båda fallen returneras endast aktiva kategorier.

Katalogregler

Katalogreglerna gäller rabatter på produkter baserade på datum, produkt, webbplats och kundgrupp.

När getFinalPrice() anropas till en produkt avfyras händelsekatalogen_produkt_get_final_prisen. Detta observeras av Mage_CatalogRule_Model_Observer som sedan letar efter alla katalogpriser som gäller produkten. Om tillämpligt tittar den på databasens pristabell och skriver tillbaka priset till produktmodellen som ett Varien-datafält final_price.

I databasen beskriver katalogtabellen regler, deras villkor och deras åtgärder. catalogrule_product innehåller matchade produkter och viss regelinformation. Samtidigt innehåller catalogrule_product_price priset efter att regeln har tillämpats.

Indexering och platta tabeller

Plana katalogtabeller hanteras av katalogindexer. Om automatisk ombyggnad av indexen är aktiverad, återuppbyggs katalogindexarna varje gång en produkt, kategori eller relaterade enheter uppdateras. Metoden _afterSave () kallar indexeringsprocessen. Annars måste de manuellt indexeras igen via admin.

Produkttyp påverkar prisindex och aktieindex där produkter kan definiera sina egna anpassade indexerare (i config.xml) för att hantera sina data för dessa index.

Mage_Index-modulen tillhandahåller det ramverk med vilket anpassade index kan skapas för att optimera webbplatsens prestanda. Klassen Mage_Index_Model_Indexer_Abstract bör utvidgas för att skapa ett nytt index genom att implementera metoderna _registerEvent () och _processEvent (). Glöm inte att registrera det i 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;
    }
}

Beskriv standardprodukttyper (enkla, konfigurerbara, buntade)

Enkel

Den enkla produkttypen bör användas för att i allmänhet har en enda konfiguration (en-storlek-passar alla). Detta kan inkludera objekt som:

  • En låda med kritor, liten (24 färger)
  • En låda med kritor, stor (64 färger)
  • SuperHighTech 26 ”HD-datorskärm
  • Barrack Obama Action Figure (6 ”)

grupperade

Med grupperade produkter kan du skapa en ny produkt med en eller flera befintliga produkter i din butik. Låt oss till exempel anta att du har en "Barrack Obama Action Figure" och en "George W Bush Action Figure" redan i din butik och att du ville sälja dem som ett paket. Du skulle helt enkelt skapa en ny grupperad produkt (låt oss kalla den "Obama + Bush (få båda och spendera två gånger så mycket!)" Och sedan lägga till båda actionfigurerna i gruppen via fliken "Associated Products".

Obs! Tyvärr kan du inte ställa in ett speciellt "grupp" -pris direkt från produktsidan. För att erbjuda en rabatt för att köpa föremål tillsammans måste du skapa en ny kundvagns prisregel.

konfigurerbar

Konfigurerbar produkt: Denna produkt gör det möjligt för dina kunder att välja den variant de vill ha genom att välja alternativ. Till exempel kan du sälja T-shirts i två färger och tre storlekar. Du skulle skapa sex enkla produkter som enskilda produkter (alla med sina egna SKU) och sedan lägga till dessa sex till en konfigurerbar produkt där kunderna kan välja storlek och färg och sedan lägga till dem i sin kundvagn. Mycket lik funktionalitet är möjligt genom att använda anpassade alternativ för enkla produkter. Skillnaden mellan en konfigurerbar produkt och en produkt inklusive anpassade alternativ är att inventeringen inte kontrolleras eller uppdateras för enskilda alternativ under köp av anpassade alternativ.

Virtuell

Virtuella produkter är de som inte har en fysisk eller digital motsvarighet. De levererar inte och har inte heller en nedladdningslänk. Den här produkttypen kan användas för tjänster som:

  • Husstädning
  • 1-års prenumeration på nyhetsbrev

Obs: Om du använder virtuella produkter för "prenumerationer" är det viktigt att notera att det inte finns något inbyggt sätt att hantera automatisk förnyande av prenumerationer. Alla köp som görs i Magento, oavsett produkttyp, är engångsköp.

Bunt

Denna produkttyp är också känd som ett "kit" i annan e-handelsprogramvara. Denna produkttyp är idealisk för omständigheter där användaren måste välja ett antal konfigurerbara alternativ, men åtminstone ett alternativ. Detta kan inkludera produkter som:

  • Anpassningsbara datorsystem
  • Anpassningsbara smoking / kostymer
  • Klicka här för en videohandledning om att använda buntar

Nedladdningsbara

Nedladdningsbara produkter liknar virtuella produkter, förutom att de inkluderar möjligheten att lägga till en eller flera digitala filer för nedladdning. Filer kan antingen laddas upp via admingränssnittet eller genom att ladda upp direkt till servern via FTP och sedan läggas till via URL. När en kund köper en nedladdningsbar produkt kommer Magento att generera en säker, krypterad länk (så att kunderna inte kan se filens verkliga plats) för kunden att ladda ner sin fil.

Denna kategori kan innehålla produkter som:

  • Musik / MP3
  • Datormjukvara

Obs : Om du har SSL aktiverat för din webbplats kan nedladdningar misslyckas under alla versioner av IE eftersom IE innehåller ett fel som förhindrar nedladdning över säkra anslutningar om rubriken utan cache är inställd. Detta kan enkelt fixas i en htaccess-fil genom att ta bort rubrikerna utan cache och inga butiker eller genom att tvinga nedladdningslänkar för att vara oskyddade.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow