更新产品的所有Tier价格

时间:2011-12-13 16:56:12

标签: magento magento-1.4

不直接查询Magento数据库。如何根据数量和客户群体删除特定产品的所有等级价格?

然后为此产品添加新的套餐价格。

例:
使用SKU删除产品的所有层级价格:FD001
客户组ID为:4

PHP 5.3 Magento 1.4.2

5 个答案:

答案 0 :(得分:3)

您首先必须取消设置等级价格并保存产品,然后添加等级价格并再次保存。

Mage::getModel("catalog/product")->load(123)
    ->unsTierPrice()
    ->save()
    ->setTierPrice(array(
        array(
            'website_id'    => 0,
            'all_groups'    => 0,
            'cust_group'    => 4,
            'price'         => 99.99,
            'price_qty'     => 1
        ),
        array() // another tier, etc
    ))
    ->save();

答案 1 :(得分:2)

There's an API available for the product tier price

或者,您可以使用一些使用Magento代码的PHP代码来查询符合这些条件的产品列表,然后调整每个条件。 Alan Storm has an article about how Model Collections work (they're the type of object that you would use for this).

基本上删除产品会是这样的,我不确定如何设置等级价格,但你可以查看the generated phpdoc documentation。我正在选择与customer_group 4匹配的每个产品,然后删除每个产品。你必须弄清楚如何根据等级价格筛选出来......

<?php
require 'app/Mage.php';
$app = Mage::app('default'); // Mage_Core_Model_App
$store = $app->getStore(); // Mage_Core_Model_Store

$products = Mage::getModel('catalog/product')->getCollection();
// filter out anything that doesnt match the customer group 4
$products->addFieldToFilter('customer_group', '4');

// loop through each product and delete it
for ($products->load() as $product) {
  $product->delete();
}

答案 2 :(得分:1)

我最终通过使用直接数据库查询解决了这个问题。

一如既往,我正在寻找更好的答案。

我的Hacky解决方案:

$product = Mage::getModel('catalog/product')->load(9999);
$dbc = Mage::getSingleton('core/resource')->getConnection('core_write');
$dbc->query('DELETE FROM `catalog_product_entity_tier_price` WHERE `entity_id` = ' . intval($product->getId()) . ' AND `customer_group_id` IN(3,4,6,7) AND qty = 1');
$dbc->query(
    'INSERT INTO `catalog_product_entity_tier_price` (`entity_id`,`all_groups`,`customer_group_id`,`qty`,`value`,`website_id`)
    VALUES ('. intval($product->getId()) . ',0,' . intval($id) . ',1,' . floatval($price) . ',0)'
    );

答案 3 :(得分:1)

我搜索了一会儿,找到了一个解决方案,它不是纯SQL且不需要保存产品,因为我们要更新5万种产品目录的价格,因此保存所有这些肯定不是解决方案。 我想我终于找到了一个好方法。

Mage::getResourceSingleton('catalog/product_attribute_backend_tierprice')
->deletePriceData($product->getId()); 
$newTierPrice['entity_id']         = $product->getId()
$newTierPrice['all_groups']        = 1;
$newTierPrice['customer_group_id'] = 0;
$newTierPrice['qty']               = 42;
$newTierPrice['value']             = 100;
$newTierPrice['website_id']        = 0;
Mage::getResourceSingleton('catalog/product_attribute_backend_tierprice')
            ->savePriceData(new Varien_Object($newTierPrice));

答案 4 :(得分:0)

@ omouse的回答向我们指出了Magento的等级价格API。 [Updated Link for Magento 1.X's Tier Price API]注意:我正在使用Magento 1.9.2.2。

在寻找更新产品层级价格(不使用直接SQL)的最有效方法之后,我发现API是最快的方式。它仍然很慢,但它比我发现的推荐做类似的其他方法更好:

// Works, but is slow
$product = Mage::getModel('catalog/product')->load($productId);
$product->unsTierPrice();
$product->save();
$product->load();
$product->setTierPrice($tiers);
$product->save();

更好的是,我将层数组数组放入层对象数组中,并使用API​​函数更新产品:

// Build the array of tier level objects
foreach ($tierLevels as $tierLevel) {
    $tiers[] = (object) array(
        'website' => 'all',
        'customer_group_id' => 'all',
        'qty' => $tierLevel['min_qty'],
        'price' => $tierLevel['unit_price']
    );
}

// Use the API to do the update
try {
    $tierPriceApi = Mage::getSingleton('catalog/product_attribute_tierprice_api_v2');
    $tierPriceApi->update($productId, $tiers);
}
catch (Exception $e) {
    // Handle the exception
}