Ключ в настройках модуля push and pull не задан. Bitrix VM 7.3.0. Версия системы 18.0.0
Пытаясь ознакомиться с работой модуля я написал простой скрипт, который отправляет команду "test" из кастомного модуля crto.onetag с сервера на фронт при наступлении событий main::onPageStart.
2. Не совсем понимаю как происходит вызов функции CPullStack::AddShared на серверной стороне. Вызова CPullStack::AddShared не происходит при обновлении страницы (ниже стоящий var_dump показывает, что событие OnPageStart отрабатывает ОК). По идее событие OnPageStart происходит при каждом обновлении страницы сайта. Вызов вижу только при вызове диалога редактирование файла (изменить страницу -> в режиме php кода)
У кого похожая проблема со мной - нужно удалить директорию .last_version из папки модуля, тогда ошибка [Ux11] Ошибка описания модуля ".last_version". исчезнет. Возможно разработчикам Битрикса будет полезно добавить одно условие в код для проверки наличия существующей папки .last_version и предлагать выбор (удалить\заменить итд), нежели выводить бесполезное сообщение об описании модуля.
похожая ситуация. Следую докам, однако в админке модуль не отображается.
т.е
./include.php содержит код_партнера.код_модуля ./options.php содержит код_партнера.код_модуля ./install/index.php содержит код_партнера.код_модуля во всех процедурах регистрации\дерегистрации ./install/index.php содержит класс в виде код_партнера_код_модуля.
Компонентов модуль не имеет. $this->PARTNER_NAME и $this->PARTNER_URI заданы. version.php имеется и в порядке.
Есть ли какое-то дополнительное требование, чтоб модуль отобразился в списке? Возможно нужно ли загружать решение в партнерку, чтоб Битрикс распознал решение как партнерское?
задача простая - отдавать событие в google analytics по наступлению события просмотра товара. Знаю, есть куча плагинов, но мне нужно именно так - дрелью от Сваровски ))
2) Можно проверять через URL и сравнивать с ЧПУ каждого инфоблока который является торговым каталогом. Минусы: - А с чего Вы взяли что у всех они совпадают? - Опять же фича с быстрым просмотром
и #4:
Код
4) В новой версии (тестил на 17.5) Битрикса можно подписываться на события ORM у \Bitrix\Catalog\CatalogViewedProductTable
Насколько я знаю, Битриксовая big-data именно оттуда и берет информациювЃ
События аналитики вывожу либо прямиком в буфер, либо ставлю флаг а затем обрабатываю в OnAfterEpilog.
Единственный работающий для меня метод на данный момент - включение режима совместимости и ORM подписка на CatalogViewedProductTable.
т.е я предполагаю что на момент, когда происходит Catalog\CatalogViewedProductTable::refresh буферизация уже заканчивается и все, что идет на вывод просто игнорится
Update: поставив временные метки, обнаружил что это не так.
Не понимаю почему нет вывода в буфер в функциии-обработчика 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 такого, что мои ожидания становятся напрасными?
Андрей Николаев как-то говорил, что такое не будет работать, но я не совсем понимаю почему.
Отдельный вопрос, проведите ликбез: каким образом вывод в буфер можно синхронизировать с текущим состоянием страницы веб-браузера?
Вот пример. При создании заказа в инет магазине буферный контент $content возвращается к браузеру, затем происходит переадресация. Данный код работает:
Т.е сообщение whats up выводится прямо в AJAX-response идущего от веб-сервера (картинка 1 ниже)
Почему Битрикс допускает такое? Неужели нельзя дождаться окончания выполнения служебной части эпилога, (включая обработчика OnAfterEpilog), а только затем указать браузеру начать обрабатывать\интерпретировать страницу?
Результат - белая страница. Либо версия автора, либо буфер обмена недостаточного размера, чтоб вместить страницу. Сам Битрикс как всегда никаких сообщений в логах не оставляет.
Версия Битрикса - самая свежая на сегодняшний день
изучил битриксовский модуль SEO, там вспомогательные классы имеют статичные функции, которые вызываются из основных классов. Должно же работать)) будем искать ошибку...
Какой лучший способ коммуникации между классами внутри кастомного модуля в Битрикс? Пробовал создавать класс хранилища, а также использовать глобальные переменные, как указано тут (https://dev.1c-bitrix.ru/support/forum/forum6/topic56527/) , однако никак не выходит. Задача простая - по событию сохранения товара в корзине выставить флаг и наименование товара, а затем с помощью OnAfterEpilog вывести название в консоль (при наличии установленного флага).
Получилось реализовать коммуникацию с помощью $_SESSION. Чувствую, что это не лучший способ реализовать коммуникацию между классами. Также попробовал через внутренний объект статичного класса , однако этим методом прибавилась задержка в 100 мс (методом $_SESSION задержка была около 10 мс)
Дополнение: некоторые изменения все же подтягиваются сразу (напр. логические условия), однако другие (например объявление нового класса) - только после переустановки. Возможно есть какой-то внутренний кэш модуля или битрикса, который нужно очищать? Подскажите пожалуйста
В include.php моего модуля у меня имеется код, при изменения которого не вступают в эффект пока не удалишь и заново не установишь модуль. (т.е не выполнится функция registermoduledependences / unregisterdmoduledependences)
Есть ли менее затратный в плане времени способ вносить изменения и тестировать код без этой рутины с установкой и удалением? Как один из способов - настроить все в php_interface/init.php, а затем по готовности переносить в include.php, но эта копи-паста тоже муторная.
не имеет смысла, да и форумчане ругали за попытку вывода в буфер внутри компонента.
Что если внутри OnSaleOrderSaved ставить флаг события, а затем внутри OnEndBufferContent уже вставлять нужный скрипт в зависимости от установленного флага? Делать это для событий корзины, просмотра карточки товара и покупки. Пробовал ли кто-нибудь такое, или есть более интересные способы?
На событиях entity такого не делают. Это можно сделать, если есть события которые что-то рендерят или на js-событиях в публичной части.
Код
Все остальное делается только через подключение своих скриптов и перехват
Другими словами, я делаю в своем модуле публичную часть, которая будет ловить событие собственного модуля ? Какая структура библиотеки JS BX отвечает за это? Андрей, не сочтите за наглость , можно простейший пример модуля, который рендерит что-нибудь на стандартное события стандартного модуля?