Не понимаю почему нет вывода в буфер в функциии-обработчика CatalogViewedProduct::OnBeforeAdd/OnBeforeUpdate ?
Делаю метку с помощью file_put_contents - все ок, функция отрабатывает. Пытаюсь вывести консольное сообщение в браузер при наступлении события просмотра товара (пусть будет echo "Hello World"), но безуспешно.
Вставку записи осуществляет catalog.element вызовом Catalog\CatalogViewedProductTable::refresh из под catalog.element/class.php. Как я понимаю процесс: в теле страницы происходит APPLICATION->IncludeComponent(...), который в свою очередь вызывает CBitrixComponent::initComponent, который подключает данный класс в текущее пространство имен.
После завершения буферизации я ожидаю увидеть Hello World в окне браузера, но его нет. Что происходит в компоненте catalog.element такого, что мои ожидания становятся напрасными?
Андрей Николаев как-то говорил, что такое не будет работать, но я не совсем понимаю почему.
т.е я предполагаю что на момент, когда происходит Catalog\CatalogViewedProductTable::refresh буферизация уже заканчивается и все, что идет на вывод просто игнорится
Update: поставив временные метки, обнаружил что это не так.
Omar Khazamov написал: Андрей Николаев как-то говорил , что такое не будет работать, но я не совсем понимаю почему.
Почему-это не будет? Будет Вы меня наверное неправильно поняли: то, решение которые Вы описали не будет работать и предупреждений выдавать не будет (и не должно). Вывод работает - протестировал сейчас Но скорее всего такой вывод будет не всегда работать (в данном конкретном случае он работает, но могут быть и другие, в которых он работать не будет или будет некорректно себя вести)
Omar Khazamov написал: Пытаюсь вывести консольное сообщение в браузер при наступлении события просмотра товара (пусть будет echo "Hello World"), но безуспешно.
Логично с учетом того, что обращение к этой таблице идет на ajax-запросе (если речь о дефолтном шаблоне и выключена настройка "Включить сохранение информации о просмотре товара для старых шаблонов")
Не надо сверлить зубы через задний проход дрелью от Сваровски
Omar Khazamov написал: Евгений, Николай, спасибо. Если поставить галочку на "Включить сохранение информации о просмотре товара для старых шаблонов", то решение срабатывает.
Не надо ее включать для дефолтных шаблонов. Этот параметр был добавлен специально для тех владельцев магазинов, которые по каким-то причинам (например, отсутствие программиста) не могут обновить свои шаблоны компонент.
Цитата
Omar Khazamov написал: Включать режим совместимости - насколько это в среднем замедляет работу сайта? Ведь там наверно подключается куча дополнительных классов.
Неверно. Отключение режима совместимости ускоряет работу компонента (т.е. в режиме совместимости компонент работает по времени и ресурсам так же, как раньше). В любом случае, это проявляется только на хите, генерирующем кеш.
А вообще - вы какую задачу, связаную с просмотром товара, решаете?
Не надо сверлить зубы через задний проход дрелью от Сваровски
задача простая - отдавать событие в google analytics по наступлению события просмотра товара. Знаю, есть куча плагинов, но мне нужно именно так - дрелью от Сваровски ))
2) Можно проверять через URL и сравнивать с ЧПУ каждого инфоблока который является торговым каталогом. Минусы: - А с чего Вы взяли что у всех они совпадают? - Опять же фича с быстрым просмотром
и #4:
Код
4) В новой версии (тестил на 17.5) Битрикса можно подписываться на события ORM у \Bitrix\Catalog\CatalogViewedProductTable
Насколько я знаю, Битриксовая big-data именно оттуда и берет информациювЃ
События аналитики вывожу либо прямиком в буфер, либо ставлю флаг а затем обрабатываю в OnAfterEpilog.
Единственный работающий для меня метод на данный момент - включение режима совместимости и ORM подписка на CatalogViewedProductTable.