In almost all the projects I have done in past year or so, a common requirement among the clients have been that they want the ability to add Twitter Pods on pages and also have the ability to change the account name based upon their campaign or department.
For the purpose of the post, I will be using Sitecore CMS and LINQ To Twitter library to show how simple it is to create a Twitter Pod/module.
Let suppose we only want to display top tweet from an account/twitter handle, which is define in the Sitecore CMS
Steps:
1. Create a data template property in the CMS as ‘Twitter Account Name’ or whatever you like
2. Create a standard .NET User Control and lets call it ‘TwitterPod.ascx’
3. Reference LINQ to Twitter library in your project (download it from here http://linqtotwitter.codeplex.com/ and also read its documentation)
4. As per Twitter API 2.0 you need to get Consumer Key, Consumer Secret, Access Token, Access Token Secret values from http://dev.twitter.com for any applications that you are creating. Log-in there and follow the steps to get these values.
5. Add these Twitter API 2.0 values to web.config
6. Let suppose this is your .ascx control markup
<div><asp:HyperLink ID="HyperLinkFollowAccount" runat="server" Target="_blank"></asp:HyperLink></div> <div class="twitter"> <asp:HyperLink ID="HyperLinkFirstTweet" runat="server"> <p><asp:Literal ID="LiteralFirstTweet" runat="server"></asp:Literal> <p>Posted <asp:Literal ID="LiteralFirstPostedTime" runat="server"></asp:Literal></p> </asp:HyperLink> </div>
7. Add these ‘static strings’ to your User Control class
private static string ConsumerSecret { get { return WebConfigurationManager.AppSettings["ConsumerSecret"]; } } private static string ConsumerKey { get { return WebConfigurationManager.AppSettings["ConsumerKey"]; } } private static string AccessToken { get { return WebConfigurationManager.AppSettings["AccessToken"]; } } private static string AccessTokenSecret { get { return WebConfigurationManager.AppSettings["AccessTokenSecret"]; } }
8. Twitter API 2.0 requires OAuth Authentication, to get that add this to Page_Load of your User Control
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { try { var auth = new SingleUserAuthorizer { Credentials = new InMemoryCredentials { ConsumerKey = ConsumerKey, ConsumerSecret = ConsumerSecret, OAuthToken = AccessToken, AccessToken = AccessTokenSecret } }; using (var twitterCtx = new TwitterContext(auth)) { LoadTwitterFeeds(twitterCtx); } } catch(Exception ex) { Sitecore.Diagnostics.Log.Error(ex.Message, this); } } }
9. LoadTwitterFeeds(twitterCtx) is your custom function where you can add your logic of getting tweets via Twitter API 2.0 and displaying them
10.
private void LoadTwitterFeeds(TwitterContext service) { try { string accountName = Sitecore.Context.Item["Twitter Account Name"] as string; var tweets = (from tweet in service.Status where tweet.ScreenName == accountName && tweet.Count == 1 && tweet.ExcludeReplies == true && tweet.IncludeRetweets == true && tweet.Type == StatusType.User select tweet).FirstOrDefault(); if (tweets != null) { HyperLinkFollowAccount.NavigateUrl = "http://twitter.com/" + accountName.Replace("@", ""); HyperLinkFollowAccount.Text = "Follow " + accountName + " on Twitter"; LiteralFirstTweet.Text = tweets.Text; LiteralFirstPostedTime.Text = tweets.CreatedAt.ToString(); HyperLinkFirstTweet.NavigateUrl = "https://twitter.com/" + tweets.User.Identifier.ScreenName + "/status/" + tweets.StatusID.ToString();} catch (Exception ex) { Sitecore.Diagnostics.Log.Error(ex.Message, this); } }
11. Create a Sublayout for this User Control and add it to the Sitecore Layouts.
Note: You can also pass in the ‘Twitter Account Name’ as a parameter of the SubLayout
Note++: Umbraco and Episerver CMS can also use the same code with different CMS based API.
Thanks
Hey! I’ve just inherited an Umbraco project where LinqToTwitter is leveraged and I am getting the following YSOD error when accessing the CMS if LinqToTwitter.dll is in the /bin directory:
Could not load file or assembly ‘System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
If I remove the DLL then the error goes away and I am able to access the CMS but then of course I don’t get the mentions that the custom usercontrol writes to the page. Any ideas on what might cause this apparent MVC version conflict?
Thanks,
Garrett