Fun with the Mapped Page Provider

by: Allan Thræn

Here’s two more small code samples I did in less than 30 min. based on the Mapped Page Provider.

 

Filesystem Page Provider

This provider will expose folder on the file-system as pages in EPiServer CMS 5 R2.

public class FileProvider : MappedPageProvider
{
 
    private string rootFolder;
 
    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {
        base.Initialize(name, config);
        rootFolder = config["rootFolder"];
    }
 
    protected override List<string> GetRootChildren()
    {
        return Directory.GetFileSystemEntries(rootFolder).ToList();
    }
 
    protected override List<string> GetChildren(string Key)
    {
        if (Directory.Exists(Key))
        {
            return Directory.GetFileSystemEntries(Key).ToList();
        }
        else return new List<string>();
    }
 
    protected override EPiServer.Core.PageData GetPage(string Key)
    {
        PageData pd = new PageData();
        string parentK = Path.GetDirectoryName(Key);
        if (parentK == rootFolder) parentK = null;
        FileSystemInfo fsi;
        if (Directory.Exists(Key)) fsi = new DirectoryInfo(Key);
        else fsi = new FileInfo(Key);
        base.InitializePageData(pd, Key, Path.GetFileNameWithoutExtension(Key), parentK);
        SetPageStatus(pd, VersionStatus.Published);
        if (File.Exists(Key) && (Path.GetExtension(Key).ToLower().EndsWith("txt")))
        {
            StreamReader sr = File.OpenText(Key);
            string s = sr.ReadToEnd();
            pd.SetValue("MainBody","<pre>"+ s+"</pre>");
            sr.Close();
        } else  pd.SetValue("MainBody", "Creation time: " + fsi.CreationTime.ToString() + "<br/>Last Access Time: " + fsi.LastAccessTime.ToString());
        return pd;
    }
 
    protected override string GetPageType(string Key)
    {
        return "[Public] Standard page";
    }

It takes a “rootFolder” from web.config, and shows all files and folders below that. As a unique key it uses the path to the folder/file – and it simply uses the filename without extension as a PageName.

If a file is a .txt file, the contents will be put into the MainBody property – otherwise some basic file/directory info like creation time and last access time is shown there.

This version doesn’t support modifying or changing files – but it would be relatively easy to implement. Web.config has these registration lines:

<pageProvider>
  <providers>
    <add name="File" type="EPiServer.Templates.PageProvider.FileProvider,EPiServer.Templates.Public" entryPoint="28" rootFolder="d:\temp"/>
  </providers>
</pageProvider>

And of course the NETWORK_SERVICE user has read access to that part of my harddisk.

 

 

EPiServer Profile Page Provider

Another idea I had was to use the EPiServerProfiles to create “User Profile pages”. Now, that’s also fairly easy:

public class ProfileProvider : MappedPageProvider
 {
     protected override List<string> GetRootChildren()
     {
         List<string> l = new List<string>();
         foreach (MembershipUser u in Membership.GetAllUsers())
         {
             l.Add(u.UserName);
         }
         return l;
     }
 
     protected override List<string> GetChildren(string Key)
     {
         return new List<string>();
     }
 
     protected override void SetCacheSettings(PageData page, CacheSettings cacheSettings)
     {
         base.SetCacheSettings(page, cacheSettings);
         cacheSettings.CancelCaching = true;
     }
 
 
     protected override EPiServer.Core.PageData GetPage(string Key)
     {
         PageData pd = new PageData();
         EPiServerProfile ep=EPiServerProfile.Get(Key);
         base.InitializePageData(pd, Key, ep.DisplayName, null);
         SetPageStatus(pd, VersionStatus.Published);
         pd.SetValue("MainBody", ep.Email);
         return pd;
     }
 
     protected override string GetPageType(string Key)
     {
         return "[Public] Standard page";
     }
 }

This time, we only have one level to worry about – the root. I suppose I could have organized the profiles based on their roles – but anyway – this is a 5 min demo.

Unique key is the username. MainBody is set to the users email address – but could be any setting stored in the profile. Web.config registration is so plain and simple that there’s no reason to show it here.

20 January 2009


Comments

Post a comment    
User verification Image for user verification  
Allan Thræn

About me

I am a product manager @ EPiServer, with a passion for the more geeky side of things. My technical interests are typically focused around user problems, user experience,  search, information management, artificial intelligence and  personalization

On top of this blog I have the blog Allan On Technology and I often crosspost.

DISCLAIMER: Unless otherwise stated in the posts, this blog expresses my personal opinions, experiments and views, not necessarilly the views of EPiServer AB.

 345 page views this week.

 

 

Syndications


Archive


Tag cloud

EPiTrace logger