magento
製品タイプの理解
サーチ…
備考
Magentoには6種類の製品タイプが組み込まれています。
- シンプル
単一の在庫単位
- 設定可能な
最初の複合製品。顧客が自社の製品を構成し、単一のシンプルな製品をバスケットに追加できるようにします。
- グループ化された
第2の複合製品であるグループ化された製品は、単純な製品に関連し、顧客に各品目の数量を選択する能力を提供する。
- バンドル
3番目の複合商品タイプでは、バンドルは、シンプルな商品をまとめて1つの商品として購入することを関連付けます。
- バーチャル
配達に必要な物品、例えばサービス
- ダウンロード可能
物理的な製品ではなくデジタルです。ほとんどの製品タイプは、Mage_BundleとMage_Downloadableを除いて、Mage_Catalogモジュールの一部として実装されています。
グループ化、バンドルおよび構成可能な製品は、多数の他の(デフォルトでは単純、仮想またはダウンロード可能な)製品が主要製品に割り当てられる場合に、親子関係を実装します。これにより、コレクション全体の製品データ(グループ、バンドル、構成可能な製品名、価格、ステータスなど)が処理されます。
ダウンロード可能な製品とバンドル製品には、データベース内に余分なテーブルがありますが、残りは他のすべての製品タイプで共有されます。構成可能な製品には、子製品catalog_product_super_linkにリンクするための追加の表があります。
カスタム商品タイプ
組み込み製品タイプの1つを拡張する製品タイプを作成するには、対応する製品タイプモデルを拡張する必要があります。それ以外の場合は、新しい製品タイプでMage_Catalog_Model_Product_Type_Abstractクラスを拡張する必要があります。
モジュールのconfig.xmlのエントリも必要です。
より複雑な製品では、価格モデルやインデックスデータ検索などのカスタマイズされた他の領域が必要になることがあります。価格計算
単一の製品を扱う場合、価格は常にオンザフライで計算されます。価格EAV属性には製品がロードされ、最終価格は価格モデルMage_Catalog_Model_Product_Type_Priceによって計算されます。
いくつかの製品タイプはそれを別々に扱います。その場合、彼らはこのクラスを拡張し、独自のロジックを実装します。たとえば、構成可能な製品はgetFinalPrice()を上書きし、追加のロジックを追加します。このカスタムモデルは、<price_model>タグを使用してconfig.xmlで指定できます。
ただし、製品コレクションでは、価格指数を使用して事前計算された価格を検索し、製品ごとに計算する必要はありません。
最終価格は、catalog_product_get_final_priceイベントのオブザーバーによって調整することができます。デフォルトでは、Mage_CatalogRuleモジュールのみがこのイベントを監視します。
生産価格をオーバーライドする別の方法は、製品に単に設定することです。価格が設定されている場合、製品はそれを再計算しません。
プロダクト層の価格は通常の価格とは異なります(ただし、価格を計算する際は考慮されます)。これは、顧客グループと各階層の最小数量修飾子を持つリストとして実装されています。階層の価格はcatalog / product / view / tierprices.phtmlテンプレートを使用して表に表示されます。
カスタム商品オプションは最終価格を計算する際に処理されます。各オプションには独自の価格が定義されており、最終価格に追加されます。
グループ、ティアおよび特別価格はすべて同時に考慮され($priceModel->getBasePrice())
、3つのうち最小のもの(または通常価格を含む場合は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ブロックによってレンダリングされ、個々のフィルタにフィルタブロックを使用します。
レイヤードナビゲーションでは、価格、商品属性インデックス、10進商品インデックスなどのほとんどのフィルタにインデックステーブルを使用します。
カテゴリー
データベース内のカテゴリ
カテゴリ階層は、カテゴリの親IDを格納することによって管理されます。完全な階層がパス列に表示されます(スラッシュで区切られたID)。 parent_idが0の特別なカテゴリがあります。これは真のルートカテゴリであり、Magentoで定義されている他のルートカテゴリはそれぞれ、これを共有の親として使用します。
データベースからカテゴリツリーを読み込んで管理するには、フラットカタログが有効かどうかに応じて、Mage_Catalog_Model_Resource_Category_TreeとMage_Catalog_Model_Resource_Category_Flatの2つの異なるクラスが使用されます。
フラットなカテゴリの利点は、クエリーが迅速であることです。ただし、変更があるたびに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()メソッドはインデクサプロセスを呼び出します。それ以外の場合は、adminを使用して手動で再インデックスする必要があります。
製品タイプは、製品がこれらのインデックスのデータを処理するための独自のカスタムインデクサー(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;
}
}
標準的な製品タイプの説明(シンプル、設定、バンドル)
シンプル
シンプルプロダクトタイプは、一般的に単一の構成(ワンサイズフィット)で使用する必要があります。これには、次のような項目が含まれます。
- クレヨンの箱、小さい(24色)
- クレヨンの箱、大きい(64色)
- SuperHighTech 26インチHDコンピュータモニター
- バラクオバマアクションフィギュア(6 ")
グループ化された
グループ化された製品を使用すると、店舗内の既存の1つ以上の製品を使用して新しい製品を作成することができます。たとえば、お店に「Barrack Obama Action Figure」と「George W Bush Action Figure」があり、それらをバンドルとして販売したいとします。新しいグループ化された製品を作成するだけです(「両方を取得して2倍にする」)し、「Associated Products」タブを使用して両方のアクション数値をグループに追加します。
注:残念ながら、商品ページから特別な「グループ」価格を直接設定することはできません。商品を一緒に購入するための割引を提供するには、新しいショッピングカート価格ルールを作成する必要があります。
設定可能な
設定可能な製品:この製品を使用すると、オプションを選択して、必要なバリアントを選択することができます。たとえば、Tシャツを2色3サイズで販売することができます。 6つのシンプルな製品を個別の製品(それぞれ独自のSKUを持つ)として作成し、これらの6つを構成可能な製品に追加して、顧客がサイズと色を選択してカートに追加できるようにします。シンプルな製品のカスタムオプションを使用すると、非常に似た機能が可能になります。構成可能な製品とカスタムオプションを含む製品との違いは、カスタムオプションの購入時に個々のオプションについて在庫がチェックまたは更新されないことです。
バーチャル
バーチャルプロダクトは、物理的またはデジタル的な対応がないものです。彼らは出荷していませんし、ダウンロードリンクもありません。この製品タイプは、次のようなサービスに使用される可能性があります。
- ハウスクリーニング
- 1年間のニュースレター購読
注:仮想製品を「サブスクリプション」として使用する場合は、自動更新サブスクリプションを管理する組み込みの方法がないことに注意することが重要です。製品タイプに関係なく、Magentoで行われたすべての購入は1回のみの購入です。
バンドル
この製品タイプは、他のeコマースソフトウェアの「キット」とも呼ばれます。この製品タイプは、ユーザーが構成可能なオプションの数を選択する必要があるが、少なくとも1つのオプションを選択する必要がある場合に最適です。これには次のような製品が含まれます:
- カスタマイズ可能なコンピュータシステム
- カスタマイズ可能なTuxedos / Suits
- バンドルの使用に関するビデオチュートリアルはこちら
ダウンロード可能
ダウンロード可能な製品は、ダウンロード用の1つ以上のデジタルファイルを追加する機能を含む点を除き、仮想製品に似ています。ファイルはAdminインターフェイス経由でアップロードすることも、FTP経由でサーバーに直接アップロードしてURLで追加することもできます。顧客がダウンロード可能な製品を購入すると、Magentoはその顧客がファイルをダウンロードするための安全な暗号化リンクを生成します(顧客はそのファイルの実際の場所を見ることができません)。
このカテゴリには、次のような製品が含まれます。
- 音楽/ MP3
- コンピューターソフトウェア
注意 :サイトでSSLが有効になっている場合、no-cacheヘッダーが設定されていると、セキュリティで保護された接続でダウンロードできないバグがIEに含まれているため、IEのすべてのバージョンでダウンロードが失敗することがあります。これは、htaccessファイルでno-cacheヘッダとno-storeヘッダを削除したり、ダウンロードリンクを強制的に非セキュアにすることで簡単に修正できます。