Установка (и обновление) цен на группы товаров
Это может быть довольно простой вопрос, но я пока не нашел подходящего соответствующего ответа.
Я пытаюсь импортировать цены продаж из 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 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()); }
Наконец, я думаю, что нашел решение.
Как я уже сказал, мне пришло в голову, что, поскольку 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);
Похоже, это сработало просто отлично, в любом случае, я бы не возражал, если бы кто-нибудь дополнил или исправил этот ответ.
Похоже, что надежного способа сделать это не существует, я пробовал описанное выше и пробовал другие методы, например, 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));
}