Set the PublishedStatus property to PagePublishedStatus.Ignore
Edit: You may have to set this property from code, if it is not exposed by the webcontrol
Yeah, from code it is. I thought I'd tried that one the other day but it looks like it works fine. Thanks!
A follow up question on that one: is it possible to order a page list by two parameters? I'd like to first order them by published/expired and then by name.
Not as easily. Either attach an event handler to the Filter event and reorder the pages there, or collect the pages yourself, sort them and put them in PageDataCollection which you use as DataSource for the PageList instead of setting the PageLink property.
Hmm. I'll have to see how I'm going to approach that one. It's a bit further down the road so I guess I'll get back to you on that one... ;)
Thanks a lot!
LINQ is your friend here. Freehand code for an eventhandler:
var sorted = e.Pages.OrderBy(p => p["Property1"] as string).ThenBy(p => p["Property2"] as string);
e.Pages = new PageDataCollection(sorted);
You'll of course have to adjust for the types of properties etc so it sorts on something interesting. And I'm not sure if e.Pages is read/write, you might have to clear it and loop over sorted (do ToList() on it before clearing e.Pages!) and add the pages one by one.
Yeah, you're right about LINQ. I never thought about that one. I'll look into it tomorrow or in the beginning of next week. Thanks again!
Like you said, e.Pages is read only. However, wouldn't it be possible to just set the new PageDataCollection as a DataSource och the PageList and bind it?
Absolutely, it's a matter of taste. Using getchildren, sorting, filtering and then setting DataSource gives you full control from codebehind, while adding a filter handler to the webcontrol, setting the pagelink and letting it bind itself gives you more flexibility of changing the markup to change behaviour of the list (for example changing the PageLinkProperty property or remove a filter/sort) without recompiling.
Edit: For the e.Pages you can do like this, if someone reading this didn't already gather that:
// Using ToList makes sure the Linq is executed and no longer dependent on e.Pages which will be cleared
var sorted = e.Pages.OrderBy(p => p["Property1"] as string).ThenBy(p => p["Property2"] as string).ToList();
// Clear page collection and re-add in sorted order
e.Pages.Clear();
foreach (var p in sorted)
{
e.Pages.Add(p);
}
That seems to work! Any ideas on how to make them sort by published first and expired last? I'm a total noob when it comes to LINQ. In SQL I did this by converting the expiration date to a bool and making them false if they had expired and then sorted on those first and name after that.
Not entirely sure what you want to do, but something like this perhaps:
// Filter out pages not yet published
var pages = ePages.Where(p => p.StartPublish < DateTime.Now);
// Order by publish date (time of day ignored, newest first), expired pages last (no special order),
// then by name if on same date
pages =
pages.OrderByDescending(p => (p.StopPublish < DateTime.Now) ? p.StartPublish.Date : DateTime.MaxValue)
.ThenBy(p => p.PageName);
// Execute
pages = pages.ToList();
e.Pages.Clear();
foreach (var page in pages)
{
e.Pages.Add(page);
}
That did exactly what I wanted. Thank you!
Sorry to say there is one more problem. Like I said earlier the PagePublishedStatus.Ignore didn't work for me when I tried it last week and as I've tried out some different code today and yesterday it has worked sometimes while not other. Turns out the only show when I'm logged into the site (an admin account). Any way around this? I need them to work for every visitor.
Try setting the RequiredAccess property too, to AccessLevel.NoAccess. Beware that you will also include published pages that the user doesn't have access to. Maybe then it's just simpler to use the GetChildren / DataSource method because you have to do so much of your own logic.
Actually, you're drifting futher away from the intended use of things, by bypassing so many access rights features. Why do you want to show expired pages? If you want to hide them from some other list you could add your own "Expire from main list" DateTime property and just filter on that in your other list instead of messing with the system expiry logic?
That did the trick. Again, thank you!
I know Im drifting away from the general use of things but I think this is the best way to do it. In short we have a database where our customers pay for there own page on our site. Ones it's expired the page should be removed and only added to the "non-paying" customers. Sort of like the concept of Eniro. I thought that if the pages didn't expire they would still be in our sitemap and be reachable from other places than these lists (e.g. Google and our own page search). There is no worries on this page that a NoAccess would give an unwanted visitor access to something that doesn't concern them.
Short question: how can I include expired pages in a page list?