Sitecore Hints: RSS Feed Bucketed Item Datasource

Posted 06/18/2015 by sean fox

Recently I ran across a request to allow an RSS feed page to use a bucketed item datasource in Sitecore 7.5 (or Sitecore 8), based on a query filtered on a specific template. I looked through a few resources on the topic:

    1.  http://getfishtank.ca/blog/create-rss-feeds-in-sitecore 
    2.  http://www.sitecore.net/learn/blogs/technical-blogs/john-west-sitecore-blog/posts/2014/11/all-about-rss-feeds-with-the-sitecore-aspnet-cms.aspx 

I had a few take aways from Dan Cruikshank’s article about mapping RSS fields. Firstly for the target type of item I wish to use for RSS I need to do a one-time field mapping. I will access the design UI from the “Presentation” section in the “Feeds” tab:



… and then map my fields:

On the RSS Feed template there is an “Items” field, which accepts a path or a query, and is supposed to operate on all descendants of a given path. 

What I found though was that it expects to operate on children of some parent item. Also, supplying a bucket query doesn’t work in this field. Moreover, supplying a bad query actually breaks the RSS Feed with a message similar to “Bad URI Format …”, so based on John West’s suggestion I decided to roll my own Feed Delivery Layout class which the built-in Feed Delivery Layout will inherit. 

So I now had a couple objectives in mind:

    1.  Allow the RSS Feed datasource field to be used normally while … 
    2.  Also implementing a default search for bucketed items inheriting from, in my case “Article” when the datasource is empty or fails to find related articles to  display in the feed

There are also a couple of things I need to track down before I begin:

    1.  Reflect on the Feed Delivery Layout class
    2.  Find the out-of-the-box Feed Delivery Layout page

Setup

First I need to locate the out-of-the-box Feed Delivery Layout and here is my location (and probably yours too):

    1.  ~/sitecore/shell/Applications/Feeds/Layouts/FeedDeliveryLayout.aspx

Then I’ll use ILSpy to hunt down the code and locate the section I need to augment in my custom Feed Delivery Layout class:

Let’s Code! 

There are a few assumptions I’ve made 

    •   I am in a multisite solution, and each site has a featured RSS Feed Page
    •   The ‘Article’ template is re-used across sites
    •   So, I need to craft a query which works across sites
    •   The custom Feed Delivery Layout class will be used now any time the Feed Delivery Layout page is requested, again 
     across sites as this is a shared built-in sitecore control

I will change the inherits attribute to point at my custom class:

    <%@ Page Language="c#" Inherits="Sitecore.Syndication.Web.FeedDeliveryLayout, Sitecore.Kernel" CodePage="65001" %>

    <%@ Page Language="c#" Inherits="Foo.SCExtensions.CustomFeedDeliveryLayout, Foo.SCExtensions" CodePage="65001" %>

I am going to start out with the Method I want to use to retrieve items in my content tree that inherit from ‘Article’. This method will return a string which is what is returned from FeedManager.Render(myfeed).

    1.  From the location of the RSS Feed item, drive up the ancestor tree and find the root, which is an item that inherits from “Home Page”
    2.  Then perform a query against the tree for items inheriting from ‘Article page’, these items could be in buckets
    3.  I am using an ORM Glass.Mapper on this project and so as the result of my query I should have a list of IEnumerable<Article> which I convert over to a list of  IEnumerable<Syndicationitem> to be fed to my feed

private static string TrySetBucketedItemSourceFeed()
{
    // Spin up a feed to use
    SyndicationFeed syndicationFeed = new SyndicationFeed();

    // Declare a string which will hold the output of our feed
    string value = string.Empty;

    // From the current RSS Feed item (page), drive up and find the site root, or start page
    HomePage homeItem =
    Sitecore.Context.Item.Axes.SelectSingleItem<HomePage>("./ancestor-or-self::*[@@templatename = 'Home Page']");

    // If we have a match, proceed
    if (homeItem != null)
    {
        // Setup a query against the tree to fetch articles for our feed
        string query = string.Format("/sitecore/content{0}//*[@@templatename='Article]",
        homeItem.InnerItem.Paths.ContentPath);

        // Perform the query
        IEnumerable<Article> items = Sitecore.Context.Database.SelectItems<Article>(query);

        // Enumerate into an array, suggestion made by Resharper
        IEnumerable<Article> articles = items as IList<Article> ?? items.ToList();

        // If we have articles to work on
        if (articles.Any())
        {
            // Initialize up a list of syndication items for storage
            List<SyndicationItem> syndicationList = new List<SyndicationItem>();

            // Convert the article collection into a list of syndication items having Title, Description, Date, and 
            // Link. ** Note that the “Link” property must be set on the syndication item constructor

            foreach (Article article in articles)
            {
                string title = article.PageTitle;
                string content = article.Description;
                DateTime date = article.PublishedDate ?? DateTime.MinValue;
                Uri uri =
                new Uri(string.Format("{0}://{1}{2}", HttpContext.Current.Request.Url.Scheme,
                HttpContext.Current.Request.Url.Host, Sitecore.Links.LinkManager.GetItemUrl(article.InnerItem)));
                SyndicationItem syndicationItem = new SyndicationItem(title, content, uri);
                if (date != DateTime.MinValue)
                    syndicationItem.PublishDate = date;
                syndicationList.Add(syndicationItem);
            }

            // Add the list to the feed, and render it with the FeedManager to our value for return
            syndicationFeed.Items = syndicationList;
            value = FeedManager.Render(syndicationFeed);
        }
    }
    return value;
}

Next I just need to wire it up in the “try” block:

try
{
    string value = string.Empty;
    PublicFeed publicFeed = FeedManager.GetFeed(item); 
    SyndicationFeed feed = publicFeed.Render();

    // If feeds exist already use this default behavior
    if (feed.Items.Any())
    {
        value = FeedManager.Render(feed);
        Response.Output.Write(value);
    }
    else // Otherwise, use our custom sauce
    {
        value = TrySetBucketedItemSourceFeed();
        Response.Output.Write(value);
    }
}

And that’s it, off to the races. Thank you for reading my article and stay tuned for my next post.

- Sean

Share:

Add your comment

 
 

 

Comments

  • ロレックス レディース レプリカ rar said:
    10/7/2016 10:24 PM

    スーパーコピーブランド 弊社は 販売ルイヴィトン、シャネル(シャネル)、グッチ (グッチ)、エルメス(エルメス)、D&G カバン、コーチ(COACH)のブランドバッグ、財布、 小物、腕時計、靴類などでございます。 弊社は「信用第一」をモットーにお客様にご満足頂けるよう、 発送前には厳しい検査を通じて製品の品質を保証してあげますとともに、 配送の費用も無料とし、品質による返送、交換、さらに返金までも実際 にさせていただきます。 また、従業員一同、親切、丁寧、迅速に対応 させて頂き、ご安心になってお買い物を楽しんでくださるよう精一杯力 を尽くしていくつもりです。 送料は無料です(日本全国)! ご注文を期待しています! 下記の連絡先までお問い合わせください。 是非ご覧ください! ロレックス レディース レプリカ rar http://www.eevance.com/tokei/alangesohne/9a1b020d1187c6b4.html

  • ロレックス デイトジャスト 年代 英語 said:
    10/8/2016 8:18 AM

    2016年人気貴族エルメス コピー安心専門店、 一流ブランドショップ、シャネル コピー、 財布コピー、ベルト信用第一、良い品質、 低価格は私達のち残りの切り札です。 当社の商品は絶対の自信が御座います。 おすすめ人気N品質シリアル付きも有り 付属品完備!送料は無料です(日本全国)! ご注文を期待しています!100%品質保証  満足保。※日本國送料無料、信用第一、 ロレックス デイトジャスト 年代 英語 http://www.bag78.net/brandcopy-l-14.html

  • ロレックス レディース エアキング 2ch said:
    11/2/2016 6:00 AM

    "ネット上でたくさんコピールイヴィトンの財布に関してあって、1つのコピールイヴィトンの財布が欲しいが、しかし必ず買わないでくださいに注意してかばんでなければならなくて、コピールイヴィトンの財布の価格は受けることができるのですが、しかし私達もむだになくしてしまうことはできません。 ルイヴィトンスーパーコピーブランドバッグのルイヴィトンブランドコピー商品販売きっと最高品質ルイヴィトン偽物バッグ(N級品)のルイヴィトンスーパーコピーブランド,ルイヴィトン韓国スーパーコピー,ルイヴィトンマルチカラーバッグは提供いたします。 その上、必ず注意しなければならないのは、コピールイヴィトンのずっと堅持したのは逸品と優良品質の特徴で、仕事は更に専門の職人の手作りから作ります。 だから時にはほぼ取引先のために専門的に注文して作らせたので、このような時の取引先は1年足らずの間のを待たなければなりません。 優雅に女性の魅力のロレックススーパーコピーレディースファッションの腕時計に富を極めて18Kバラの金と精密な鋼の色を互いによく合って、人に反抗しにくいのを持って惑わします。 この時はコピールイヴィトンの財布がいくらでも取れませんでした。 いずれにしても、1つのコピールイヴィトンの財布は絶対に一人の高品位と優雅で厳格な特質のを証明することができます。" ロレックス レディース エアキング 2ch http://www.bestevance.com/rolex/submariner/index.htm

  • ルイ ヴィトン 財布 楽天 said:
    12/28/2016 1:58 PM

    激安、安心、安全にお届けします、安心して買って下さいパネライコピー時計高品質のブランドコピーを超激安な価格で販売しています。 人気商品コピー ブランド通販専門店。 全国送料無料! 当社は2017逸品が満載している好評度業界No.1ブランド コピー激安通販店です 店長お薦めは以下の商品: パネライコピー時計,パネライスーパーコピー,パネライN級品 IWCスーパーコピー,IWC N級品,IWC時計コピー, IWC ポルトギーゼ ルイ ヴィトン 財布 楽天 http://www.bagkakaku.com/tie/2/zhuwen.html

  • ロレックス 10万 said:
    1/4/2017 2:08 AM

    爆安SALEが開催中 ブランドコピー靴通販ショップの爆安SALEが開催中 通販ショップは世界有名なブランドのシューズのスーパーコピー品を激安でお客様に提供しています。 高級の素材と高技術を結び付けて世界最高級のブランドコピー品だけ扱います。 ルイ・ヴィトン靴コピー、コピーシャネルシューズ、ミュウミュウサンダルコピー 今、いろいろブランド コピー新品が登場します。 ぜひおすすめです。 ロレックス 10万 http://www.okakaku.com/brand-11-copy-0.html

  • シャネル チェーンウォレット ヨンア said:
    2/3/2017 11:53 AM

    オメガ コピー - オメガ コピー ★2017最高等級新しい商品大量入荷! ■在庫情報随時更新!(*^-^*) ■信用第一、良い品質、低価格は。 ★★超人気質屋★★ 販売ルイヴィトン、グッチ、シャネル、エルメス、コーチ、 ボッテガ・ヴェネタ、バリー、バーバリーなどのブランドバッグ、財布、アクセサリ、 時計、靴、などでございます。 製品はブランド品を中心としてやっており、 主なお輸出先は欧米、日本、韓国などでございます。 弊社は「信用第一」をモットーにお客様にご満足頂けるよう、 発送前には厳しい検査を通じて製品の品質を保証してあげますとともに、 配送の費用も無料とし、品質による返送、交換、さらに返金までも実際にさせていただきます。 また、従業員一同、親切、丁寧、迅速に対応させて頂き、 ご安心になってお買い物を楽しんでくださるよう精一杯力を尽くしていくつもりです。 弊社の製品とほかに関して詳しくは、ホームページを一度ご覧になって シャネル チェーンウォレット ヨンア http://www.msnbrand.com/brand-copy-IP-13.html

  • シャネル プードゥル フェイスパウダー おすすめ said:
    2/4/2017 11:56 AM

    N級品 スーパーコピーブランド時計専門店 当店は主に経営する商品:ロレックスコピー時計、シャネルコピー時計、オメガコピー時計、ウブロコピー時計など。 当店の商品は絶対の自信が御座います。 各種海外有名ブランド品を豊富に取り揃え、 しかもお客様を第一と考えて、驚きの低価格で提供しております。 高品質な商品を超格安価格で、安心、迅速、確実。 商品の到着は入金から最速3日で来ます、遅くとも入金後5日程度で確実に届きますよ。 送料は無料です(日本全国) 4-6日にきっと引き渡す。 税関没収する商品は再度無料で発送します。 シャネル プードゥル フェイスパウダー おすすめ http://www.brandiwc.com/brand-35-copy-0.html

  • ジャガールクルト said:
    3/7/2017 10:13 AM

    新舗 新型-大注目! ★ 腕時計、バッグ、財布、ベルト、ジュエリー、コピーブランド ★経営理念: 1.最も合理的な価格で商品を消費者に提供致します. 2.弊社の商品品数大目で、商品は安めです]!★商品現物写真★ 3.数量制限無し、一個の注文も、OKです. 4.1個も1万個も問わず、誠心誠意対応します. 5.不良品の場合、弊社が無償で交換します. 以上宜しくお願いします。 不明点、疑問点等があれば、ご遠慮なく言って下さい. 以上 よろしくお願いいたします。 ジャガールクルト http://www.giginza.com

  • ロレックス 偽物 said:
    3/25/2017 10:05 PM

    大SALEが開催中 ◆ブラントコピー人気通販店の大SALEが開催中◆ 弊社は長年の豊富な経験と実績を持ち、 ブラントブランドコピー品の完壁な品質を維持するために、 一流の素材を選択し、精巧な作り方でまるで本物のようなな製品を造ります。 また、お客様のご注文商品を責任を持ってお届けいたします。 シャネルコピー、ルイヴィトンブランドコピー、プラダコピー、ボッテガ・ヴェネタコピーやグッチコピー

  • カルティエ サントス said:
    6/12/2017 1:30 AM

    ※―※―※ブランド靴人気大活躍※―※―※ 老店開業顧客は至上N品物の専門の商店 送★料無★料★〓 ■2017年■最新作品も登場。 ┣カルティエ ┣クロムハーツ ┣ロレックス ┗ヴィトンコピー ●ブランド服●ブランド靴●ブランドバッグ● ◆高品質。国際速達郵便発送。安心 。最低価格保証。 _|☆|_|送|_ |料|_|☆|無|_|料_|☆|_|( ^_^ )(日本全国) ◆歓迎光臨★送料無料 ◆ご安心購入くださいませ。 ◆ご注文を待ちしております ◆よろしくお願いいたします_(._.)_

  • ルイヴィトンコピー財布 said:
    7/1/2017 3:06 AM

    ブランド激安市場大特価 当店には、ルイヴィトン、シャネル、グッチ、コーチ、ロレックス、プラダ、 ディオール、ブルガリ財布 その他小物等、 買う多いです、恵みの多いです、 一回注文5件以上、贈呈ルイヴィトンキーケース1個 注文は期待しています。。。 各種海外有名ブランド品を豊富に取り揃え、しかもお客様を第一と考えて、驚きの低価格で提供しております ■スタイルが多い、品質がよい、価格が低い! ■ 送料無料(日本全国) ご注文を期待しています! ■信用第一、良い品質、低価格は ■当社の商品は絶対の自信が御座います。 激安、安心、安全にお届けします.品数豊富な商 商品数も大幅に増え、品質も大自信です100%品質保証! 満足保障!リピーター率100%!

  • バーキンバッグコピー品 said:
    7/23/2017 4:29 AM

    ブランドコピーブランド激安ショッピングモール! ブランドコピー品 ごとにぱっと見て全然違わないほどの外観を持ち、手触りも同じである。 当店ブランドコピーブランド商品とともに、高品質と安心をお届けいたします!

  • ジャガールクルト最高品質時計 said:
    8/16/2017 1:02 AM

    エルメスコピー - エルメスコピー スーパーコピーブランド・エルメスコピー、グッチコピー、エルメスコピー・ブランド財布・ブランドバッグ・ブランド財布N級品販売通販。 スーパーコピーブランド販売専門ショップ。 エルメス財布とバッグヴィトンはずっと一流を追求しています。 100%満足保証かつて値段が激安いです。 お買い得で是非お楽しみください。 エルメス財布カタログ:当店はエルメス財布コピー代引き専門店です。 ジャガールクルト最高品質時計 http://www.kopii.net/products/p2/6/index.htm

  • オメガ時計 コピー said:
    11/5/2017 8:35 AM

    迅速な対応と大変丁寧な梱包をしていただきました。 スタッフさんの手書きのお手紙も添えて頂き、とても好感を持ちました。 又、ご縁がありましたら、宜しくお願いします。

  • ロレックスコピー said:
    11/28/2017 11:25 PM

    リーマン・ショックが過ぎ、米国株はどんどんと上昇してしまい、買い時を逃した人も多いはず。 100年に一度と言われたリーマン・ショックですから当然ビビって底値なんかでは買えないわけです。 指をくわえて押し目待ちに押し目なしの状態だった人も多いことでしょう。 しかし、ようやく2017年にチャンスがやって来ました。

Archive

Syndication