2011-12-13 3 views
3

Без прямого запроса к базе данных Magento. Как я могу удалить все цены уровня для определенного продукта на основе количества и группы клиентов?Обновить все Tier цены на продукт

Затем добавьте новые уровни для этого продукта.

Пример:
Удалить все цены яруса для продукта с SKU: FD001
где группа идентификатор клиента: 4

PHP 5.3 Magento 1.4.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)' 
    ); 
+0

Весь смысл magento - НЕ использовать прямые SQL-запросы. – Qix

2

There's an API available for the product tier price ,

В качестве альтернативы вы можете использовать некоторый PHP-код, который использует код Magento для запроса списка продуктов, соответствующих этим критериям, а затем скорректируйте их. 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(); 
} 
+0

Мне не нужен список многоуровневых цен. Я хочу удалить их на основе критериев. Я искал что-то вроде модели, на которой я могу запустить delete, чтобы удалить их. –

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(); 
+2

Я могу подтвердить это. Однако между вашим первым сохранением и настройкой цены нового уровня вам нужна другая нагрузка. По крайней мере, для 1.9.1.'Mage :: getModel ("Каталог/продукт") -> Нагрузка (123) -> unsTierPrice() -> Сохранить() -> нагрузки() -> setTierPrice (массив ( массив ( 'website_id' => 0, 'all_groups' => 0, 'cust_group' => 4, 'цена' => 99,99, 'price_qty' => 1 ), массив() // другой уровень и т.д. )) -> save(); ' –

0

@ Ответ на omouse указал нам API Magento на цены уровня. [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 
}