在Magento产品之间创建新链接

thi*_*ery 1 magento

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

  1. 有关
  2. 交叉销售
  3. 向上销售
  4. 分组产品

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

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

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

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

小智 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);
Run Code Online (Sandbox Code Playgroud)

这将检索匹配产品的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();
Run Code Online (Sandbox Code Playgroud)

现在,您只需遍历集合并构建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',
        ));
Run Code Online (Sandbox Code Playgroud)

*/*/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();
}
Run Code Online (Sandbox Code Playgroud)

我们还需要一个操作来处​​理此选项卡中的后续网格操作.

/**
 * 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();
}
Run Code Online (Sandbox Code Playgroud)

此外,该控制器还包含一种->_initProductSave()方法,在该方法中从请求中提取产品关系并将其添加到"待保存"产品对象中.

您需要通过扩展控制器或使用观察者来添加下面的代码片段.你的来电.一个catalog_product_before_save观察者做到这一点的最好办法.

    if (isset($links['combine']) && !$product->getCombineReadonly()) {
        $product->setCombineLinkData(Mage::helper('adminhtml/js')->decodeGridSerializedInput($links['combine']));
    }
Run Code Online (Sandbox Code Playgroud)

在步骤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>
Run Code Online (Sandbox Code Playgroud)

4)完成所有这些后,我们需要为"组合"类型创建块.

这一步很fairly简单.以Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Upsell作为参考.我们几乎需要这个文件的精确副本.因此,将它放在您的模块中,并将所有加售重命名为"合并",或者您为此关系使用的任何名称.您需要<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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

最终将在保存产品后触发此代码段.

6)向产品模型添加新的关系逻辑启动和运行管理的最后一步是需要添加到产品模型的一些逻辑(Mage_Catalog_Model_Product).您可能希望通过此模型上的模块扩展来添加这些方法.

您需要添加4个方法,您可以将以下内容作为参考,复制并重命名为您的关系名称.

  • getUpSellProducts
  • getUpSellProductIds
  • getUpSellProductCollection
  • getUpSellLinkCollection

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

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