5

我正在确定以编程方式将类别添加到产品的最佳方式。类别是从 magento 安装之外的第三方数据获得的,然后我解析这些数据并想要更新 magento:“catalog_category_product”表,将找到的类别与其各自的产品相关联。

在“catalog_category_product”中将类别添加到产品关联作为测试后,该类别未出现在 magento 前端站点上。经过更多搜索后,我在“catalog_category_product_index”表中添加了一个条目,该产品现在显示在前端站点上的正确类别中。

这就是所有必要的吗?恐怕还有与产品和类别相关的额外 magento 事件挂钩,它们可能正在更新我不知道的其他表。

我可以使用 SQL 将行添加到这两个表中而不会发生意外,还是我需要加载 magento 应用程序并通过 EAV 产品和类别模型执行此操作?我在正确的轨道上吗?

更新

我实际上并没有“导入”任何新数据。产品和类别已经在系统中就位。我也没有添加任何自定义观察者,并且正在使用香草产品和类别模型。

我正在解析文本文件以获取正确的值,然后使用普通的 SQL UPDATE 语句。

我只是想确保通过这条路线,我需要以编程方式更新的唯一表是“catalog_category_product”和“catalog_category_product_index”。

4

2 回答 2

4

我个人不建议您使用纯 SQL,而是使用 API,例如:

define('MAGENTO', realpath(dirname(__FILE__)));
require_once MAGENTO . '/app/Mage.php';
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

// Load products 
$products = Mage::getModel('catalog/product')
            ->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID)
            ->getAll();

// Load categories
$category = Mage::getModel('catalog/category');
            ->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID);
$categories = $category->getAll();
foreach($products as $product) {
    // Get relevant category 
    $product->setCategoryIds(array($category->getId()));
    $product->save();
}

上面的代码是一个非常粗略的示例,但只需稍加调整即可完成工作。如果您使用纯 SQL,您可能会破坏您的数据或关系,但使用 API Magento 应该适合您。

于 2012-11-08T21:26:19.763 回答
0

您如何链接您的类别和产品?您是否编写了特定的代码?如果是:显示一些代码。

无论如何,magento 提供了许多方法来满足您在 STANDARD 中的需要。在菜单中查看后台:系统/导入-导出

magento 有两种不同的方法:

  • 数据流配置文件:它适用于模型并且非常慢(但是通过在所有模型上调用 ->save() 和 ->load() ,它可以确保您添加的任何观察者都会被调用!!)

  • 新的 Imports/Exports 配置文件:它适用于纯 SQL 查询并且速度非常快(但它是硬编码的,所以......对您添加的任何加载/保存自定义观察者说再见)

就像你说的,Magento 获得了与产品和类别(以及所有其他模型)相关联的事件挂钩。例如,在产品和类别的保存后回调中,magento 将重新索引所有关联的 INDEXES,例如您尝试手动添加的 catalog_category_index。

所以 :

  • 不要自己这样做,使用 magento 导入/导出配置文件、数据流配置文件或 API。
  • 根据您拥有的产品/类别的数量,选择要使用的正确导入(见上文,差异)。数据流较慢但使用模型..
于 2012-11-08T20:02:54.323 回答