Приветствую, Петр!
В ближайшем обновлении модуля блогов добавится много нового функционала. А именно:
- Визуальный редактор для создания записей
- Загрузка картинок
- Вставка видео и подкастов
- Экспорт записей и комментариев в RSS
- [B]Зеркалирование записей из другого блога[/B]
- Теги
- И много другое
[QUOTE]Петр Диденко пишет: Вопрос: я правильно понимаю, что мне надо идти и писать ручную импортилку? [/QUOTE]
Кстати, это не так сложно сделать. В нашем продукте есть механизм выполнения произвольного кода по расписанию. Называется этот механизм - Агенты. Вот примерный код такого агента:
[CODE]
using System;
using System.Collections.Generic;
using System.Web;
using System.Text.RegularExpressions;
using Bitrix.Services.Text;
using System.Text;
using Bitrix.Services;
using Bitrix.DataTypes;
using Bitrix.Blog;
using Bitrix.DataLayer;
using System.Data;
using System.Xml;
using Bitrix;
namespace KIP
{
public class BlogRSS
{
public static string RssChannelUrl = @"http://kippie.livejournal.com/data/rss";
public static void ImportBlog(BXBlog blog)
{
if (blog == null)
{
BXLogService.LogAll("Агент импорта блога", "Блог не найден", BXLogMessageType.Error);
return;
}
XmlDocument rssDoc = null;
try
{
XmlReader reader = XmlReader.Create(RssChannelUrl);
rssDoc = new XmlDocument();
rssDoc.Load(reader);
}
catch (Exception ex)
{
BXLogService.LogAll(ex, BXLogMessageType.Error, "Агент импорта блога. Невозможно загрузить RSS.");
return;
}
XmlNodeList items = rssDoc.SelectNodes("/rss/channel/item");
foreach (XmlNode item in items)
{
string guid = null;
string title = null;
string content = null;
XmlNode guidNode = item.SelectSingleNode("guid");
XmlNode titleNode = item.SelectSingleNode("title");
XmlNode descNode = item.SelectSingleNode("description");
if (guidNode != null)
guid = guidNode.InnerText;
if (titleNode != null)
title = titleNode.InnerText;
if (descNode != null)
content = descNode.InnerText;
if (BXStringUtility.IsNullOrTrimEmpty(guid) || BXStringUtility.IsNullOrTrimEmpty(title) || BXStringUtility.IsNullOrTrimEmpty(content))
continue;
XmlNode dateNode = item.SelectSingleNode("pubDate");
DateTime pubDate;
if (dateNode == null || !DateTime.TryParse(dateNode.InnerText, out pubDate))
pubDate = DateTime.Now;
string link = null;
XmlNode linkNode = item.SelectSingleNode("link");
if (linkNode != null)
link = linkNode.InnerText;
StringBuilder tags = new StringBuilder();
XmlNodeList categories = item.SelectNodes("category");
foreach (XmlNode category in categories)
{
if (!BXStringUtility.IsNullOrTrimEmpty(category.InnerText))
{
if (tags.Length > 0)
tags.Append(", ");
tags.Append(category.InnerText);
}
}
string hashCode = guid.GetHashCode().ToString();
BXBlogPostCollection posts = BXBlogPost.GetList(
new BXFilter(
new BXFilterItem(BXBlogPost.Fields.Blog.Id, BXSqlFilterOperators.Equal, blog.Id),
new BXFilterItem(BXBlogPost.Fields.XmlId, BXSqlFilterOperators.Equal, hashCode)
),
null,
null,
new BXQueryParams(new BXPagingOptions(0, 1))
);
BXBlogPost post = posts.Count > 0 ? posts[0] : new BXBlogPost();
if (post.IsNew)
{
post.AuthorId = blog.OwnerId;
post.BlogId = blog.Id;
post.AuthorIP = "";
post.DateCreated = pubDate;
post.IsPublished = true;
post.XmlId = hashCode;
}
post.Tags = tags.ToString();
post.DatePublished = pubDate;
post.NotifyOfComments = false;
post.Title = title;
post.ContentType = BXBlogPostContentType.FilteredHtml;
post.Content = content;
post.Save();
}
}
}
public class BlogRSSExecutor : IBXAgentExecutor
{
public bool Execute(BXSchedulerAgent agent, BXParamsBag<object> parameters)
{
//kip - символический идентификатор блога (или адрес блога)
BXBlog blog = BXBlog.GetBySlug("kip");
try
{
BlogRSS.ImportBlog(blog);
}
catch { }
return true;
}
}
}
[/CODE]
Кидаем этот класс в папку AppCode и далее регистрируем агент в системе следующим кодом:
[CODE]
BXSchedulerAgent agent = BXSchedulerAgent.GetByName("KIP.ImportBlog"); //KIP.ImportBlog - произвольное имя агента
if (agent == null)
agent = new BXSchedulerAgent("KIP.ImportBlog");
agent.Active = true;
agent.Periodic = false;
agent.Period = TimeSpan.FromDays(1); //период запуска каждые сутки
agent.StartTime = DateTime.Now;
agent.SetClassNameAndAssembly(typeof(BlogRSSExecutor));
agent.Save();
[/CODE]
Все :)