标签归档:Tier Price

Magento API 设置 Tier Price

Magento Tier Price表

先看看customer_group表:
Magento的customer_group表
customer_group 把客户分成了几类,方便管理。注意customer_group_id为0的记录,没有登录的浏览者,都归这个组。

接下来看看catalog_product_entity_tier_price表:
Magento的catalog_product_entity_tier_price表
在创建客户时有一个下拉菜单为Customer Group,它并不能选择customer_group_id为0的组(因为0表示没有登录的所有客户)。 entity_id就是对产品实体的引用,后面的qty对应了value(价格)。当创建一个产品时:
Magento产品阶梯价格设置

这里指定了website_id,数量 和 价格,如果选择了ALL GROUPS,那么all_groups就是1,customer_group_id就是0,否则all_groups为0,customer_group_id对应的组ID(此时不应该为0),明白这个逻辑非常重要

注意,上面的Website下拉块只有All Websites可选,看起来website_id总是0。如果要批量更新或插入,直接操作数据表也是可以的。不过这里通过API来练手一下。

查看http://www.magentocommerce.com/api/soap/catalog/catalogProductTierPrice/catalogProductTierPrice.html文档,发现没有v2版本的方法提供,只能使用v1版本:

try{
$client = new SoapClient('http://magento.vfeelit.com/api/soap/?wsdl');
$session = $client->login('vfeelit', '1234567890');
$tierPrices = $soap->call($session,'product_tier_price.info', ‘oc’);

print_r($tierPrices);
}

// 输出
Array
(
    [0] => Array
        (
            [customer_group_id] => all
            [website] => all
            [qty] => 5.0000
            [price] => 90.0000
        )

    [1] => Array
        (
            [customer_group_id] => all
            [website] => all
            [qty] => 10.0000
            [price] => 80.0000
        )

    [2] => Array
        (
            [customer_group_id] => all
            [website] => all
            [qty] => 20.0000
            [price] => 70.0000
        )

)

这个组织形式就是如此。customer_group_id不是all就是具体的组id(但是绝对不能指定0)。下面我们做一个批量插入的程序:

try{
	$client = new SoapClient('http://magento.vfeelit.com/api/v2_soap/?wsdl');
    $session = $client->login('vfeelit', '1234567890');

	$allProducts = $client->catalogProductList($session);
	
	foreach($allProducts as $product){
		$pid = (int)$product->product_id;
		
		$entity = $client->catalogProductInfo($session,$pid);
		$price = $entity->price;
		if((float)$price <= 10){  // 价格满足条件是才添加tier price
			continue;
		}

		// 添加阶梯,如果是针对所有组,必须指定为all,一定不要指定为0,否则出现怪异现象
		$tierPrices = array(
			array('customer_group_id' => 'all', 'website' => '0', 'qty' => '10', 'price' => round($price * 0.95, 4)),
			array('customer_group_id' => 'all', 'website' => '0', 'qty' => '20', 'price' => round($price * 0.9, 4)),
		);	
		$result = $client->catalogProductAttributeTierPriceUpdate(
			$session,
			$pid,
			$tierPrices
		);
		echo $result.'<br />';
	}

}catch(SoapFault $e){
	echo $e->getMessage();
}catch(Exception $e){
	echo $e->getMessage();	
}

这段代码执行是非常耗费资源的,所以PHP必须开足马力,比如加大超时时间,最大执行时间。

永久链接:http://blog.ifeeline.com/562.html
原创文章,转载务必保留出处。