Я работал над реализацией пользовательского RSS-канала в sitecore 6.4. Мое собственное поведение очень ограничено, все, что я фактически хотел, это добавить ссылку на автора (наше поле автора является справочным полем, поэтому мы не можем использовать встроенную атрибуцию автора).
Я переопределил RenderItem()
в классе PublicFeed
, чтобы я мог использовать свою собственную реализацию класса FeedRenderer
(где находится логика автора). Мой подход следует этому шаблону , описанному Джоном Уэстом для добавления вашего собственного поведения рендеринга:
public class MyPUblicFeed: PublicFeed
{
protected override SyndicationItem RenderItem(Item item)
{
Assert.ArgumentNotNull(item, "item");
Control rendererControl = FeedUtil.GetFeedRendering(item);
if (rendererControl == null)
{
return null;
}
using (new ContextItemSwitcher(item))
{
var myRenderer= rendererControl as MyFeedRenderer;
if (myRenderer!= null)
{
myRenderer.Database = SitecoreHelper.CurrentDatabase.Name;
return myRenderer.RenderItem();
}
var renderer = rendererControl as Sitecore.Web.UI.WebControls.FeedRenderer;
if (renderer != null)
{
renderer.Database = SitecoreHelper.CurrentDatabase.Name;
return renderer.RenderItem();
}
}
throw new InvalidOperationException("FeedRenderer rendering must be of Sitecore.Web.UI.WebControls.FeedRenderer type");
}
}
А теперь для моего класса рендеринга:
public class MyFeedRenderer: Sitecore.Web.UI.WebControls.FeedRenderer
{
public override SyndicationItem RenderItem()
{
Item item = base.GetItem();
var syndicationItem = base.RenderItem();
//unfortunately we have to parse params again :(
FeedRenderingParameters feedRenderingParameter = FeedRenderingParameters.Parse(base.Parameters);
AddAuthor(syndicationItem, item, feedRenderingParameter);
return syndicationItem;
}
private static void AddAuthor(SyndicationItem syndicationItem, Item item, FeedRenderingParameters feedRenderingParameter)
{
//clear out authors added by base class
syndicationItem.Authors.Clear();
//logic for adding author here
}
}
все это прекрасно работает, выводит именно то, что я хочу, но элемент кэширования не работает. Я установил флаг cacheable
для самого элемента с временным интервалом 01:00:00
. Это не сработало - если я установил точку останова в любом из вышеперечисленных классов, она срабатывает каждый раз, когда запрашивается фид.
поэтому я попытался включить кэширование на уровне управления, включив кэширование с VaryByData
для рендеринга MyFeedRenderer
. увы это тоже не работает, точка останова срабатывает каждый раз.
Может кто-нибудь дать совет по этому вопросу? документация просто рекомендует включать его на фактическом элементе подачи, а не на уровне рендеринга, но ни один из них не работает для меня. Интересно, что кеширование HTML работает в другом месте - а RSS также помещается в кеш HTML?
Заранее спасибо,
Ник