Рейтинг: 4.3059  
На голосовании
Предложил Пользователь 130208 02.09.2014 13:13:24

Взаимодействие каталогов с модулем "Интернет магазин" только через интерфейс IBXSaleProductProvider

Добрый день.
Это скорее идея не нового функционала, а доработки до ума старого. Оформлено в качестве идеи по совету техподдержки продукта.
Итак.
В обновлении 12.5 произошли изменения в канале взаимодействия модуля интернет магазина и каталога.
Блог Алексея Кирсанова. Магазин и каталог 12.5 Коротко об изменении:
Последние обновления привнесли существенные изменения в связь между магазином и каталогом. Базовые принципы остались неизменными: магазин ничего не знает о каталоге (точнее не знает основной функционал магазина), связь осуществляется через через специальный обратный вызов. Соответственно магазину все равно, кто кормит его товарами. Это может быть вовсе не модуль каталога. Магазину важно только, чтобы ему дали интерфейс, по которому он может актуализировать цены, проверять количество, сообщать о фактической продаже товара и т.п.
Звучит многообещающе, но это не совсем так. На самом деле, класс реализующий интерфейс IBXSaleProductProvider вызывается в основном при пересчете цены, количества товара и скидок. В других важных для "скармливания магазину других сущностей" местах применяются методы, работающие напрямую с модулем "каталог".

Нашим клиентам потребовался интернет магазин с товарами которые было крайне сложно разместить в модуле каталог. Не вдаваясь в специфику скажу, что проще было написать свой модуль, предоставляющий альтернативный "каталог" (одна из особенностей - продукт как таковой, создается в момент работы пользователя с магазином). Появление интерфейса IBXSaleProductProvider позволил реализовать такой модуль, без необходимости дублирования работы модуля интернет магазин.
Был написан класс, реализующий интерфейс IBXSaleProductProvider, который предоставлял модулю sale информацию о цене, количеству, ссылке на товар и т.п.

Выяснялось, что модуль sale для получения информации о товаре в корзине/заказе вообще не использует интерфейс IBXSaleProductProvider, но в половине случаев вызывает метод CSaleBasket::GetList, который берет данные напрямую из таблицы b_sale_basket, а в других случаях -  метод getProductProps, суть которого - в поиске товара по ID, по всем инфоблокам, что приводит к плачевным результатам в нашем случае с альтернативным хранением продуктов(коллизия по ID и выдача случайно совпавшего элемента случайного инфоблока)

Первая проблема возникает со стандартным компонентом sale.basket.basket, в котором для получения информации о товаре вызывается метод getProductProps, но эта проблема была решена с помощью result_modifier.php.

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

А решение есть одно - реализовать взаимодействие модуля интернет магазина с каталогами только через интерфейс IBXSaleProductProvider что позволит полностью инкапсулировать каталог и использовать в качестве каталога все, что потребует реализация и клиенты )

P.S.: в тексте выше продемонстрировано только отсутствие вызовов метода IBXSaleProductProvider::GetProductData , а удобных и полезных методов в интерфейсе заложено много, просто с отсутствием их поддержки мы, возможно, еще не столкнулись