在Magento产品之间创建新链接

时间:2012-08-06 16:25:04

标签: magento

默认情况下,Magento中的产品链接具有以下类型:

  1. 相关
  2. 交叉销售
  3. 向上销售
  4. 分组产品
  5. 我使用默认选项作为默认功能。但是,我需要以相反的方式将相关产品链接在一起。那可能吗?我是否可以创建一个与“相关链接”选项有效的新链接方法?

    我正在销售贺卡等可定制的印刷品。我只允许在商店中可以搜索和查看卡片的前视图,我们可以将其称为“主产品”。一旦客户点击他们喜欢的卡片产品,我就需要显示卡片内部和背面的不同产品选项。这些是我商店里的单品红色产品。有些卡片有不同的文字选项,照片选项等。

    因此,当我在后端添加新的“主产品”时,我需要“链接”与内部关联的产品以及与该主产品相关联的产品。

    “相关”产品标签的工作方式非常棒。如果我可以在创建产品页面上使用我自己的链接属性选项卡重新创建该功能,那么我应该没问题。

1 个答案:

答案 0 :(得分:11)

好的,你有两个选择。快速且不那么灵活的SKU模式匹配产品,或者您可以添加一个全新的产品链接关系到Magento。显然,最后一个选项需要花费更多时间,但是您可以从管理员处理关系并确定批次中的显示顺序。

选项1:在SKU上匹配(简单,快速,可能有点脏)

您可以编写一种方法,比如说当前产品的前4个字符,然后使用它来匹配产品数据库的其余部分。

Underneath是该代码外观的模拟版本:

$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)如果没有以下XML句柄,我们尝试在第2步中构建的布局将不会做很多事情。

<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为参考。 我们几乎需要这个文件的精确副本。因此,将它放在您的模块中,并将所有加售重命名为“合并”,或者您为此关系使用的任何名称。您需要在步骤3中将此块类型放在<your_own_custom_block_for_product_link_type>

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

我希望这能为您提供一些好的信息。您的选择走哪条路。 如上所述,第二个选项是更多的工作,但通过管理员提供更多的灵活性,是一个更强大的解决方案。