Комментарий, касательно идеологии поиска - действительно модуль поиска не знает ничего о том, по какой ссылке располагается контент - это может знать только тот, кто его отображает - поэтому механизм получения ссылки был отвязан от модуля поиска при поможи системы событий.
В битриксе существует несколько способов задания реакции на события:
- реализовать в классе интерфейс IBXMessageReceiver и пометить класс одним или несколькими атрибутами BXEventListenerAttribute c указанием имени события; подписка на событие будет существовать глобально
- пометить класс атрибутом BXMessageReceiverAttribute, реализовать в нем статический метод с сигнатурой [B]public static void MethodName(BXCommand command)[/B] и пометить его атрибутом BXEventListenerAttribute c указанием имени события; подписка на событие будет существовать глобально
- зарегистрировать обработчик события при помощи BXHitEvent.Register; подписка на событие будет существовать в пределах текущего запроса
- при помощи BXComponentEventManager.GetByMessage("Bitrix.Search.ProvideURL") получить список компонентов - подписчиков, изменить его и обновить методом Update; в данном случае при инициации события будет поднят класс компонента, ему будут переданы заданные параметры (жизненный цикл компонента отрабатывать не будет), а затем вызван метод ProcessMessage, что позволяет инкапсулировать некоторую логику обработки событий в теле компонента
Механизм разрешения ссылок в модуле поиска построен по следующему принципу:
Модуль поиска слушает событие "Bitrix.Main.OnAfterSavePage":
path: string - виртуальный путь к сохраняемой странице;
site: BXSite - сайт, на котором расположена данная страница;
page: BXPageProxy - предоставляет интерфейс для редактирования частей страницы.
Оно возникает когда происходит сохранение страницы в файл штатными средствами: через админку или диалоги (метод BXSecureIO.SaveAspx).
При возникновения события модуль поиска сканирует компоненты на странице на наличие предопределенного свойства "DisplaySearchResults" и если оно имеет значение True, то регистрирует компонент в BXComponentEventManager.
Комплексные компоненты новости и каталог имеют свойство "DisplaySearchResults" и
учитывают событие "Bitrix.Search.ProvideURL" в методе ProcessMessage.
Однако такой подход не сработает, если компонент размещен на страницу без <bx:IncludeComponent />
Остальную часть информации сейчас перевариваю :D