Summarize number of pages by page type

An edi­tor nee­ded infor­ma­tion about the num­ber pages for each page type on their site.

The following simp­le code will retri­e­ve all pages below the start page, group them by their page type name, and then count how many of each page type the­re is. It’s pro­bably much, *much* fas­ter to this via SQL, but I was fee­ling a bit lazy and did it this way ins­te­ad:

var result = DataFactory.Instance.GetDescendents(PageReference.StartPage)
	.Select(DataFactory.Instance.GetPage)
	.OrderBy(page => page.PageTypeName)
	.GroupBy(page => page.PageTypeName)
	.Select(group => new { PageType = group.Key, Count = group.Count() })
	.ToList();

PinIt-button

A cli­ent of mine wan­ted to add PinIt sup­port for parts of their web site, main­ly their user com­mu­ni­ty image gal­le­ri­es.

I made a quick solu­tion for them, copi­ed here in case some­o­ne else needs somet­hing simi­la­re, or just wants to com­plain about my pro­gram­ming tech­ni­ques 🙂 Or pre­fe­rably make sug­ges­tions for impro­ve­ments…

To use it, regis­ter the name­spa­ce in eit­her your web.config, in /configuration/system.web/pages/controls:

<add tagPrefix="Controls" namespace="Paddy.Web.UI.HtmlControls" assembly="name-of-you-dll-file" />

Or, you can regis­ter it at the top of your .aspx file, as follows:

<%@Register TagPrefix="Controls" Namespace="Paddy.Web.UI.HtmlControls" %>

Then use it on the page like this:

<Controls:PinIt ID="ctlPinIt" runat="server" CountLayout="Horizontal" Url="Complete url" Media="Complete url to the image" Description="Optional description" />

Ple­a­se note that the con­tents of the Url and Media pro­per­ti­es needs to be ful­ly qua­li­fi­ed!

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;

namespace Paddy.Web.UI.HtmlControls
{
	public class PinIt : HtmlControl
	{
		private const string PinItscriptinclude = "PinItScriptInclude";

		#region Properties

		public CountLayouts CountLayout { get; set; }
		public string Description { get; set; }
		public string Url { get; set; }
		public string Media { get; set; }

		#endregion

		public PinIt()
			: base("a")
		{
			CountLayout = CountLayouts.Horizontal;
		}

		protected override void Render(HtmlTextWriter writer)
		{
			if (string.IsNullOrWhiteSpace(Url) || string.IsNullOrWhiteSpace(Media))
			{
				return;
			}

			// Register the Pinterest script
			var type = GetType();
			if (!Page.ClientScript.IsStartupScriptRegistered(type, PinItscriptinclude))
			{
				Page.ClientScript.RegisterStartupScript(type, PinItscriptinclude,
					@"<script type=""text/javascript"" src=""//assets.pinterest.com/js/pinit.js""></script>", false);
			}

			// Build the tag.
			writer.WriteBeginTag(base.TagName);
			RenderAttributes(writer);
			writer.Write(HtmlTextWriter.TagRightChar);

			// Render the image
			writer.WriteBeginTag("img");
			writer.WriteAttribute("src", "//assets.pinterest.com/images/PinExt.png");
			writer.WriteAttribute("alt", "Pin it");
			writer.WriteAttribute("title", "Pin it");
			writer.WriteAttribute("border", "0");
			writer.Write(HtmlTextWriter.SelfClosingTagEnd);

			writer.WriteEndTag(base.TagName);
		}

		protected override void RenderAttributes(HtmlTextWriter writer)
		{
			var parameters = new Dictionary<string, string> { { "url", Url }, { "media", Media } };
			if (!string.IsNullOrWhiteSpace(Description))
			{
				parameters.Add("description", Description);
			}

			Attributes.Add("href", "http://pinterest.com/pin/create/button/" + ToQueryString(parameters));
			Attributes.Add("class", "pin-it-button");
			Attributes.Add("count-layout", CountLayout.ToString().ToLower());

			base.RenderAttributes(writer);
		}

		private static string ToQueryString(IEnumerable<KeyValuePair<string, string>> dictionary)
		{
			var result = dictionary.Aggregate(
				new StringBuilder("?"),
				(builder, pair) => builder.AppendFormat("{0}={1}&", pair.Key, HttpUtility.UrlEncode(pair.Value)),
				builder => builder.ToString());

			return result.Substring(0, result.Length - 1);
		}

		public enum CountLayouts
		{
			Horizontal,
			None,
			Vertical
		}
	}
}

Twingly och Tidningen hennes

Gans­ka nyli­gen så lade vi in stöd för Twingly på någ­ra av Egmont Tid­skrif­ters saj­ter, när­ma­re bestämt Tid­ning­en hen­nes, King och Modet­te. Jag har ännu så länge inte sett det ”in action”, så jag skri­ver det här lil­la blogg­inlägget som ett litet test av funk­tio­nen där.

För att det skall fun­ge­ra mås­te jag ju län­ka till t.ex. ett blog­gin­lägg på hen­nes, och var­för inte ta ett av Stef­fa­ni­es inlägg, ”blog­ga om oss”? Fun­kar all­de­les utmärkt, tyc­ker jag.

Nu bär det av till sängs, imor­gon har vi möte för att sam­la ihop och dele­gera bug­gar­na som dykt upp nu iom migre­ring­en till EPi­Ser­ver CMS 5.

Märkliga felmeddelanden

För ett tag sen fick jag en ny dator här på Egmont. Skill­na­den på den jäm­fört med den gam­la (för­u­tom has­tig­het och en del and­ra uppen­ba­ra saker) är att alla fel­med­de­lan­den från .Net kom­mer på svens­ka. Det­ta i sig hade väl inte varit så kons­tigt – om det inte vore för att Micro­softs över­sät­tare har en minst sagt märk­lig upp­fatt­ning om vad saker och ting skall över­sät­tas med.

Det upp­stod ett fel på trans­port­ni­vå när för­frå­gan skul­le skic­kas till ser­vern. (pro­vi­der: TCP-provider, error: 0 — En befint­lig anslut­ning tving­a­des att stänga av fjärr­värd­da­torn.)

Ehh, ursäk­ta mig? Min anslut­ning till data­bas­ser­vern gjor­de en shut­down på ser­vern???