Рейтинг: 2.547  
На голосовании
Предложил Кирсанов Анатолий 15.02.2015 02:06:37

Добавить в ограничения типов цен сайт

Сейчас (catalog 15.0.3) цену можно привязать к группе пользователей. И на этом все.

Если делать два магазина на одном каталоге (остатки общие тогда, а цены разные), то приходится кастомизировать процедуру выбора оптимальной цены. Фактически, это приводит к копированию  внутреннего кода и внесению в него минимальных изменений. Потом, с каждым обновлением модуля catalog приходится проводить проверку изменений в этом модуле ...

Есть желание привязать возможность покупки и возможность просмотра цены не только к группе пользователя, но и к сайту. В конце концов, это отражение многосайтовой архитектуры Битрикс ...
Рейтинг: 0  
Ответил Жуков Евгений 18.02.2015 14:50:56
Идея имеет смысл. Основная проблема - в сохранении совместимости с существующим кодом как в продукте, так и в решениях партнеров. Подумаем.
Рейтинг: 4.8256  
Отложено
Предложил Кирсанов Анатолий 20.06.2014 16:59:12

Передать в CCatalogProduct::GetOptimalPrice и обработчик "catalog", "OnGetOptimalPrice" ИД позиции корзины

Пересчет цены сейчас происходит в двух трех случаях (из тех, что понятны посетителю):
  • Добавление товара в корзину.
  • Открытие страницы корзины (bitrix:sale.basket.basket)
  • Открытие страницы заказа (bitrix:sale.order.ajax)
Если при добавлении в корзину вмешательство в расчет оптимальной цены возможно при знании только самого добавляемого товара, то при обновлении корзины это может быть недостаточно.

Примеры:
  • Требуется учесть ценовое предложение (а соответственно и группу каталога), которые были выбраны той же (через событие OnGetOptimalPrice) процедурой выбора оптимальной цены еще при добавлении в корзину.
  • Процедура пересчета цены позиции корзины может нуждаться в дополнительных данных, которые могут быть записаны в свойство позиции корзины (учитываем, что один и тот же товар в разных комбинациях свойств в корзине может появиться не один раз!).
В обоих случаях требуется ИД самой позиции и знание ИД товара здесь точно недостаточно, требуется контекст (конкретная позиция корзины).

Что сейчас есть

  • CSaleBasket::UpdateBasketPrices. Метод используется в коде компоненты для обновления цены.
  • Аналогичный метод CSaleBasket::ReReadPrice делает тоже самое для одного товара, и тоже без сведений о позиции корзины (он используется пока только при добавлении в корзину, так что может и не страшно).
  • Так или иначе, все сводится к вызову провайдера каталога CCatalogProductProvider::GetProductData. Этот метод провайдера в состоянии получить BASKET_ID, но его туда не передают (это недоразумение обещано исправить).
  • Уже сам провайдер вызывает метод CCatalogProduct::GetOptimalPrice и здесь информация о позиции корзины теряется (и разработчик отказался это исправлять).
  • Само собой обработчику события OnGetOptimalPrice не может быть передана информация о позиции корзины
  • Нормально пересчитать цену товара, уже добавленному в корзину, нельзя.
Какие есть костыли

Ну конечно, можно что-то придумать. Решение здесь очевидно - нужно кастомизировать компоненту корзины и заказа, чтобы гарантировать точный порядок перебора позиций. Далее глобальная переменная и знание обработчика о наличии такого контекста его исполнения.

Но зачем так делать, если можно сделать нормальный API?

Идея рождена по предложению сотрудника поддержки (обращение 500340).