さて、2つのオプションがあります。製品を照合するための迅速でそれほど柔軟ではないSKUパターンの方法、またはMagentoにまったく新しい製品リンク関係を追加することもできます。明らかに、最後のオプションはより多くの時間がかかりますが、管理者からの関係を処理し、バッチ内の表示順序を決定する可能性を提供します。
オプション1:SKUでのマッチング(簡単、迅速、おそらく少し汚い)
たとえば、現在の商品の最初の4文字を取得し、それを使用して残りの商品データベースと照合するメソッドを作成できます。
その下には、そのコードがどのように見えるかのモックアップバージョンがあります。
$match = substr($product->getSku(), 0, 4);
$resource = Mage::getModel('core/resource');
$read = $resource->getConnection('core_read');
$select = $read->select()
->from(array('e'=>$resource->getTableName('catalog/product')), 'entity_id')
->where("e.sku LIKE '" . $match . "%'");
$ids = $read->fetchAll($select);
これにより、一致する製品のIDが取得されます。次に、これらのIDを次のように商品コレクションに読み込むことができます。
$_productCollection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('<your_needed_product_attributes>')
->addAttributeToFilter('entity_id',array('in'=> <your_array_of_productids>));
Mage::getSingleton('catalog/product_status')->addSaleableFilterToCollection($_productCollection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($_productCollection);
$_productCollection->addStoreFilter()->load();
これで、コレクションをループしてHTMLを作成するだけで済みます。
オプション2:新しい製品関係を追加する
Magentoはテーブルcatalog_product_link
を使用して、すべてのタイプの製品関係を格納します。で、catalog_product_link_type
新しいリンクタイプを追加します。これは、に新しいリンクタイプのデータを挿入できるようにするために必要ですcatalog_product_link
。この新しいリンクタイプは、モジュールのアップグレードスクリプトを介して追加する必要があります。
この時点から、Magento管理者に調整と追加を行う必要があります。これは答えの場所であり、本格的なモジュールソリューションではないため、新しいリンクタイプを追加するために注意が必要な場所にのみマークを付けます。ただし、以下の情報があれば、新しい関係を立ち上げて実行するのにそれほど問題はないと思います。
1)製品編集管理ページのメニューに新しいタイプのタブを追加します。
のようにMage_Adminhtml_Block_Catalog_Product_Edit_Tabs
、リンクタイプの新しいタブを作成する必要があります。
$this->addTab('combine', array(
'label' => Mage::helper('catalog')->__('Combine'),
'url' => $this->getUrl('*/*/combine', array('_current' => true)),
'class' => 'ajax',
));
*/*/combine
Mage_Adminhtml_Catalog_ProductController
コントローラの結合アクションにルーティングされます。自分のモジュールへの別のルートを使用したい場合もありますが、この例ではこれに固執します。
2)ページ要求*/*/combine/
を処理するには、このアクションをコントローラーで使用できるようにする必要があります。このためのコード参照がありますMage_Adminhtml_Catalog_ProductController
。
/**
* Get combine products grid and serializer block
*/
public function combineAction()
{
$this->_initProduct();
$this->loadLayout();
$this->getLayout()->getBlock('catalog.product.edit.tab.combine')
->setProductsUpsell($this->getRequest()->getPost('products_combine', null));
$this->renderLayout();
}
このタブ内で後のグリッドアクションを処理するためのアクションも必要です。
/**
* Get upsell products grid
*/
public function combineGridAction()
{
$this->_initProduct();
$this->loadLayout();
$this->getLayout()->getBlock('catalog.product.edit.tab.combine')
->setProductsRelated($this->getRequest()->getPost('products_combine', null));
$this->renderLayout();
}
さらに、このコントローラーには、->_initProductSave()
製品関係が要求からフェッチされ、「保存される」製品オブジェクトに追加されるメソッドも含まれています。
コントローラを拡張するか、オブザーバを使用して、下のスニペットを追加する必要があります。あなたの呼び出し。catalog_product_before_save
オブザーバーはこれを行うための最良の方法です。
if (isset($links['combine']) && !$product->getCombineReadonly()) {
$product->setCombineLinkData(Mage::helper('adminhtml/js')->decodeGridSerializedInput($links['combine']));
}
ステップ5では、新しい関係を前述catalog_product_link
のテーブルにさらに保存するために、このデータが再度取得されます。
3)ステップ2で作成しようとしているレイアウトは、次のXMLハンドルがないとあまり効果がありません。
<adminhtml_catalog_product_combine>
<block type="core/text_list" name="root">
<block type="<your_own_custom_block_for_product_link_type>" name="catalog.product.edit.tab.combine"/>
<block type="adminhtml/widget_grid_serializer" name="upsell_grid_serializer">
<reference name="upsell_grid_serializer">
<action method="initSerializerBlock">
<grid_block_name>catalog.product.edit.tab.combine</grid_block_name>
<data_callback>getSelectedCombineProducts</data_callback>
<hidden_input_name>links[combine]</hidden_input_name>
<reload_param_name>products_combine</reload_param_name>
</action>
<action method="addColumnInputName">
<input_name>position</input_name>
</action>
</reference>
</block>
</block>
</adminhtml_catalog_product_combine>
<adminhtml_catalog_product_combinegrid>
<block type="core/text_list" name="root">
<block type="<your_own_custom_block_for_product_link_type>" name="catalog.product.edit.tab.combine"/>
</block>
</adminhtml_catalog_product_combinegrid>
4)これらすべてが整ったら、「combine」タイプのブロックを作成する必要があります。
この手順はfairly
簡単です。Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Upsell
参考にしてください。このファイルの正確なコピーがほとんど必要です。したがって、それをモジュールに配置し、すべてのアップセルの名前を「combine」またはこの関係に使用している名前に変更します。このブロックタイプは<your_own_custom_block_for_product_link_type>
、手順3で配置する必要があります。
5)Mage_Catalog_Model_Product_Linkを拡張する
Mage_Catalog_Model_Product_Link
リレーションタイプに関するすべてのデータを保持するファイルです。たとえば、使用可能なタイプや、リレーションタイプを保存およびロードするためのロジックなどです。
あなたの拡張では、少なくとも次のものが必要です:
- リレーションタイプを定義する定数
const LINK_TYPE_COMBINE = 6;
- 次の
useCombineLinks
ような方法useUpsellLinks
saveProductRelations
下に追加されたメソッドの拡張。これはおそらく適切なイベントオブザーバーを介して実行することもできますが。
$data = $product->getCombineLinkData();
if (!is_null($data)) {
$this->_getResource()->saveProductLinks($product, $data, self::LINK_TYPE_COMBINE);
}
このスニペットは、製品が保存された後に最終的にトリガーされます。
6)製品モデルへの新しいリレーションロジックの追加管理者を稼働させるための最後のステップは、製品モデルに追加する必要のあるロジックです(Mage_Catalog_Model_Product
)。このモデルのモジュールから拡張を介してこれらのメソッドを追加することをお勧めします。
4つのメソッドを追加する必要があります。以下を参照として使用し、それらをコピーしてリレーション名に名前を変更できます。
getUpSellProducts
getUpSellProductIds
getUpSellProductCollection
getUpSellLinkCollection
上記の手順を実行すると、この新しい製品関係を追加および処理するための作業管理者が必要になります。残っているのは、ページの「フロントエンド」レイアウトで使用するブロックがあることだけです。繰り返しますが、これの良いリファレンスはですMage_Catalog_Block_Product_List_Upsell
。
これがあなたに最初にいくつかの良い情報を与えることを願っています。どちらに行くかを選択します。前述のように、2番目のオプションはより多くの作業ですが、管理者を通じてより柔軟性があり、より堅牢なソリューションです。