1С-Битрикс: Управление сайтом ASP.Net: расширенная агрегация RSS

22 Июля 2010
Попробуем в рамках лицензионной программы "1С-Битрикс: Управление сайтом ASP. NET" осуществить расширенную агрегацию RSS в информационные блоки. Под расширенной агрегацией понимаем следующее: возможность получения и распределения RSS сообщений по различным папкам в зависимости от ключевых слов, заданных в свойствах информационного блока.

Ключевым моментом технологии продуктов компании 1С-Битрикс для любой платформы (PHP, ASP.NET) является информационный блок.

Информационный блок - сущность, позволяющая каталогизировать и управлять различными типами (блоками) однородной информации.

Информационный блок позволяет очень гибко подходить к информации любого типа, хранить, обрабатывать и выводить ее в нужном для пользователя качестве и виде. В нашем примере информационный блок будет использован как инструмент для расширенной агрегации RSS.

RSS — семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Технология, родившаяся из потребностей представить на своем сайте самую актуальную и свежую информацию.

Попробуем в рамках "1С-Битрикс: Управление сайтом ASP. NET" осуществить расширенную агрегацию RSS в информационные блоки. Под расширенной агрегацией понимаем следующее: возможность получения и распределения RSS сообщений по различным папкам в зависимости от ключевых слов, заданных в свойствах информационного блока.

Решаемая задача

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

Предположим, что вы создаете на базе решения «Сайт сообщества» CMS «1С-Битрикс: Управление сайтом ASP.NET» некий Клуб любителей новых технологий. Вам с нескольких источников приходят новости IT-технологий «вообще», то есть и новости программного обеспечения и новости компьютерного «железа». Эти новости нужно рассортировать по темам и вывести на разных страницах сайта.

Предлагаемый здесь вариант позволяет сортировать сообщения по папкам любой глубины вложения. То есть, например, раздел по программному обеспечению можно делить до сколь угодно подробной рубрикации, вплоть до отдельных программ, а в случае с «железом» до отдельного вида продукции конкретного производителя.

Для решения задачи расширенной агрегации нам нужно сделать следующее:

· Создать тип информационного блока, который будет обслуживать решение задачи.

· Создать отдельный информационный блок (ib1) для RSS сообщений.

· Создать отдельный информационный блок (ib2) для вывода сообщений на страницах сайта.

· Создать структуру разделов в рамках ib2 для вывода на страницах сайта.

· Создать файлы, обслуживающие агрегатор RSS.

· Создать страницы на сайте и обеспечить вывод данных из ib2 стандартными средствами CMS.

Чтобы легче было понять о смысл этой задачи, посмотрите рабочий пример такой расширенной интеграции: http://www.gotdotnet.ru/technologies/.

Создание Типа инфоблока

Создание Типа информационного блока выполняется обычным для "1С-Битрикс: Управление сайтом ASP.NET" способом на странице Контент > Информ. блоки > Типы информ. блоков в Административной части системы. Единственный нюанс, который надо учесть - это установить флажок в поле Использовать древовидный классификатор элементов по разделам, так как нам надо будет использовать разделы для вывода RSS новостей. Пусть тип инфоблока называется Aggregator.

1С-Битрикс Создание типа инфоблока

Создание первого инфоблока

В рамках созданного типа инфоблока создадим первый инфоблок. Создание инфоблока происходит на странице Контент > Aggregator в Административной части системы.

Ib1 отвечает за получение самих RSS сообщений с сайта-источника. Поэтому при создании инфоблока нам нужно создать поля элементов информационного блока, обеспечивающие выполнение этой задачи. Вот эти поля:

· Адрес RSS (код SOURCE_URL). Поле для ввода адреса подписки.

· Период загрузки RSS в часах (код PERIOD). Указание для системы как часто проверять новые сообщения на сайте-источнике.

· Время хранения записей в днях (0 - навсегда) (код STORAGE_TIME). Параметр, по которому будет проставляться период активности записи. Начало активности – это дата загрузки, конец активности – это дата загрузки + число дней, указанных в этом поле.

· Имя автора записей по умолчанию (код AUTHOR_NAME). Поле для указания автора записи, как правило, это выводимое название источника.

· Автоматические теги для записей подписки (код TAGS). Поле для задания собственных тегов. Применяется для подписок, в тематике которых разработчик уверен. При распределении новостей по разделам система будет складывать теги сообщения и теги, введенные в это поле, и по этой сумме производить сортировку.

· Загружать только анонс (ссылка записи будет открывать оригинальный сайт) (код PREVIEW_ONLY). Система будет загружать только анонсы сообщений, детальное сообщение будет просматриваться пользователем на сайте-источнике. Рекомендуется для сайтов с большой посещаемостью.

Примечание. Названия свойств могут быть любые, а вот коды свойств необходимо использовать указанные в этом тексте. Так как они используются в файлах, обслуживающих агрегатор RSS. Все это справедливо и для второго инфоблока. Вы можете использовать и другие коды, но в этом случае вам будет необходимо править файлы, обслуживающие код агрегатора.

1С-Битрикс Свойства элементов ib1

Создание второго инфоблока

Второй инфоблок служит непосредственно инструментом вывода RSS новостей для показа пользователям сайта. Поэтому он получается несколько сложнее. Надо будет создавать не только поля для свойств для элементов, но и поля свойств для разделов.

Поля свойств для элементов информационного блока:

· Имя автора (код AUTHOR_NAME). Проставляется системой автоматически из свойств сообщения.

· Ссылка на оригинал записи (код SOURCE_URL). Проставляется системой автоматически из свойств сообщения.

· Ссылка на комментарии (код COMMENTS_URL). Проставляется системой автоматически из свойств сообщения.

1С-Битрикс Свойства элементов ib2

Поле свойств для разделов ib2 необходимо только одно: Время хранения записей в днях (0 - навсегда) с кодом STORAGE_TIME. Значение поля аналогично значению одноименного свойства в ib1.

1С-Битрикс Свойства разделов ib2

Создание элемента инфоблока ib1

Создавая элемент ib1 мы создаем подписку на определенный канал RSS. Для создания подписки просто заполните поля формы создания элемента:

1С-Битрикс Создание подписки

Создание разделов во втором инфоблоке

Создание структуры разделов ib2 выполняется типовым для CMS способом. Вложенность разделов может быть произвольной.

1С-Битрикс Созданная структура разделов ib2

При создании разделов необходимо использовать штатное поле раздела Внешний ключ закладки Дополнительно для ввода ключевых слов, по которым будут распределяться загруженные новости. В поле Внешний ключ может быть добавлено несколько ключевых слов. Ключевые слова могут повторяться в разных папках. Сообщение будет добавлено в каждую папку, в которой есть хотя бы одно ключевое слово.

1С-Битрикс Заполняем поле Внешний ключ

Для задания ограничения хранения новостей по времени используется свойство Время хранения записей в днях.

Создание файлов, обслуживающих агрегатор RSS

Для работы создаваемого механизма не достаточно штатных возможностей "1С-Битрикс: Управление сайтом ASP.NET". Необходимо создать еще несколько файлов, которые и будут выполнять функцию сортировки и контроля за актуальностью сообщений.

Для начала необходимо в корне сайта создать папку App_Code, где будут размещены файлы, обслуживающие агрегатор. Это стандартная для ASP.NET папка для файлов с пользовательским кодом.

После этого создадим три файла:

Agent.cs – код технологии агентов. При любом изменении элементов вышеописанных инфоблоков автоматически перенастраиваются агенты. Перенастройка агентов производится системными обработчиками событий.

Агенты - это технология, позволяющая запускать произвольный .NET код (агенты) с заданной периодичностью.

Event.cs – код обработчиков событий.

Иногда бывает необходимо повлиять на ход выполнения какой-нибудь API функции. Но если ее изменить, то эти изменения будут утеряны при очередном обновлении. Для таких случаев и разработана система событий. В ходе выполнения некоторых API функций, в определённых точках установлены вызовы определенных функций, так называемых обработчиков события.

Tech.cs – код непосредственно для загрузки новостей.

Совместная работа этих файлов создает три типа агентов:

Первый. Для каждой подписки создается свой собственный агент, который работает в фоновом режиме. Он производит анализ тегов приходящих сообщений в рамках работы ib1, сортирует их и распределяет по разделам ib2.

Второй. Агент на удаление записей, чей срок активности истек.

Третий. Агент на удаление записей, чей срок истек по настройкам ib1, а не по настройкам раздела.

Сортировка работает таким образом, что сообщение попадает в каждую из категорий, которая имеет хотя бы один тег, соответствующий сообщению. Если тегам соответствует несколько категорий, то сообщение будет добавлено в каждое из них.

Коды файлов:

Agent.cs

using System; using Bitrix.DataLayer; using Bitrix.DataTypes; using Bitrix.IBlock; using Bitrix.Services; namespace Bitrix.Demo { public class AggregatorRssDownloadExecutor : IBXAgentExecutor { public bool Execute(BXSchedulerAgent agent, BXParamsBag parameters) { object param; BXIBlockElement element; if (parameters == null || !parameters.TryGetValue("ElementId", out param) || (element = BXIBlockElement.GetById(param)) == null) { //Удаляем агент если элемента-подписки не существует agent.Delete(); return false; } RssFeedSettings settings = Aggregator.GetSettings(element); if (!element.Active || settings == null) { //если элемент неактивный - агент тоже неактивный agent.Active = false; return true; } try { Aggregator.LoadRssItems(settings); //выставляем период, заданный в настройках подписки agent.Period = TimeSpan.FromHours(settings.AgentPeriod); } catch (Exception ex) { BXLogService.LogAll(ex, BXLogMessageType.Error, String.Format("Aggregator. Ошибка загрузки RSS. (ID={0})", element.Id)); //увеличиваем период запуска agent.Period = agent.Period.Add(new TimeSpan(1,0,0)); } return true; } } public class AggregatorRemoveItemsInSection : IBXAgentExecutor { public bool Execute(BXSchedulerAgent agent, BXParamsBag parameters) { object param; BXIBlockSection section; if (parameters == null || !parameters.TryGetValue("SectionId", out param) || (section = BXIBlockSection.GetById(param)) == null || section.CustomPublicValues.GetInt32("STORAGE_TIME", 0) 1) { BXIBlockElement trueElement = null; foreach (var element in elements) { if (element.CustomValues != null && String.Equals(element.CustomPublicValues.GetString("SOURCE_URL"), url, StringComparison.OrdinalIgnoreCase)) { trueElement = element; break; } } return trueElement ?? elements[0]; } else if (elements.Count == 1) return elements[0]; else return null; } private static string GetPreview(string originalText, int maxLength) { string preview = BXStringUtility.StripOffSimpleTags(originalText); preview = HttpUtility.HtmlDecode(preview); preview = preview.Trim(' ', '\n', '\t', '\r'); if (maxLength > 0 && preview.Length > maxLength) preview = preview.Substring(0, maxLength) + " ..."; return preview; } private static BXIBlockElement.BXInfoBlockElementSectionCollection GetSections(BXRss20ChannelItem rssItem) { BXIBlockElement.BXInfoBlockElementSectionCollection result = new BXIBlockElement.BXInfoBlockElementSectionCollection(); if (technoloryTree == null) InitTechnologyTree(); List rootSections = GetSection(rssItem, technoloryTree, false); foreach (TechnologyItem rootSection in rootSections) { List childSections = GetSection(rssItem, rootSection.Childs, false); if (childSections.Count > 0) { result.Add(childSections[0].Id); } else if (rootSection.DefaultChild != null && !(rootSection.DefaultChild.StorageTime > 0 && rssItem.PubDate.HasValue && rssItem.PubDate.Value 0 && rssItem.PubDate.HasValue && rssItem.PubDate.Value 0 && !BXStringUtility.IsNullOrTrimEmpty(names[0].InnerXml)) return names[0].InnerXml; } if (!BXStringUtility.IsNullOrTrimEmpty(item.Author)) return item.Author; return defaultName; } } }

Вывод данных на страницах сайта

Вывод полученных новостей на страницах сайта осуществляется типовыми компонентами системы "1С-Битрикс: Управление сайтом ASP.NET". Например, можно использовать комплексный компонент Каталог, разместив его на нужной странице и настроив на тип информационного блока Aggregator и на информационный блок ib2.

1С-Битрикс Выведенные анонсы RSS сообщения на странице сайта

Резюме

Система "1С-Битрикс: Управление сайтом ASP.NET" обладает достаточно гибкими возможностями в плане модификаций. Возможно как редактирование самих компонентов системы, их шаблонов, так и использование сторонних файлов, обращающихся к API системы. Успех решения той или иной задачи во многом зависит от уровня подготовки программиста.

Роберт Басыров

Все права защищены. По вопросам использования статьи обращайтесь к администраторам сайта

Короткая ссылка на новость: http://un-ltd.ru/~LV2TY
П Предупреждение (2)
Ж Животные (2)
П Погода (3)
Р Реклама (1)
С Сайты (1)
З Здоровье (1)
М метро (1)
Р Россия (4)
З загадка (1)
Г города (1)
Н Новосибирск (19)
Д День Рождения (1)
И Инопланетяне (0)
Н НЛО (1)
К Космос (4)
П Происшествия (18), Полезное (11), Прочее (772)
Н Новинки (402)
С События (151)