Установка (и обновление) цен на группы товаров


Это может быть довольно простой вопрос, но я пока не нашел подходящего соответствующего ответа.

Я пытаюсь импортировать цены продаж из CRM с помощью пользовательского модуля.

Я пробовал:

$item->setData('group_price', array(array ('website_id'=>0, 'cust_group'=>$custGroup->getId(), 'price'=>$price->precio)));

Но когда цена для группы клиентов действительно существует, я получаю следующую ошибку:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '14729-0-784-0' for key 'CC12C83765B562314470A24F2BDD0F36'

Я попробовал несколько вещей, включая получение существующих данных с помощью:

$group_prices = $item->getData('group_price');

Чтобы объединить результаты с новыми, удалите все групповые цены, прежде чем я установлю снова они. Но я, кажется, не получаю массив групповых цен, который я ожидал...

Может ли кто-нибудь помочь решить эту проблему?

 3
Author: Jared, 2014-02-12

3 answers

Групповое ценообразование в Magento является относительно новым, и для этого доступно не так много функций, основанных на моделях.

Если у вас есть идентификатор магазина, вы можете удалить цену одной группы или включить новую цену следующим образом:

$product = Mage::getModel('catalog/product')->setStoreId(2)->load(1234);
$product->setData('group_price',array ());
$product->save();

К сожалению, ситуации, с которыми я сталкивался, включали массовое обновление групповых цен, и многократное выполнение вышеперечисленных действий не является идеальным. В этом случае мне пришлось использовать прямой SQL для очистки данных для конкретного продукта, чтобы вы не получили ошибка повторного ввода с последующим повторным добавлением новых групповых цен.

/**
 * Clear out the group price table for a product
 *
 * @param Mage_Catalog_Model_Product $product
 */
private function _emptyGroupPrices($product) {
    /* @var $sql Mage_Core_Model_Resource */
    $sql = Mage::getSingleton('core/resource')->getConnection('core_write');
    $sql->query('delete from `catalog_product_entity_group_price` where `entity_id` = '.$product->getId());
}
 5
Author: Raj, 2014-02-13 16:49:43

Наконец, я думаю, что нашел решение.

Как я уже сказал, мне пришло в голову, что, поскольку group_prices - это массив, присвоенный атрибуту 'group_price' для элемента, мне следует каждый раз устанавливать весь массив. Итак:

$group_prices = $item->getData('group_price');
if (is_null($group_prices)) {
    $attribute = $item->getResource()->getAttribute('group_price');
    if ($attribute) {
        $attribute->getBackend()->afterLoad($item);
        $group_prices = $item->getData('group_price');
    }
}


if(!is_array($group_prices)){
    $group_prices = array();
}

$new_price = array(array ('website_id'=>0, 
              'cust_group'=>$custGroup->getId(), 
              'price'=>$price->precio));

$group_prices = array_merge($group_prices, $new_price);
$item->setData('group_price', $group_prices);

Похоже, это сработало просто отлично, в любом случае, я бы не возражал, если бы кто-нибудь дополнил или исправил этот ответ.

 3
Author: Jared, 2014-02-17 10:13:54

Похоже, что надежного способа сделать это не существует, я пробовал описанное выше и пробовал другие методы, например, UpdateAttributes. Вот моя версия для повторной индексации и очистки FPC Лести вместе с обновлением сгруппированного продукта.

 private function _emptyGroupPrices($product) {
    /* @var $sql Mage_Core_Model_Resource */
    $sql = Mage::getSingleton('core/resource')->getConnection('core_write');
    $sql->query('delete from `catalog_product_entity_group_price` where `entity_id` = '.$product->getId());
}

 private function _updateGroupPrice($product,$groupPrice,$groupId) {
    $sql = Mage::getSingleton('core/resource')->getConnection('core_write');
    $sql->query('INSERT INTO `catalog_product_entity_group_price` (entity_id,all_groups,customer_group_id,value,website_id) VALUES ("'.$product->getId().'","0","'.$groupId.'","'.$groupPrice.'","0")');
}

$newPrice = "10.00";

$this->_emptyGroupPrices($product);
$this->_updateGroupPrice($product,$newPrice);

Mage::getResourceModel('catalog/product_indexer_price')->reindexProductIds($product->getId());
Mage::getSingleton('fpc/fpc')->clean(sha1('product_' . $product->getId()));

$ids = $this->_getAssociatedProductIds($product->getId());
foreach($ids as $id) {
    Mage::getResourceModel('catalog/product_indexer_price')->reindexProductIds($id);
    Mage::getSingleton('fpc/fpc')->clean(sha1('product_' . $id));
}
 1
Author: Joel Davey, 2015-06-15 14:47:54