好的,所以你有兩個選擇。快速且不太靈活的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()
方法,其中產物關係 是從該請求中取出並添加到「待保存」產物對象。
你將需要要麼延長控制器或使用觀測此添加下面的代碼片段。你的來電。 A 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)與所有的到位,我們需要爲我們的「結合」類型的塊。
這一步是fairly
容易。以Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Upsell
作爲參考。 我們幾乎需要這個文件的確切副本。因此,將它放在你的模塊中,並將所有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
。
我希望這給你一些好的信息開始。您的選擇要走哪條路。 如上所述,第二種選擇是更多的工作,但通過管理員提供更大的靈活性,並且是更強大的解決方案。
只是爲了讓我和其他人瞭解更多信息:你準備打算做什麼?您想要獲取並顯示已經顯示爲相關產品的相關產品?此外,是否有可能通過SKU識別相關產品?例如,一組相關產品以'100'開始,即100-0001,100-0002。 – 2012-08-06 16:40:59
我已經更新了這個問題。希望能幫助到你。通過SKU可以識別相關產品,如果這是我們必須做的選擇。 – thindery 2012-08-06 16:57:54
如果您需要創建多個產品關係並將其分配給屬性集,則可以使用以下擴展名: http://www.magentocommerce.com/magento-connect/custom-product-relations.html 這是完全兼容的與任何magento版本。 – useless 2013-12-15 00:35:17