magento
제품 유형 이해
수색…
비고
Magento에는 6 가지 제품 유형이 내장되어 있습니다.
- 단순한
단일 재고 단위
- 구성 가능
복합 제품 중 첫 번째. 고객이 제품을 구성하고 단일 간단한 제품을 바구니에 추가 할 수 있습니다.
- 그룹화 된
두 번째 복합 제품인 그룹화 된 제품은 단순한 제품과 관련이 있으며 고객에게 각 품목의 수량을 선택할 수있는 기능을 제공합니다.
- 묶음
세 번째 복합 상품 유형 인 번들은 간단한 상품을 모아 하나의 상품으로 구매합니다.
- 가상
인도를 위해 필요한 물리적 물품이 없습니다. 예 : 서비스
- 다운로드 가능
실제 제품이 아닌 디지털 제품. 대부분의 제품 유형은 Mage_Bundle 및 Mage_Downloadable을 제외하고 Mage_Catalog 모듈의 일부로 구현됩니다.
Grouped, Bundle 및 Configurable 제품은 여러 다른 (기본적으로 간단한, 가상 또는 다운로드 가능한) 제품이 주 제품에 할당되는 경우 상위 - 하위 관계를 구현합니다. 그런 다음 전체 컬렉션 (예 : 그룹, 번들 또는 구성 가능한 제품 이름, 가격 및 상태)에 대한 제품 데이터를 처리합니다.
Downloadable 및 Bundle 제품에는 데이터베이스에 추가 테이블이 있으며 나머지는 다른 모든 제품 유형과 공유됩니다. 구성 가능한 제품에는 하위 제품 catalog_product_super_link에 연결할 추가 테이블이 있습니다.
맞춤형 제품 유형
기본 제공 제품 유형 중 하나를 확장하는 제품 유형을 만들려면 해당 제품 유형 모델을 확장해야합니다. 그렇지 않으면 새 제품 유형이 Mage_Catalog_Model_Product_Type_Abstract 클래스를 확장해야합니다.
모듈의 config.xml에있는 항목도 필요합니다.
보다 복잡한 제품에는 가격 모델 및 색인 데이터 검색 자와 같은 기타 사용자 지정된 영역이 필요할 수 있습니다.가격 계산
단일 제품을 다룰 때 가격은 항상 계산됩니다. 가격 EAV 속성이 제품과 함께로드되고 최종 가격은 가격 모델 Mage_Catalog_Model_Product_Type_Price에 의해 계산됩니다.
일부 제품 유형은 다르게 처리합니다. 어떤 경우에는이 클래스를 확장하고 자신의 논리를 구현합니다. 예를 들어, 구성 가능한 제품은 getFinalPrice ()를 겹쳐 쓰고 추가 논리를 추가합니다. 그런 다음이 사용자 정의 모델을 config.xml에서 <price_model> 태그와 함께 지정할 수 있습니다.
그러나 제품 컬렉션은 가격 지수를 사용하여 사전 계산 된 가격을 검색하므로 각 제품에 대해 계산할 필요가 없습니다.
최종 가격은 catalog_product_get_final_price 이벤트의 옵저버가 조정할 수 있습니다. 기본적으로 Mage_CatalogRule 모듈 만이 이벤트를 관찰합니다.
생산 가격을 무시하는 또 다른 방법은 단순히 제품에 가격을 설정하는 것입니다. 가격이 설정되면 제품에서 다시 계산하지 않습니다.
제품 계층 가격은 정상 가격과 별개입니다 (가격 계산시 고려해야 함). 고객 그룹 및 각 계층의 최소 수량 한정자 목록으로 구현됩니다. 계층 가격은 catalog / product / view / tierprices.phtml 템플리트를 사용하여 테이블에 표시됩니다.
맞춤형 제품 옵션은 최종 가격을 계산할 때 처리됩니다. 각 옵션에는 자체 가격이 정의되어 최종 가격에 추가됩니다.
그룹, 계층 및 특별 가격은 모두 동시에 고려되며 ($priceModel->getBasePrice())
세 가지 중 가장 작은 것 (기본 가격을 포함하는 경우 4 개)이 기본 제품 가격으로 선택됩니다.
세
Mage_Tax 모듈은 적용 할 올바른 요율을 식별하기 위해 제품의 세금 클래스와 제품 가격이 세금 포함 여부를 포함하는지 여부를 사용합니다.
제품에 대한 세금 계산에 사용되는 요소는 다음과 같습니다.
- 제품 세금 클래스
- 세금 포함 금액은 이미 포함되어 있습니다.
- 청구서 발송 주소
- 고객 세금 클래스
- 상점 설정
계층 적 탐색
계층화 된 탐색을 렌더링하는 클래스는 다음과 같습니다.
Mage_Catalog_Block_Layer_View
- 필터 및 옵션을 다루십시오.
Mage_Catalog_Block_Layer_State
- 현재 필터링중인 항목을 제어합니다.
사용자 정의 소스 모델을 사용하여 속성에 계층화 된 탐색을 구현하려면 Mage_Catalog_Model_Layer_Filter_Abstract :: apply () 메소드를 덮어 써야 제품 컬렉션을 필터링해야합니다.
계층 형 네비게이션은 개별 필터에 대한 필터 블록을 사용하는 Mage_Catalog_Block_Layer_View 및 Mage_Catalog_Block_Layer_State 블록에 의해 렌더링됩니다.
Layered Navigation은 대부분의 필터 (예 : 가격, 제품 속성 색인, 십진법 제품 색인)에 색인 표를 사용합니다.
카테고리
데이터베이스 범주
카테고리 계층 구조는 카테고리의 상위 ID를 저장하여 관리됩니다. 전체 계층 구조가 경로 열에 표시됩니다 (슬래시로 구분 된 ID). parent_id가 0 인 특수 카테고리가 있습니다. 이것은 진정한 루트 카테고리이며 Magento에 정의 된 다른 루트 카테고리 각각은 이것을 공유 부모로 사용합니다.
데이터베이스에서 카테고리 트리를 읽고 관리하려면 플랫 카탈로그가 활성화되어 있는지 여부에 따라 Mage_Catalog_Model_Resource_Category_Tree 및 Mage_Catalog_Model_Resource_Category_Flat에 따라 두 개의 다른 클래스가 사용됩니다.
플랫 카테고리의 장점은 쿼리하는 것이 더 빠릅니다. 그러나 변경이 발생할 때마다 EAV 테이블에서 다시 작성해야합니다.
getChildren()
즉시 자식 ID의 쉼표로 구분 된 문자열을 반환합니다.
getAllChildren()
모든 자식 ID의 문자열 또는 배열을 반환합니다.
getChildrenCategories()
직접 자식 범주의 모음을 반환합니다. NB 플랫 카탈로그가 활성화 된 경우 반환되는 자식 범주는 include_in_menu = 1 인 자식 범주뿐입니다. 두 경우 모두 활성 범주 만 반환됩니다.
카탈로그 가격 규칙
카탈로그 가격 규칙은 날짜, 제품, 웹 사이트 및 고객 그룹을 기준으로 제품에 할인을 적용합니다.
제품에서 getFinalPrice()
가 호출되면 catalog_product_get_final_price 이벤트가 시작됩니다. 이것은 Mage_CatalogRule_Model_Observer에 의해 관찰되며 제품에 적용되는 카탈로그 가격 규칙을 찾습니다. 해당되는 경우 데이터베이스 가격 테이블을보고 Varien 데이터 필드 final_price로 가격을 제품 모델에 다시 씁니다.
데이터베이스 내에서 catalogrule 테이블은 규칙, 해당 조건 및 해당 조치를 설명합니다. catalogrule_product는 일치하는 제품과 일부 규칙 정보를 포함합니다. 한편 catalogrule_product_price에는 규칙 적용 후 가격이 포함됩니다.
인덱싱 및 플랫 테이블
플랫 카탈로그 테이블은 카탈로그 인덱서에 의해 관리됩니다. 인덱스를 자동으로 다시 작성하면 제품, 범주 또는 관련 엔티티가 업데이트 될 때마다 카탈로그 인덱서가 다시 작성됩니다. _afterSave () 메서드는 인덱서 프로세스를 호출합니다. 그렇지 않으면 관리자를 통해 수동으로 색인을 다시 생성해야합니다.
제품 유형은 제품이이 인덱스에 대한 데이터를 처리하기 위해 자신의 사용자 정의 인덱서 (config.xml)를 정의 할 수있는 가격 인덱스 및 주가 인덱스에 영향을줍니다.
Mage_Index 모듈은 사이트의 성능을 최적화하는 데 도움이되는 사용자 정의 색인을 만들 수있는 프레임 워크를 제공합니다. Mage_Index_Model_Indexer_Abstract 클래스는 _registerEvent () 및 _processEvent () 메소드를 구현하여 새 인덱스를 만들도록 확장되어야합니다. 그것을 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;
}
}
표준 제품 유형 설명 (단순, 구성 가능, 번들)
단순한
Simple Products 유형은 일반적으로 단일 구성 (one-size-fits-all)으로 사용되어야합니다. 여기에는 다음과 같은 항목이 포함될 수 있습니다.
- 크레용 박스, 소형 (24 색)
- 크레용 박스, 대형 (64 색)
- SuperHighTech 26 "HD 컴퓨터 모니터
- 막사 오바마 액션 피겨 (6 ")
그룹화 된
그룹화 된 제품을 사용하면 상점에있는 하나 이상의 기존 제품을 사용하여 새 제품을 작성할 수 있습니다. 예를 들어, "Barrack Obama Action Figure"와 "George W Bush Action Figure"가 이미 상점에 있으며 번들로 판매하고 싶다고 가정 해 봅시다. 새로운 그룹 제품 (간단히 "Obama + Bush"(두 가지 모두 얻고 두 번 쓰십시오!))을 작성한 다음 "Associated Products"탭을 통해 그룹에 두 조치 수치를 추가하십시오.
참고 : 유감스럽게도 제품 페이지에서 직접 "그룹"특별 가격을 설정할 수는 없습니다. 함께 상품을 구매할 때 할인을 제공하려면 새로운 장바구니 가격 규칙을 만들어야합니다.
구성 가능
구성 가능한 제품 :이 제품을 사용하면 옵션을 선택하여 고객이 원하는 변형을 선택할 수 있습니다. 예를 들어 두 가지 색상과 세 가지 크기의 티셔츠를 판매 할 수 있습니다. 6 가지 간단한 제품을 각각의 고유 한 SKU가있는 개별 제품으로 작성한 다음이 6 가지를 구성 가능한 제품에 추가하여 고객이 크기와 색상을 선택한 다음 장바구니에 추가 할 수 있습니다. Simple 제품에 대한 Custom Options를 사용하면 매우 유사한 기능을 사용할 수 있습니다. 구성 가능한 제품과 사용자 정의 옵션을 포함한 제품의 차이점은 사용자 정의 옵션을 구매할 때 개별 옵션에 대해 재고가 점검되거나 갱신되지 않는다는 것입니다.
가상
가상 제품은 물리적 또는 디지털 제품이없는 제품입니다. 배송되지 않으며 다운로드 링크가 없습니다. 이 제품 유형은 다음과 같은 서비스에 사용될 수 있습니다.
- 집 청소
- 1 년 뉴스 레터 구독
참고 : 가상 제품을 "구독"으로 사용하는 경우 자동 갱신 구독을 관리 할 수있는 기본 제공 방법이 없다는 점에 유의해야합니다. 제품 유형에 상관없이 Magento에서 이루어진 모든 구매는 일회성 구매입니다.
묶음
이 제품 유형은 다른 전자 상거래 소프트웨어의 "키트"라고도합니다. 이 제품 유형은 사용자가 여러 구성 가능한 옵션을 선택해야하지만 적어도 하나의 옵션을 선택해야하는 상황에 이상적입니다. 여기에는 다음과 같은 제품이 포함될 수 있습니다.
- 사용자 정의 가능한 컴퓨터 시스템
- 커스터마이즈 가능한 턱시도 / 정장
- 번들 사용에 대한 비디오 자습서를 보려면 여기를 클릭하십시오.
다운로드 가능
다운로드 가능한 제품은 하나 이상의 디지털 파일을 다운로드 할 수있는 기능을 포함한다는 점을 제외하면 가상 제품과 유사합니다. 파일은 Admin 인터페이스를 통해 업로드하거나 FTP를 통해 서버에 직접 업로드 한 다음 URL로 추가하여 업로드 할 수 있습니다. 고객이 다운로드 가능한 제품을 구입하면 Magento는 해당 고객이 파일을 다운로드 할 수 있도록 안전한 암호화 된 링크를 생성합니다 (고객이 파일의 실제 위치를 볼 수 없도록).
이 카테고리에는 다음과 같은 제품이 포함될 수 있습니다.
- 음악 / MP3
- 컴퓨터 소프트웨어
참고 : 사이트에서 SSL을 사용할 수있는 경우 no-cache 헤더가 설정되어 있으면 IE에 보안 연결을 통해 다운로드하지 못하게하는 버그가 포함되어 있으므로 모든 버전의 IE에서 다운로드가 실패 할 수 있습니다. 이것은 no-cache 및 no-store 헤더를 제거하거나 다운로드 링크를 강제로 비보안으로 설정하여 htaccess 파일에서 쉽게 수정할 수 있습니다.