2

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

  1. 有关的
  2. 交叉销售
  3. 追加销售
  4. 分组产品

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

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

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

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

4

1 回答 1

12

好的,所以你有两个选择。快速且不那么灵活的 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()方法,其中从请求中获取产品关系并将其添加到“待保存”产品对象中。

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

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

于 2012-08-06T19:48:20.317 回答