Export Events to CSV
I am attempting to develop an export routine that creates a comma delimited file of all the events within Sitefinity from the backend site. The only suggestions I've found within the forum is this -- http://www.sitefinity.com/devnet/forums/sitefinity-3-x/developing-with-sitefinity/export-to-excel-for-news-letter-subscribers.aspx -- but I'm not having any luck adapting this for my purposes.
How can I accomplish the exportation of events?
I modified the code for exporting subscribers from the aforementioned link so as to export the events instead...
01.public void WriteToCSV()02.03. EventsManager manager = EventsManager.GetManager();04. IList<Event> sub = new List<Event>();05. IList allevents = manager.GetEvents();06. foreach (Event s in allevents)07. 08. sub.Add(s);09. 10. 11. string attachment = "attachment; filename=Events.csv";12. HttpContext.Current.Response.Clear();13. HttpContext.Current.Response.ClearHeaders();14. HttpContext.Current.Response.ClearContent();15. HttpContext.Current.Response.AddHeader("content-disposition", attachment);16. HttpContext.Current.Response.ContentType = "text/csv";17. HttpContext.Current.Response.AddHeader("Pragma", "public");18. 19. WriteColumns();20. 21. foreach (Event eventItems in sub)22. 23. WriteUserInfo(eventItems);24. 25. HttpContext.Current.Response.End();26.27. 28.private static void WriteColumns()29.30. string columnNames = "Title, EventStart, EventEnd";31. HttpContext.Current.Response.Write(columnNames);32. HttpContext.Current.Response.Write(Environment.NewLine);33.34. 35.private static void WriteUserInfo(Event lettersubscriber)36.37. StringBuilder stringBuilder = new StringBuilder();38. AddComma(lettersubscriber.Title, stringBuilder);39. AddComma(lettersubscriber.EventStart.ToString(), stringBuilder);40. AddComma(lettersubscriber.EventEnd.ToString(), stringBuilder);41. HttpContext.Current.Response.Write(stringBuilder.ToString());42. HttpContext.Current.Response.Write(Environment.NewLine);43.44. 45.private static void AddComma(string value, StringBuilder stringBuilder)46.47. stringBuilder.Append(value.Replace(',', ' '));48. stringBuilder.Append(", ");49.I was able to resolve my own issue... The issue was that I didn't cast line #5 "ToList"... I made the following change, which fixed everything...
IList allevents = manager.GetEvents().ToList();I've simplified my code, and resolved most all major issues, but I have one remaining issue... When I create the export file, all the event entries are doubled, so if I have 6 events in Sitefinity, my code outputs 12 events.
Here is my control...
<%@ Control Language="c#" Debug="true" AutoEventWireup="true" CodeFile="ExportEvents.ascx.cs" Inherits="ExportEvents" %><asp:Button ID="Button1" runat="server" Text="Button" OnClick="WriteToCSV" />using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text;using Telerik.Sitefinity;using Telerik.Sitefinity.Modules.Events;using Telerik.Sitefinity.Events.Model;using System.Collections;using Telerik.Sitefinity.Lists.Model;using Telerik.Sitefinity.GenericContent.Model;using Telerik.OpenAccess;using Telerik.Sitefinity.Taxonomies;public partial class ExportEvents : System.Web.UI.UserControl protected void Page_Load(object sender, EventArgs e) public void WriteToCSV(object sender, EventArgs e) EventsManager manager = EventsManager.GetManager(); IList allevents = manager.GetEvents().ToList(); string attachment = "attachment; filename=Events.csv"; HttpContext.Current.Response.Clear(); HttpContext.Current.Response.ClearHeaders(); HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.AddHeader("content-disposition", attachment); HttpContext.Current.Response.ContentType = "text/csv"; HttpContext.Current.Response.AddHeader("Pragma", "public"); WriteColumns(); foreach (Event s in allevents) WriteUserInfo(s); HttpContext.Current.Response.End(); private static void WriteColumns() string columnNames = "\"Subject\",\"Start Date\",\"Start Time\",\"End Date\",\"End Time\",\"All day event\",\"Categories\",\"Description\",\"Location\",\"Last Modified\""; HttpContext.Current.Response.Write(columnNames); HttpContext.Current.Response.Write(Environment.NewLine); private static void WriteUserInfo(Event eItems) StringBuilder stringBuilder = new StringBuilder(); AddComma("\"" + eItems.Title + "\"", stringBuilder); //Subject AddComma("\"" + eItems.EventStart.ToString("M/dd/yyyy") + "\"", stringBuilder); //Start Date AddComma("\"" + eItems.EventStart.ToString("h:mm tt") + "\"", stringBuilder); //Start Time AddComma("\"" + eItems.EventEnd.Value.ToString("M/dd/yyyy") + "\"", stringBuilder); //End Date AddComma("\"" + eItems.EventEnd.Value.ToString("h:mm tt") + "\"", stringBuilder); //End Time AddComma("\"" + "true" + "\"", stringBuilder); //All day event AddComma("\"" + eItems.Content.ToString() + "\"", stringBuilder); //Categories AddComma("\"" + eItems.Description.ToString() + "\"", stringBuilder); //Description string strLocation = (eItems.City.ToString() + ", " + eItems.State.ToString()); AddComma("\"" + strLocation + "\"", stringBuilder); //Location AddComma("\"" + eItems.LastModified.ToString("M/dd/yyyy") + "\"", stringBuilder); //Last Modified HttpContext.Current.Response.Write(stringBuilder.ToString()); HttpContext.Current.Response.Write(Environment.NewLine); private static void AddComma(string value, StringBuilder stringBuilder) stringBuilder.Append(value.Replace(',', ',')); stringBuilder.Append(","); "Subject","Start Date","Start Time","End Date","End Time","All day event","Categories","Description","Location","Last Modified""Spring Fling","4/23/2012","5:00 AM","4/27/2012","5:00 AM","true","<p>Spring Fling Week</p>","",", ","10/06/2011","Bongo Ball Mania","4/23/2012","4:19 PM","4/23/2012","8:00 PM","true","<p>10am - 4pm<br />Gym</p>","",", ","10/07/2011","TEST #1","12/12/2011","5:10 PM","12/12/2011","9:00 PM","true","<p>Test of Calendar #1</p>","",", ","10/10/2011","Bongo Ball Mania","4/23/2012","4:19 PM","4/23/2012","8:00 PM","true","<p>10am - 4pm<br />Gym</p>","",", ","10/07/2011","Blood Drive","3/29/2012","4:00 PM","3/29/2012","11:00 PM","true","<p>March 29th 2012<br />10:00 am - 3:00 pm<br />Gym</p>","",", ","10/11/2011","TEST #1","12/12/2011","5:10 PM","12/12/2011","9:00 PM","true","<p>Test of Calendar #1</p>","",", ","10/10/2011","Blood Drive","3/29/2012","4:00 PM","3/29/2012","11:00 PM","true","<p>March 29th 2012<br />10:00 am - 3:00 pm<br />Gym</p>","",", ","10/11/2011","Spring Fling","4/23/2012","5:00 AM","4/27/2012","5:00 AM","true","<p>Spring Fling Week</p>","",", ","10/06/2011",Have you tried using FluentAPI to get the events instead of the manager object? I think it has a method or something .ThatArePublished? Like App.WorkWith().Events().ThatArePublished()? ...or something like that...I don't have a copy in front of me
**Edit** I think perhaps that might be becasue its giving you both the published and draft items (guess)
I can't seem to find the method .ThatArePublished()
Appears to be just "Publihed()" :) (notice the typo)
App.WorkWith().Events().Where(ci => ci.Status == Telerik.Sitefinity.GenericContent.Model.ContentLifecycleStatus.Live) .Publihed() .Get()Well, it certainly won't be .Publihed(), but .Published() doesn't seem to work either. In fact when I type the code just as you've written, except for the correct word "published" instead, I still receive the error "does not contain a definition for 'Published'"... but this seems to work...
IList allevents = App.WorkWith().Events().Get().Where(ci => ci.Status == Telerik.Sitefinity.GenericContent.Model.ContentLifecycleStatus.Live).ToList();No...it most certainly IS "Publihed"
This is the code I have for a custom control which populates a RadCalendar with published events
private IList<Event> _events = null;public IList<Event> Events get if (_events == null) _events = App.WorkWith().Events() .Where(ci => ci.GetValue<IList<Guid>>("Category").Contains(new Guid("8138087D-C9FF-4BA7-AEBC-97BABA1D935C")) && ci.Status == Telerik.Sitefinity.GenericContent.Model.ContentLifecycleStatus.Live) .Publihed() .Get().ToList(); return _events; Just to prove it, here's the DLL loaded into just decompile :)