好的,所以你有两个选择。快速且不那么灵活的 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
。
我希望这可以为您提供一些好的信息。你选择走哪条路。如前所述,第二个选项工作量更大,但通过管理员为您提供了更大的灵活性,并且是一个更强大的解决方案。