2012-08-06 48 views
1

產品在Magento連接默認情況下有以下類型:創建Magento的產品之間新的聯繫

  1. 相關
  2. 交叉銷售
  3. 向上銷售
  4. 分組的產品

我我將默認選項用於其默認功能。但是,我需要以另一種方式將相關產品連接起來。那可能嗎?是否有可能創建一個與「相關鏈接」選項相似的新鏈接方法?

我賣喜歡賀卡定製打印產品。我只允許卡片的前視圖可以在商店中搜索和查看,我們可以將其稱爲「主產品」。一旦客戶點擊他們喜歡的卡片產品,我需要顯示卡片內部和後部的不同產品選項。這些是我店裏的個別magento產品。某些卡片有不同的文本選項,照片選項等。

因此,當我在後端添加新的「主產品」時,需要「鏈接」與內部相關聯的產品以及產品與主產品的背面相關聯。

「相關」產品標籤的工作方式非常棒。如果我可以在創建產品頁面上使用自己的鏈接屬性選項卡重新創建該功能,那麼我應該沒問題。

+0

只是爲了讓我和其他人瞭解更多信息:你準備打算做什麼?您想要獲取並顯示已經顯示爲相關產品的相關產品?此外,是否有可能通過SKU識別相關產品?例如,一組相關產品以'100'開始,即100-0001,100-0002。 – 2012-08-06 16:40:59

+0

我已經更新了這個問題。希望能幫助到你。通過SKU可以識別相關產品,如果這是我們必須做的選擇。 – thindery 2012-08-06 16:57:54

+0

如果您需要創建多個產品關係並將其分配給屬性集,則可以使用以下擴展名: http://www.magentocommerce.com/magento-connect/custom-product-relations.html 這是完全兼容的與任何magento版本。 – useless 2013-12-15 00:35:17

回答

11

好的,所以你有兩個選擇。快速且不太靈活的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

我希望這給你一些好的信息開始。您的選擇要走哪條路。 如上所述,第二種選擇是更多的工作,但通過管理員提供更大的靈活性,並且是更強大的解決方案。

+0

使用完整示例代碼的選項2的擴展說明:http://inchoo.net/magento/how-to-add-custom-product-relations-in-magento//https://github.com/Marko-M/ Inchoo_CustomLinkedProducts – jpossi 2016-01-05 08:20:27