首页 文章

在Magento产品之间创建新链接

提问于
浏览
1

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

  • 相关

  • 交叉销售

  • 向上销售

  • 分组产品

我使用默认选项作为其默认功能 . 但是,我需要以相反的方式将相关产品链接在一起 . 那可能吗?我是否可以创建一个与“相关链接”选项非常相似的新链接方法?

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

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

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

1 回答

  • 11

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

    Option 1: Matching on SKU (easy, quick, perhaps a bit dirty)

    您可以编写一种方法,比如说当前产品的前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 .

    Option 2: Adding a new product relation

    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() 方法,在该方法中从请求中提取产品关系并将其添加到'to-be-saved' product对象中 .

    您需要通过扩展控制器或使用观察者来添加下面的代码片段 . 你的来电 . 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 为参考 . 我们几乎需要这个文件的精确副本 . 因此,将它放在您的模块中,并将所有加售重命名为'combine',或者您为此关系使用的任何名称 . 您需要在步骤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

    当您按照上述步骤操作时,您应该有一个工作管理员来添加和处理这个新的产品关系 . 剩下的就是在页面的'frontend'布局中使用一个块 . 再一个很好的参考是 Mage_Catalog_Block_Product_List_Upsell .

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

相关问题