
 <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Umbraco bloggen, webbutveckling, design tips och ticks.</title><link>http://www.enkelmedia.se</link><pubDate>Wed, 04 Jan 2012 19:18:00 GMT</pubDate><generator>umbraco</generator><description>En blogg om webbutveckling och webbdesign med fokus på ASP.NET och Umbraco CMS.</description><language>sv</language><atom:link href="http://www.enkelmedia.se/blogg/rss.aspx" rel="self" type="application/rss+xml" /><item><title>Razor i Umbraco, Tips och tricks</title><link>http://www.enkelmedia.se/blogg/2012/1/4/razor-i-umbraco-tips-och-tricks.aspx</link><pubDate>on, 04 jan 2012 19:18:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2012/1/4/razor-i-umbraco-tips-och-tricks.aspx</guid><description><![CDATA[<p>Som jag bloggat om tidigare så kommer Umbraco att släpp stödet för XSLT i version 5, det blir istället fullt fokus på Razor!</p>
<p> </p>
<p>På sistone har jag bland annat roat mig med att kolla in Doug Robars <a href="http://stream.umbraco.org/video/2198461/did-you-know" target="_blank">presentation från CodeGarden 2011</a> där han pratar om tips och tricks för Umbraco. Jag har också kollat igenom Razor-avsnitten på <a href="http://umbraco.com/help-and-support/video-tutorials/umbraco-fundamentals/razor.aspx" target="_blank">Umbraco TV</a> – mest för att se om man kunde upptäcka något nytt. Jag antecknande lite smått och gott som jag tänkte bjuda på i detta (och kanske fler) inlägg.</p>
<p> </p>
<h4>Snabbvägen till Documents Types</h4>
<p>När du arbetar med ett razor macro och vill komma åt en eller flera child-elements som är av en viss Document Type så kan man använda följande syntax:</p>
<div dir="ltr" id="CodeDiv">
<pre class="brush: csharp">@foreach(var node in Model.DocTypeNames) { }</pre>
</div>
<p>Det sades i någon presentation att man skulle lägga till ett “s” i slutet på namnet på den DocType man ville komma åt men det verkar som att det funkar även utan detta s, i alla fall i version 4.7.1. Låt oss säga att du har en “NewsItemFolder” under första noden i systemet och sedan i denna listar dokument av typen “NewItem”. Då skulle följade lista alla nyheter:</p>
<div dir="ltr" id="CodeDiv">
<pre class="brush: csharp">@foreach(var node in Model.NewsItem.First().Children) {<br /><br />   @node.Name&lt;br/&gt;<br /><br />}</pre>
</div>
<h4><br />Kapa och lägg till…</h4>
<p>Det händer ofta att man bara vill visa delar en sträng, kanske för en sammanfattning eller teaserlista. Det finns inbyggt i @Library.Truncate(). För att kunna använda detta måste du köra V4.7.1, alternativt uppgradera din macromotor genom att kopiera in “umbraco.MacroEngines.dll” från V4.7.1 till din V4.7.0-installation. Så här använder du metoden:</p>
<div dir="ltr" id="CodeDiv">
<pre class="brush: csharp">@Library.Truncate("Här skriver vi en massa text som sedan ska kapas", 10, true);</pre>
</div>
<p><br />Det som skrivs ut blir “Här skriver vi en massa t…”. Första parametern är indatan, sedan längden och om man vill att metoden lägger till “…” på slutet.</p>
<p> </p>
<h4>Om det är sant så gör det osv</h4>
<p>Att if-statments mitt i razorkoden ser ganska klumpigt ut så därför finns @Library.If() som används så här:</p>
<p> </p>
<p>@Library.If(true=true, "Skrivs vid sant", "Skrivs vid falskt, denna är är inte obligatorisk.");</p>
<p> </p>
<h4>Jag vill göra en breadcrumb</h4>
<p>Då ska du använda dig av metoden “Ancestors” som finns på alla DynamicNodes. Så här skriver du för att lista alla “parents” hela vägen upp till root-noden.</p>
<div dir="ltr" id="CodeDiv">
<pre class="brush: csharp">@foreach(var node in Model.Ancestors()) {<br /><br />  @node.Name&lt;br/&gt;<br /><br />}</pre>
</div>
<p> </p>
<p>Detta returnerar alltså alla parents i en fin lista så att man tex. kan göra en breadcrumb.</p>
<p> </p>
<h4>Gruppera mera</h4>
<p>En feature som jag verkligen gillar är InGroupsOf(intAntalPerGrupp). Denna kan anropas på alla typer av samlingar och kommer då att returnera objekt av typen “umbraco.MacroEngines.Grouping” som håller alla objekt i samlingen grupperade i grupper enligt parametern. Tex:</p>
<div dir="ltr" id="CodeDiv">
<pre class="brush: csharp">@foreach (var groups in Model.Children.InGroupsOf(2))<br />    {<br />        foreach (var item in groups)<br />        {   <br />            &lt;a href="@item.Url"&gt;@item.Name&lt;/a&gt;&lt;br /&gt;<br />        }<br />        // Bryter efter två rader med en hr, hade också kunnat<br />        // vara text en ny kolumn eller liknande.<br />        &lt;hr /&gt;<br />     }</pre>
</div>
<p>  </p>
<p>Skulle skriva ut två childs, sedan en hr-tag, två childs, en tag osv osv.</p>
<p> </p>
<h4>Fuska lite</h4>
<p>Peter Gregory har skapat ett litet projekt på our.umbraco.org där han sammanställer en liten fusklapp över Umbraco och Razor, <a href="http://our.umbraco.org/projects/developer-tools/razor-dynamicnode-cheat-sheet" target="_blank">Razor DynamicNode Cheat Sheet</a> är klockrent, ladda hem idag!</p>
<p> </p>
<p><img src="http://www.enkelmedia.se/media/5290/umbraco_cheatsheet.png" width="450" height="338" alt="Umbraco _cheatsheet"/></p>
<p> </p>
<p>Nu orkar jag inte skriva mer! Tjejen ligger på soffan och vill att vi ska se på “Family guy”. Det finns mer Razor-tips att bjuda på så håll till godo, prenumerera gärna på min <a src="http://www.enkelmedia.se/blogg/rss.aspx" target="_blank">RSS</a> men hjälp av tex Outlook eller <a href="http://www.google.com/reader" target="_blank">Google Reader</a>.</p>]]></description></item><item><title>Umbraco 5 släpps i Januari</title><link>http://www.enkelmedia.se/blogg/2011/12/23/umbraco-5-slapps-i-januari.aspx</link><pubDate>fr, 23 dec 2011 00:45:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/12/23/umbraco-5-slapps-i-januari.aspx</guid><description><![CDATA[<p>Idag togs ett nytt steg i arbetet med nya den versionen av Umbraco, Umbraco V5. Man släppte en första så kallad RC (Release Candidate) vilket innebär att man är väldigt nära det slutgiltiga resultatet. Samtidigt skrev man också att man hoppas på att den nya versionen kommer att bli klar för släpp i slutet av januari 2012!</p>
<p> </p>
<p> <img src="http://www.enkelmedia.se/media/4861/umbraco-v5.png" width="500" height="335" alt="Umbraco -v5"/></p>
<p> </p>
<p>I denna Umbraco V5 RC1 har man bland annat implementerat members-delen, man har jobbat med DictionaryItems för att få till språkstödet, gjort förbättringar på DocumentTypes och även arbetat med DynamicModel för att göra det ännu enklare att skriva grymma macros. Jag tänker labba lagom mycket med detta under julen, eftersom jag drar hem till Motala och käkar mammas julmat så får jag nog återkomma i mellandagarna med en eventuell kommentar ;)</p>
<p> </p>
<p>Du som är nyfiken kan redan nu <a href="http://umbraco.codeplex.com/releases/view/79260" target="_blank">ladda ned RCn från CodePlex</a>, och läsa mer i <a href="http://umbraco.com/follow-us/blog-archive/2011/12/22/umbraco-5-rc1-is-out-today.aspx" target="_blank">HQs blogginlägg</a> på Umbraco.org.</p>
<p> </p>
<p>Samtidigt funderar jag. Kan alla MVC? Kommer version 5 alltid att bli det självklara valet? Vad tror du?</p>
<p> </p>
<p>God Jul!!</p>]]></description></item><item><title>Samtrans valde Umbraco CMS</title><link>http://www.enkelmedia.se/blogg/2011/11/18/samtrans-valde-umbraco-cms.aspx</link><pubDate>fr, 18 nov 2011 06:21:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/11/18/samtrans-valde-umbraco-cms.aspx</guid><description><![CDATA[<p>Vår senaste kund <a href="http://www.samtrans.se" target="_blank">Samtrans</a> gav oss förtroendet att implementera Umbraco CMS i den design som levererats av Vektorgrafik Stockholm.</p>
<p> </p>
<p><img src="/media/4762/samtrans_screen_500x350.jpg"  width="500"  height="350" alt="Samtrans Screen"/></p>
<p> </p>
<p>Företaget sysslar med persontransporter för personer med speciella behov och hemsidan är en uppfräschning av deras tidigare hemsida. Läs gärna med om projketet bland våra <a src="http://www.enkelmedia.se/{localLink:1490}" title="Samtrans">referenser</a>.</p>]]></description></item><item><title>Dax att lägga XSLT på hyllan</title><link>http://www.enkelmedia.se/blogg/2011/11/16/dax-att-lagga-xslt-pa-hyllan.aspx</link><pubDate>on, 16 nov 2011 18:04:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/11/16/dax-att-lagga-xslt-pa-hyllan.aspx</guid><description><![CDATA[<p><img src="http://www.enkelmedia.se/media/4680/xsltbooks.jpg" width="500" height="252" alt="Xslt Books"/></p>
<p><em>Böcker som gjort sitt...</em></p>
<p> </p>
<p>För några dagar sedan skrev Niels Hartvig, grundaren av Umbraco, ett <a href="http://umbraco.com/follow-us/blog-archive/2011/11/10/saying-goodbye-to-an-old-friend.aspx" target="_blank">blogginlägg</a> där han berättade att man nu kommer att släppa stödet för så kallade XSLT-makron i Umbraco.</p>
<p> </p>
<p>XSLT är en teknik som används för att formatera och och omformatera XML-dokument. Eftersom hela Umbraco-sajten, i dagsläget, sparas som ett XML dokument i webbserverns cache så har XSLT varit en extremt snabb teknik för att lista och filtrera innehåll.</p>
<p> </p>
<p>I Umbraco 5, som bygger på ASP.NET MVC och är en komplett ombyggnad av grunden till Umbraco, kommer man att släppa stödet för XSLT och istället satsa enbart på Razor-makron. <br /><br />Jag tycker att det är bra! Som nybörjare på Umbraco minns jag att det största "hindret" för mig var just XSLT. XSLT är extremt snabbt men på samma sätt som det är snabbt är det krångligt och kräver relativt djup förstålse om XML, XPath osv. När Umbraco 5 nu istället baseras på Razor kommer den som arbetat med ASP.NET MVC att känna igen sig eftersom att Razor är den teknik som används för att programmera vyer i gränsnittet för MVC-sajter.</p>
<p> </p>
<p>Så det är bara att lägga mina gamla XSLT-böcker på hyllan....</p>]]></description></item><item><title>Umbraco User Group i Sverige</title><link>http://www.enkelmedia.se/blogg/2011/11/8/umbraco-user-group-i-sverige.aspx</link><pubDate>ti, 08 nov 2011 18:24:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/11/8/umbraco-user-group-i-sverige.aspx</guid><description><![CDATA[<p><img src="http://www.enkelmedia.se/media/4693/umbracousergroup.jpg" width="500" height="317" alt="Umbraco User Group"/></p>
<p> </p>
<p>Jag vill tipsa om den svenska användargruppen för Umbraco (Umbraco User Group Sweden). Den startades för några månader sedan och kommer att hålla möten och seminarium med Umbraco som tema.</p>
<p> </p>
<p>För att gå med, besök hemsidan <a href="http://www.uugs.se/" target="_blank">uugs.se</a> och glöm inte att joina <a href="http://www.facebook.com/#!/groups/umbracousergroupsweden/" target="_blank">facebook-gruppen</a>! </p>
<p> </p>
<p>Vi ses och hörs! :D</p>]]></description></item><item><title>Bygga ut Umbraco Backoffice - del 1</title><link>http://www.enkelmedia.se/blogg/2011/11/3/bygga-ut-umbraco-backoffice-del-1.aspx</link><pubDate>to, 03 nov 2011 07:29:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/11/3/bygga-ut-umbraco-backoffice-del-1.aspx</guid><description><![CDATA[<p>Jag tänkte gå igenom grunderna i hur man bygger ut Umbracos Backoffice/backend. Eftersom det redan finns ett bra gäng bloggposter om hur man lägger till sin egen "section" så tänkte jag fokusera på lite andra delar just nu.</p>
<p> </p>
<h4>Skapa egen section / application i Umbraco</h4>
<p>Det krävs lite småfix i databasen för att skapa sin egen section, det är inte särskilt avancerat och du kan läsa utförligt hur man gör i dessa poster:</p>
<p> </p>
<p><a href="http://www.robertgray.net.au/2011/5/10/creating-a-custom-content-tree-in-umbraco.aspx" target="_blank">http://www.robertgray.net.au/2011/5/10/creating-a-custom-content-tree-in-umbraco.aspx</a></p>
<p> </p>
<p><a href="http://www.sewen.se/blogg/2010/2/26/skapa-en-custom-section-i-umbraco-(steg-1).aspx" target="_blank">http://www.sewen.se/blogg/2010/2/26/skapa-en-custom-section-i-umbraco-(steg-1).aspx</a></p>
<p> </p>
<h4>Göra egna Webforms till Umbraco backoffice</h4>
<p>När du ska skapa dina egna .aspx-filer för redigeringsytan så är det en bra idé att använda Umbracos egna kontroller för backoffice. De finns i umbraco.uicontrols.controls. För att använda dessa på sida måste du lägga till följande rad i början av ditt aspx-dokument.</p>
<p> </p>
<div dir="ltr" id="CodeDiv">
<pre class="brush: xml">&lt;%@ Register TagPrefix="umb" Namespace="umbraco.uicontrols" Assembly="controls" %&gt;<br /><br /></pre>
</div>
<p>När detta är fixat så kan du enkelt använda Umbracos orginal-kontroller och få din custom section att hålla samma konsekventa utseende som resten av backoffice.</p>
<p> </p>
<p>Jag tänkte gå igenom några av de mesta grundläggande kontrollerna</p>
<p> </p>
<p><strong>TabView</strong></p>
<p><img src="http://www.enkelmedia.se/media/4511/tabview.png" width="498" height="49" alt="Tabview"/></p>
<p>Om du vill använda tabbar skall du ha en TabView kontroll på sidan. Varje sida behöver bara EN TabView. Du skapar sedan valfritt antal tabs i din code behinde.</p>
<p> </p>
<p>I din aspx-fil:</p>
<div id="CodeDiv" dir="ltr">
<pre class="brush: xml">&lt;umb:TabView ID="MyTabView" runat="server" Width="552px" Height="392px"/&gt;</pre>
</div>
<p><br />För att lägga till tabbar används förljande kod i code behinde:</p>
<div id="CodeDiv" dir="ltr">
<pre class="brush: csharp">protected override void OnInit(EventArgs e)
{
   base.OnInit(e);
   
    // Lägg till ny tab på MyTabView
    var myTab = MyTabView.NewTabPage("Details");
    myTab.Controls.Add(myPane);
    // Ett tab till
     var myTab2 = MyTabView.NewTabPage("New tab");
     myTab2.Control.Add(anotherPane);
}</pre>
</div>
<p><br /><br /></p>
<p><strong>Pane / PropertyPane</strong></p>
<p><strong><img src="http://www.enkelmedia.se/media/4506/pane-property.png" width="394" height="246" alt="Pane -property"/></strong></p>
<p>Det blå strecket markerar "umb:Pane" och de röda boxarna är PropertyPanels. Detta samarbete mellan Pane och PropertyPane ser man ofta i Umbracos backoffice. Koden ser ut ungefär så här:</p>
<div id="CodeDiv" dir="ltr">
<pre class="brush: xml">&lt;umb:Pane ID="myPane" runat="server" Text="Settings"&gt;
  &lt;umb:PropertyPanel ID="PropertyPanel1" runat="server" Text="Database datatype"&gt;
	&lt;!-- DropDown goes here --&gt;
  &lt;/umb:PropertyPanel&gt;
  &lt;umb:PropertyPanel id="PropertyPanel2" runat="server" Text="Add prevalue"&gt;
	&lt;!-- Textbox goes here --&gt;
  &lt;/umb:PropertyPanel&gt;
&lt;/umb:Pane&gt;</pre>
</div>
<p> </p>
<p><strong>MenuImageButton och MenuIcon</strong></p>
<p>Det finns två olika typer av knappar som kan adderas till en TabView. Visuellt syns ingen skillnad, det är knapparnas funktion som skiljer sig.</p>
<ul>
<li>MenuImageButton - Används om du vill att knappen ska fira av ett click-event och en postback.</li>
<li>MenuIcon - Används om knappen istället ska anropa en javascript-funktion.</li>
</ul>
<p> </p>
<p>MenuImageButton:</p>
<div id="CodeDiv" dir="ltr">
<pre class="brush: csharp">btnImage = dataTab.Menu.NewImageButton();
btnImage.ID = id;
btnImage.Click += new ImageClickEventHandler(SaveButton_Click);
btnImage.AlternateText = "Save";
btnImage.ImageUrl = GlobalSettings.Path + "/images/editor/save.gif";</pre>
</div>
<p> </p>
<p>MenuIcon:</p>
<div id="CodeDiv" dir="ltr">
<pre class="brush: csharp">btnImageIcon = dataTab.Menu.NewIcon();
btnImageIcon.ID = "btnImageIcon";
btnImageIcon.OnClickCommand = "alert('Run javascript')";
btnImageIcon.ImageURL = GlobalSettings.Path + "/images/editor/save.gif";
btnImageIcon.AltText = "Show alert";</pre>
</div>
<p> </p>
<p><strong>CodeArea</strong></p>
<p>I Umbracos backoffice används ibland en inbyggd kodeditor. Den kan även du använda i dina egna projekt genom att infoga en CodeArea.</p>
<p> </p>
<p><img src="http://www.enkelmedia.se/media/4641/umbraco_codearea.png" width="500" height="339" alt="Umbraco codearea"/></p>
<p> </p>
<p>Så här kan koden se ut:</p>
<p> </p>
<div id="CodeDiv" dir="ltr">
<pre class="brush: xml">&lt;umb:CodeArea ID="editor" ClientSaveMethod="doSubmit" CodeBase="Python" AutoResize="true" OffSetX="47" OffSetY="55" runat="server" /&gt;</pre>
</div>
<p> </p>
<p>ClientSaveMethod är inte obligatorisk och används för att hantera om användaren trycker "Ctrl+S" i editorn. Egenskapen CodeBase krävs inte heller. När du arbetar med denna CodeArea i code behinde använd egenskapen "Text" för att sätta/hämta innehållet.</p>]]></description></item><item><title>Tömma Umbracos papperskorg</title><link>http://www.enkelmedia.se/blogg/2011/10/25/tomma-umbracos-papperskorg.aspx</link><pubDate>ti, 25 okt 2011 06:40:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/10/25/tomma-umbracos-papperskorg.aspx</guid><description><![CDATA[<p>Jag läste precis några av mina favoritbloggar om Umbraco och såg att några tipsade om hur man enkelt tömmer papperskorgen.</p>
<p> </p>
<p><a href="http://www.blogfodder.co.uk/2011/5/26/mass-delete-over-1k-nodes-from-recycle-bin-in-47" target="_blank">http://www.blogfodder.co.uk/2011/5/26/mass-delete-over-1k-nodes-from-recycle-bin-in-47</a></p>
<p> </p>
<p><a href="http://anthonydotnet.blogspot.com/2011/07/umbraco-empty-recycle-bin-hangs.html" target="_blank">http://anthonydotnet.blogspot.com/2011/07/umbraco-empty-recycle-bin-hangs.html</a></p>
<p> </p>
<p>Jag rekommenderar paketet "F.A.L.M Housekeeping" som dels kan radera papperskorgen men även loggar, rollbacks och mycket annat. <a href="http://our.umbraco.org/projects/backoffice-extensions/falm-housekeeping" target="_blank">http://our.umbraco.org/projects/backoffice-extensions/falm-housekeeping</a></p>
<p> </p>
<p><img src="http://www.enkelmedia.se/media/4609/housekeeping.jpg" width="362" height="630" alt="Housekeeping"/></p>]]></description></item><item><title>Livsfarligt utan StringBuilder</title><link>http://www.enkelmedia.se/blogg/2011/10/6/livsfarligt-utan-stringbuilder.aspx</link><pubDate>to, 06 okt 2011 16:47:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/10/6/livsfarligt-utan-stringbuilder.aspx</guid><description><![CDATA[<p>Det är egentligen helt självklart och hör till grunderna inom .NET men jag måste verkligen dela med mig av den här historien för att göra det övertydligt. Det handlar om att sätta ihop (concat) strängar. Det finns ett väldigt enkelt sätt att göra detta som ser ut ungefär så här:</p>
<p> </p>
<div dir="ltr" id="CodeDiv">
<pre class="brush: csharp">strVariable += "mer saker i strängen"</pre>
</div>
<p><br />Detta sätt att sätta ihop strängar har jag använt en hel del genom åren. Jag har ofta läst om att StringBuilder-klassen är snabbare och bättre eftersom att den endast håller ett objekt i minnet, den skall alltså användas när det handlar om större objekt tex om concaten sker i en loop. En kod liknande den nedan fanns i ett projekt jag fick ta över.</p>
<div dir="ltr" id="CodeDiv">
<pre class="brush: csharp">foreach(var yada in yadaYada)
{
  strVariable += "mer saker i strängen"
}</pre>
</div>
<p><br />Funktionen som ibland hanterade tiotusentals rader var extremt seg. Kan det vara Entity Framework (som också var inblandat) som spökar? Svaret var klart och tydligt nej. Det beror på att vi inte använder StringBuilder. Loopen ovan med 15 000 rader tog cirka 25 sekunder för vår testmaskin att processa. Gissa tiden för samma loop fast med StringBuilder?</p>
<div dir="ltr" id="CodeDiv">
<pre class="brush: csharp">foreach(var yada in yadaYada)
{
  stringBuilder.Append("mer saker i strängen");
}</pre>
</div>
<p>Den tog 0,21 sekunder. Det är helt sjukt vilken enorm skillnad. Enligt vad jag förstår så kommer kompilatorn att döda den gamla och skapa en ny sträng i minnet varje gång loopen körs i första exemplet, i andra, med StringBuildern används samma objekt. Värt att veta alltså:</p>
<p> </p>
<p>StringBuilder.Append 00:00.0210012 sekunder<br />Html+html 00:26.9005386 sekunder</p>
<p> </p>]]></description></item><item><title>Intellisense på kontroller i umbraco.uicontrols</title><link>http://www.enkelmedia.se/blogg/2011/9/26/intellisense-pa-kontroller-i-umbracouicontrols.aspx</link><pubDate>må, 26 sep 2011 08:24:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/9/26/intellisense-pa-kontroller-i-umbracouicontrols.aspx</guid><description><![CDATA[<p>När man utvecklar egna sections till Umbracos backoffice så är det lämpligt att återanvända standardkontrollerna i Umbraco. Dessa finns i umbraco.uicontrols och används genom att lägga till följande rad i början av din aspx-fil.</p>
<p> </p>
<div id="CodeDiv" dir="ltr">
<pre class="brush: xml">&lt;%@ Register TagPrefix="umb" Namespace="umbraco.uicontrols" Assembly="controls" %&gt;</pre>
</div>
<p><br /><img src="http://www.enkelmedia.se/media/4529/addreference.png" width="281" height="285" alt="Add Reference" style="float: right;"/>När jag gjorde detta i ett nytt projekt för att tag sedan märkte jag att Visual Studio vägrade att ge mig Intellisense på kontrollerna vilket var sjukt irriterande. Efter lite googlade så hittade jag <a href="http://our.umbraco.org/forum/using/ui-questions/18715-Can%27t-access-umbracouicontrols" target="_blank">denna tråd</a> som presenterade den enkla lösningen:</p>
<p> </p>
<p>Lägg till en referens till ClientDependency.Core.dll i ditt projekt och saken är biff.</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>]]></description></item><item><title>Screencasts om Umbraco CMS</title><link>http://www.enkelmedia.se/blogg/2011/9/15/screencasts-om-umbraco-cms.aspx</link><pubDate>to, 15 sep 2011 20:06:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/9/15/screencasts-om-umbraco-cms.aspx</guid><description><![CDATA[<p>Vår utvecklare Markus Johansson har gjort en kort introduktion till Umbraco CMS du som skall redigera sajten ser hur enkelt det är att arbeta med detta underbara publiceringsverktyg och du som ska utveckla får upptäcka enkelheten och skalbarheten.</p>
<p> </p>
<h4>För dig som ska uppdatera hemsidan</h4>
<p> </p>
<p><iframe width="520" height="349" src="http://www.youtube.com/embed/q_qpcqH4u10?hl=sv&amp;fs=1" frameborder="0" allowfullscreen=""></iframe></p>
<p> </p>
<h4>För dig som är utvecklare</h4>
<p> </p>
<p><iframe width="520" height="349" src="http://www.youtube.com/embed/EVkwtej0KMA?hl=sv&amp;fs=1" frameborder="0" allowfullscreen=""></iframe></p>]]></description></item><item><title>Kopiera databas från SQL Server 2008 till 2005</title><link>http://www.enkelmedia.se/blogg/2011/8/26/kopiera-databas-fran-sql-server-2008-till-2005.aspx</link><pubDate>fr, 26 aug 2011 16:58:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/8/26/kopiera-databas-fran-sql-server-2008-till-2005.aspx</guid><description><![CDATA[
<p>I vår utvecklingsmiljö använder vi SQL Server 2008 och för ett
tag sedan utvecklade vi en Umbraco-lösning med denna databas som
grund. När detta skulle implementeras till kundens produktionsmiljö
visade det sig att de körde SQL Server 2005. Det innebär att man
inte kan kopiera mdf-filen eller skapa en backup och återställa den
på servern som man annars hade kunnat göra.</p>

<p>&nbsp;</p>

<p>Lösningen som vi kom fram till blev att scripta hela databasen
så här:</p>

<p>&nbsp;</p>

<p>1. Öppna SQL Server Managament Studio.<br />
 2. Högerklicka på den databas du vill exportera och välj "Generate
Scripts"</p>

<p>&nbsp;</p>

<p><img src="http://www.enkelmedia.se/media/4323/copy-database-11.png" width="542" height="472" alt="Copy -database -11"/></p>

<p>&nbsp;</p>

<p>3. I steget options glöm INTE att klicka i följande:<br />
 &nbsp;- Script Bindings = True<br />
 &nbsp;- Script for sever version = SQL Server 2005<br />
 &nbsp;- Script logins = True<br />
 &nbsp;- Script Data = True</p>

<p>&nbsp;</p>

<p><img src="http://www.enkelmedia.se/media/4316/copy-database-2.png" width="552" height="511" alt="Copy -database -2"/></p>

<p>&nbsp;</p>

<p>4. Klart</p>
]]></description></item><item><title>Umbraco i produktionsmiljö</title><link>http://www.enkelmedia.se/blogg/2011/8/26/umbraco-i-produktionsmiljo.aspx</link><pubDate>fr, 26 aug 2011 07:42:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/8/26/umbraco-i-produktionsmiljo.aspx</guid><description><![CDATA[
<p>När utvecklingen av en Umbraco-sajt är klar och hemsidan skall
göras publik finns det en del saker att tänka på. Det är många
moment och småsaker som kan vara lätt ass missa. Därför tänkte jag
dela med mig av min nuvarande checklista.</p>

<p>&nbsp;</p>

<ul>
<li>ConnectionString - Glöm inte att ändra kopplingen till den
databas som skall användas i produktionsmiljön.</li>

<li>Stäng av UmbracoDebug genom att sätta "<span>umbracoDebugMode"
to false i web.config.</span></li>

<li><span>Slipp "Uppgraderingsmeddelanden" i backend genom att
sätta umbracoDisableVersionCheck till false eller
umbracoVersionCheckPeriod till 0 även detta i
web.config.</span></li>

<li><span>Sätt "CustomErrors" till RemoteOnly för att inte exponera
eventuella fel till användare/hackers.</span></li>

<li><span>Sätt debug till false i
kompileringssektionen.</span></li>

<li><span>Dubbelkolla att mapprättigheterna är korrekta i
produktionsmiljön - <a
href="http://our.umbraco.org/wiki/install-and-setup/set-umbraco-folder-permissions-from-command-line"
 target="_blank">Länk till artikel på umbraco.org</a>.</span></li>

<li><span>Aktivera "Health Monitoring" i web.config. Då får du tex.
mail om ett fel uppstår på servern. <a
href="http://msdn.microsoft.com/en-us/library/bb398933.aspx"
target="_blank">Lär mer om health monitoring</a>.</span></li>

<li><span>Städa i din Umbraco-installation. Tabort gammla
logposter, mediafiler och annat som tar onödig plats. Använd
pluginen <a
href="http://our.umbraco.org/projects/backoffice-extensions/falm-housekeeping"
 target="_blank">FALM Housekeeping</a> av Adriano
Fabri.</span></li>

<li><span>Ge din kund en kram.<br />
</span></li>
</ul>
]]></description></item><item><title>Sortera efter datum i XSLT</title><link>http://www.enkelmedia.se/blogg/2011/8/24/sortera-efter-datum-i-xslt.aspx</link><pubDate>on, 24 aug 2011 07:35:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/8/24/sortera-efter-datum-i-xslt.aspx</guid><description><![CDATA[
<p>Jag jobbade med ett RSS-macro som skulle lista blogg inläggen
från bland annat&nbsp; denna blogg. Mallen kräver att man kan
sortera posterna efter datum i fallande ordning. Eftersom xsl-sort
har ett element som heter data-type så forskade jag i om man kunde
sätta danna till date - vilket inte gick. De enda värden som är
gilltiga är text, number och qname.</p>

<p>&nbsp;</p>

<p>Därför blev min lösning att konvertera datumet till siffror och
sedan sortera efter nummer.</p>

<p>&nbsp;</p>

<div id="CodeDiv" dir="ltr">
<pre class="brush: xml">
&lt;xsl:apply-templates select="$currentPage/descendant::SimpleBlogPost [@isDoc]"&gt;
     &lt;xsl:sort select="umbraco.library:FormatDateTime(postDate ,'yyyyMMddhhmmss')" data-type="number" order="descending" /&gt;
&lt;/xsl:apply-templates&gt;
</pre>
</div>

<p>&nbsp;</p>

<p>&nbsp;</p>
]]></description></item><item><title>Bra inspiration</title><link>http://www.enkelmedia.se/blogg/2011/8/23/bra-inspiration.aspx</link><pubDate>ti, 23 aug 2011 12:32:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/8/23/bra-inspiration.aspx</guid><description><![CDATA[
<p><a href="http://www.webappers.com" target="_blank"><img src="http://www.enkelmedia.se/media/4217/webappers_logo.png" width="433" height="92" alt="Webappers _logo"/></a></p>

<p>&nbsp;</p>

<p>Jag tycker verkligen om tips-bloggen "WebAppers" som tipsar om
coola gratis scripts, tips och tekniker för att göra din sajt
snyggare och mer användarvänlig. Ett måste bland bokmärkena.</p>

<p>&nbsp;</p>

<p>Länk: <a href="http://www.webappers.com/"
target="_blank">http://www.webappers.com</a></p>
]]></description></item><item><title>Nya sidan lanserad</title><link>http://www.enkelmedia.se/blogg/2011/6/29/nya-sidan-lanserad.aspx</link><pubDate>on, 29 jun 2011 18:05:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/6/29/nya-sidan-lanserad.aspx</guid><description><![CDATA[
<p><span>Nu är vår nya hemsida lanserad. Eftersom vi är stora
förespråkare av Umbraco CMS så valde vi att bygga även vår egna
sida med detta system som grund. Såhär ser det ut just nu när jag
skriver detta blogginlägg.</span></p>

<p>&nbsp;</p>

<p><span><img src="http://www.enkelmedia.se/media/3545/umbracocms-470-screenshot.jpg" width="515" height="412" alt="Umbracocms -470-screenshot"/>﻿</span></p>

<p>&nbsp;</p>

<p><span>För just vår hemsida har det inte krävts några enorma
utbyggnader av Umbracos grund men vi har använt följande
moduler:</span></p>

<p>&nbsp;</p>

<ul>
<li><span><a
href="http://our.umbraco.org/projects/backoffice-extensions/google-maps-datatype"
 target="_blank">Google Maps Datatype</a>&nbsp;av Darren
Fergus</span></li>

<li><span>Simple blog - Som är ett framtida blogg-paket som vi ska
lansera för Umbraco</span></li>

<li><span><a
href="http://our.umbraco.org/projects/backoffice-extensions/syntax-highlighter-plugin"
 target="_blank">Syntax Highlighter 1.0</a>&nbsp;som vi själva
utvecklat.</span></li>
</ul>

<p>&nbsp;</p>

<p><span>Vi har också använt oss av den nya funktionaliteten med <a
href="http://umbraco.com/follow-us/blog-archive/2011/2/23/umbraco-47-razor-feature-walkthrough-%E2%80%93-part-1"
 target="_blank">Razor-macron</a> som är riktigt användbar och
effektiv att arbeta med!﻿</span></p>
]]></description></item><item><title>Rest/Base i Umbraco</title><link>http://www.enkelmedia.se/blogg/2011/2/23/restbase-i-umbraco.aspx</link><pubDate>on, 23 feb 2011 16:22:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2011/2/23/restbase-i-umbraco.aspx</guid><description><![CDATA[
<p>En intressant och användbar del av Umbraco är "Base", där
används REST för att på ett enkelt sätt göra det möjligt att
kommunicera med Umbraco, dels från Umbracosajten, men även från
externa sytstem.</p>

<p>&nbsp;</p>

<p>Mer info om Rest (Representational State Transfer) finns bland
annat här:
http://sv.wikipedia.org/wiki/Representational_State_Transfer</p>

<p>&nbsp;</p>

<p>Det är sjukt enkelt att få REST att fungera i Umbraco.</p>

<ul>
<li>Skapa en klass med statiska methoder som skall exponeras.</li>

<li>Lägg assemblyt i Umbracos bin-katalog</li>

<li>Konfigurera Umbraco-Base i filen "restExtensions.config"</li>

<li>Ös på</li>
</ul>

<p>&nbsp;</p>

<p>Exempel och mer info finns här:
http://umbraco.org/documentation/books/introduction-to-base/simple-base-samples</p>
]]></description></item><item><title>@SortOrder beter sig konstigt</title><link>http://www.enkelmedia.se/blogg/2010/11/3/@sortorder-beter-sig-konstigt.aspx</link><pubDate>on, 03 nov 2010 15:26:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2010/11/3/@sortorder-beter-sig-konstigt.aspx</guid><description><![CDATA[
<p>Jag har vid ett antal tillfällen förbryllats över hur XSLT
rendering från Umbraco, trots att sen nod-lista är korrekt sorterad
i backend, inte visar noderna i den ordning som den "borde".<br />
<br />
 Jag har hela tiden använt mig av denna kod för att sortera mina
noder i en XSLT-loop:</p>

<div dir="ltr" id="CodeDiv">
<pre class="brush: xml">
&lt;xsl:sort select="@sortOrder" order="ascending" /&gt;
</pre>
</div>

<p>Detta fram tills att jag läst en bloggpost som sa att man borde
skicka med datatypen.</p>

<div dir="ltr" id="CodeDiv">
<pre class="brush: xml">
&lt;xsl:sort select="@sortOrder" order="ascending" data-type="number" /&gt;
</pre>
</div>

<p>Utan egenskapen för "data-type" så hanteras numren som strängar
(läs: sorteras enligt dessa principer) men när man sätter datatypen
till "number" så kommer sorteringen att bli korrekt.</p>
]]></description></item><item><title>Fel vid uppgradering till .NET 3.5</title><link>http://www.enkelmedia.se/blogg/2010/9/28/fel-vid-uppgradering-till-net-35.aspx</link><pubDate>ti, 28 sep 2010 16:13:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2010/9/28/fel-vid-uppgradering-till-net-35.aspx</guid><description><![CDATA[
<p>Har precis hjälpt en kund som fick problem när deras webbhotell
valde att uppgradera sina gamla windows 2003-servrar med ASP.NET
2.0 till Win 2008 och ASP.NET 3.5.<br />
<br />
 Det var flera fel som uppstod...</p>

<p>&nbsp;</p>

<p><strong>Inget ASP.NET Ajax Installerat</strong></p>

<p>Det första felmeddelandet som visades var följande:</p>

<div class="code">
<p>Assembly Load Trace: The following information can be helpful to
determine why the assembly 'System.Core, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089' could not be
loaded.</p>
</div>

<p>Detta fel uppstår när Umbraco försöker att komma åt ASP.NET
Ajax. Webbhotellet hade glömt, eller stuntat i att återinstallera
detta på servern vilket gjorde att dessa assemblies behövde adderas
till bin-katalogen. Att kopiera in följande filer löste
problemet:</p>

<p>&nbsp;</p>

<p>System.Web.Extensions.Design.dll</p>

<p>System.Web.Extensions.dll</p>

<p>&nbsp;</p>

<p><strong>Uppdatera Web.Config för att passa .NET Framework
3.5</strong></p>

<p>Den nya servern körde .NET framwork 3.5 istället för 2.0 vilket
gjorde att kunden ville köra Umbraco-instanserna i denna version.
Detta kräver relativt stora ändringar i web.config. Läs mer om
denna uppgraderingen här:<br />
 <a
href="http://umbraco.org/26156">http://umbraco.org/26156</a></p>

<p>&nbsp;</p>

<p>Lösenord fungerade inte i Umbraco Backend</p>

<p>På en av sajterna dök ett sista problem upp. Användarnas
lösenord i backend fungerade inte korrekt efter uppgraderingen. De
flesta umbracoinstanserna som kördes var 4.0.2.1 - den version där
hashade lösenord infördes som standard. Den instans som krånglade
körde version 4.0.0 så lösningen var enkel:<br />
<br />
 Lösenorden i databasen var inte hashade, men i den nya
web.config-filen förutsattes att lösenorden var hashade. Följande
ändring gjordes:</p>

<p>&nbsp;</p>

<div dir="ltr" id="CodeDiv">
<pre class="brush: xml">
&lt;membership defaultProvider="UmbracoMembershipProvider" userIsOnlineTimeWindow="15"&gt;
             &lt;providers&gt;
                 &lt;clear /&gt;
 
                &lt;add name="UmbracoMembershipProvider" type="umbraco.providers.members.UmbracoMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" defaultMemberTypeAlias="Another Type" passwordFormat="Hashed" /&gt;
                 &lt;add name="AspNetSqlMemberShipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="LocalSqlServer" /&gt;
                 &lt;add name="UsersMembershipProvider" type="umbraco.providers.UsersMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" passwordFormat="Hashed" /&gt;
               &lt;/providers&gt;
         &lt;/membership&gt;
</pre>
</div>

<p>&nbsp;</p>

<p>Blev till:</p>

<p>&nbsp;</p>

<div dir="ltr" id="CodeDiv">
<pre class="brush: xml">
&lt;membership defaultProvider="UmbracoMembershipProvider" userIsOnlineTimeWindow="15"&gt;
             &lt;providers&gt;
                 &lt;clear /&gt;
                 &lt;add name="UmbracoMembershipProvider" type="umbraco.providers.members.UmbracoMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" defaultMemberTypeAlias="Another Type" /&gt;
                 &lt;add name="UsersMembershipProvider" type="umbraco.providers.UsersMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" /&gt;
             &lt;/providers&gt;
         &lt;/membership&gt;
</pre>
</div>

<p>&nbsp;</p>

<p>Dvs - passwordFormat="Hashed" raderades så att umbraco inte
skulle försöka hasha lösenord när de ska matchas vid
inloggning.</p>
]]></description></item><item><title>Trädvyen i backend sludade fungera</title><link>http://www.enkelmedia.se/blogg/2010/8/30/tradvyen-i-backend-sludade-fungera.aspx</link><pubDate>må, 30 aug 2010 16:18:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2010/8/30/tradvyen-i-backend-sludade-fungera.aspx</guid><description><![CDATA[
<p>Har precis jobbat mycket med en Umbraco-lösning där jag också
använder delar av AjaxControlToolkit (ACT). Detta kit skeppades för
första gången av Microsoft omkring fyra-fem år sedan i sin första
version, version 1.0.<br />
<br />
Det är denna version som finns inkluderad i Umbraco 4.0.5 som jag
använder i denna lösning.<br />
<br />
Helt plötsligt, mitt under arbetet med mina UserControls och
XSLT-macron upptäckte jag att backendsystemet slutat fungera.
Trädvyerna expanderades inte på någon av "tabbarna", inte under
content, inte media, ja ingenstans.<br />
<br />
Jag rullade tillbaka en backup som var några månader gammal och
upptäckte efter lite letande att jag refererat till en nyare
version av ATC i ett av mina projekt - dessa projekt har post-build
events som skriver över BIN-filerna i Umbraco-lösningen.<br />
<br />
Dvs - Den nyare versionen (4.0) av ACT hamnade i bin-mappen på min
skarpa lösning. Detta ställer alltså till problem med Umbracos
backend. Jag rullade tillbaka ACT till version 1.0 vilket löste
problemet.</p>
]]></description></item><item><title>Parametrar i Macron</title><link>http://www.enkelmedia.se/blogg/2010/6/24/parametrar-i-macron.aspx</link><pubDate>to, 24 jun 2010 16:19:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2010/6/24/parametrar-i-macron.aspx</guid><description><![CDATA[
<p>Både XSLT macron och UserControls kan ha parametrar. Dessa kan
skrivas i direkt i ko</p>

<p>&nbsp;</p>

<p>&lt;umbraco:macro alias="RenderProperties" paramvalue="Parameter
direkt i kod" runat="server"/&gt;<br />
&nbsp;</p>

<p>Eller så kan värdet hämtas ifrån andra delar av systemet. Tex
ifrån den aktuella noden:</p>

<p>&nbsp;</p>

<p>&lt;umbraco:macro alias="RenderProperties" paramvalue
="[$pageTitle]" runat="server"/&gt;</p>

<p>&nbsp;</p>

<p>Det finns fyra andra källor för parameter-värden i Umbraco:</p>

<ul>
<li>Page value: [#propertyAlias]</li>

<li>Page properties value: [$propertyAlias]</li>

<li>Cookie value: [%cookieValueKey]</li>

<li>Request collection&nbsp; (tex QueryString):
[@requestValueKey]</li>
</ul>

<p>&nbsp;</p>

<p>Flera värden, ibland kan man vilja ha flera värden och ta den
första som faktiskt inte är noll då funkar detta:</p>

<p>&nbsp;</p>

<p>&lt;umbraco:macro paramvalue
="[#propertyAlias],[#propertyAlias2],my static string" /&gt;</p>

<p>&nbsp;</p>
]]></description></item><item><title>Debugga Visual Studio med Firefox</title><link>http://www.enkelmedia.se/blogg/2010/2/25/debugga-visual-studio-med-firefox.aspx</link><pubDate>to, 25 feb 2010 16:22:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2010/2/25/debugga-visual-studio-med-firefox.aspx</guid><description><![CDATA[
<p>Något som stört mig ett tag är att Firefox tenderar att vara
sjukt långsamt när man debuggar Visual Studio-projekt via den
inbygga webservern i VS.<br />
<br />
En snabb googling gav mig denna tråd på grymma Stack Overflow: <a
href="http://stackoverflow.com/questions/24959/debugging-asp-net-with-firefox-and-visual-studio-net-very-slow-compared-to-ie"
 target="_blank">http://stackoverflow.com/questions/24959/debugging-asp-net-with-firefox-and-visual-studio-net-very-slow-compared-to-ie</a></p>

<p>&nbsp;</p>

<p>Slutsatsen är helt enkelt att man måste inaktivera ipv6 i
Firefox, enklaste sättet att göra det är följande:</p>

<p>&nbsp;</p>

<ul>
<li>Skriv about:config i Firefox adressbar, klicka ja på
säkerhetsmeddelandet.</li>

<li>Skriv disableIPv6 i filterboxen högst upp och tryck enter.
Inställningen "network.dns.disableIPv6" visas.</li>

<li>Dubbelklicka på "false" så att värdet ändras till true.</li>
</ul>

<p>&nbsp;</p>

<p>När dessa enkla steg är fixade går det tokfort att debugga med
Firefox, vilket är supernice eftersom man då kan använda sig av
bland annat <a href="http://getfirebug.com/"
target="_blank">Firebug</a>.</p>
]]></description></item><item><title>Membership och Roles</title><link>http://www.enkelmedia.se/blogg/2010/2/16/membership-och-roles.aspx</link><pubDate>ti, 16 feb 2010 16:23:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2010/2/16/membership-och-roles.aspx</guid><description><![CDATA[
<p>Jobbar på en lösning som ska dela användare mellan en vanlig
ASP.NET WebApplication och en Umbraco-Instans. Till detta skall
även användarinfo kunna uppdateras med Batchar som hämtar XML-data
och uppdaterar bla adressuppgifter och betalstatus.</p>

<p>&nbsp;</p>

<p>Jag tittade närmare på två lämpliga lösningar och jag tänkte gå
igenom dem här:<br />
<br />
<strong>1. Användare i Umbraco</strong></p>

<p>Spara användarna i Umbraco och jobba med dem via Umbracos API.
Det visade sig att det var krångligt att få igång APIt utanför
Umbraco-instansen och att allt arbete med användare och dess
egenskaper i Umbraco är databasintensivt.<br />
<br />
 Ett möjligt alternativ vore att skriva direkt till
Umbraco-databasen via webbappen, men alternativet känns inte
aktuellt då Umbracos datastruktur är komlex och bör behandlas via
dess API.</p>

<p>&nbsp;</p>

<p><strong>2. Användare i ASP.NET-applikationen</strong></p>

<p>Skapa en skräddarsydd databas där användare sparas och sedan
låta båda lösningarna hämta sina användare/roller från denna plats.
Det innebär att jag måste skriva en ny MembershipProvider och
RoleProvider till Umbraco, även att användarhanteringen i Umbracos
backend inte fungerar fullt ut.<br />
<br />
<strong>Lösningen</strong></p>

<p>Trots arbetet med nya providers och det faktum att backend inte
fungerar till 100% så valde jag lösning 2. Att ha full kontroll
över användarens data och slippa avancerade databasstrukturer vid
batchjobben var mer värdefullt än de få funktioner som inte
fungerar i backend pga Custom Providers.</p>

<p>&nbsp;</p>
]]></description></item><item><title>Tomma divar försvinner</title><link>http://www.enkelmedia.se/blogg/2010/1/2/tomma-divar-forsvinner.aspx</link><pubDate>lö, 02 jan 2010 16:23:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2010/1/2/tomma-divar-forsvinner.aspx</guid><description><![CDATA[
<p>Upptäckte ett intressant problem med att använda divar i XSLT.
Följande kod används ofta för att "cleara" divar när man kör dem
flytande.</p>

<p>&nbsp;</p>

<div class="code">
<pre class="brush: xml">
&lt;div class="clear"&gt;&lt;/div&gt;
</pre>
</div>

<p>&nbsp;</p>

<p>I försökte använda den i ett macro, den låg "wrappad" i en annan
div - såhär:</p>

<p>&nbsp;</p>

<div class="code">
<div dir="ltr" id="CodeDiv">
<pre class="brush: xml">
&lt;div&gt;
 
   &lt;div class="clear"&gt;&lt;/div&gt;
 
&lt;/div&gt;
</pre>
</div>

<p>&nbsp;</p>
</div>

<p>När denna proccessades av XSLT transormatorn i Umbraco så blev
det renderades inte den sista stängningen av div-taggen. Jag löste
det genom att köra följande kod:</p>

<p>&nbsp;</p>

<div class="code">
<div dir="ltr" id="CodeDiv">
<pre class="brush: xml">
  &lt;div&gt;

      &lt;div class="clear"&gt;&amp;nsbp;&lt;/div&gt;

  &lt;/div&gt;
</pre>
</div>

<p>&nbsp;</p>
</div>
]]></description></item><item><title>Begränsa listade poster XSLT</title><link>http://www.enkelmedia.se/blogg/2009/9/6/begransa-listade-poster-xslt.aspx</link><pubDate>sö, 06 sep 2009 21:20:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2009/9/6/begransa-listade-poster-xslt.aspx</guid><description><![CDATA[
<p>Ibland vill man tex att Umbraco ska visa de 10 senaste posterna
i en nod eller kanske de 10 senaste av en speciell document
type.</p>

<p>Så här kan man använda XSLT för att begränsa antalet poster som
lämnas från en for-each-loop.</p>

<div id="CodeDiv" dir="ltr">
<pre class="brush: xml">
&lt;xsl:for-each select="$currentPage/node"&gt;

&lt;xsl:sort select="@sortOrder" order="descending"/&gt;

    &lt;!-- xsl-if kollar att positionen är under 11 dvs, högst 10. Om så inte är fallet skrivs inget ut. --&gt;

   &lt;xsl:if test="position() &lt; 11"&gt;

       &lt;xsl:value-of select="@nodeName"/&gt;&lt;br/&gt;
   &lt;/xsl:if&gt;
&lt;/xsl:for-each&gt;
</pre>
</div>

<p><br />
<br />
</p>

<p>Såhär fungerar det:<br />
<br />
&lt;xsl:sort&gt; Används för att sortera resultatet.
Select-parametern anger efter vilket värde det skall sorteras och
order-parametern anger om det skall vara fallande eller stigande
ordning (ascending, descending).<br />
<br />
&nbsp;<br />
<br />
XSLT-funktionen Position() returnerar nummet på den post som just
nu bearbetars i loopen. Med hjälp av &lt;xsl:if&gt; anger vi att
endast de fem första posterna ska visas, dvs poster som har ett
värde under 10.<br />
<br />
Tecknen &amp;lt; och &amp;gt; betyder samma sak som &lt; och &gt;,
dessa tecken är skyddade i XSLT och måste därför ersättas med
&amp;gt; och &amp;lt&amp;, dvs greater than och lower than.</p>
]]></description></item><item><title>Ny node överst i nodlistan</title><link>http://www.enkelmedia.se/blogg/2009/6/30/ny-node-overst-i-nodlistan.aspx</link><pubDate>ti, 30 jun 2009 16:27:00 +02:00</pubDate><guid>http://www.enkelmedia.se/blogg/2009/6/30/ny-node-overst-i-nodlistan.aspx</guid><description><![CDATA[
<p>Jag har byggt ett system till en kund som arbetar med <a
href="http://www.soundforce.se/" target="_blank">ljud och ljus</a>.
Kunden uppdaterar själv sidan med Umbraco 4.0.2. Sidan är uppbyggd
med moduler med text, bild, bildspel, video osv. Dessa sorteras
sedan och visas i den ordning som listan är sorterad.</p>

<p>&nbsp;</p>

<p>En frustrerade sak som jag upptäckte var att Umbraco automatiskt
lägger till en ny nod längst ned i nodlistan. Ofta vill man ju att
nya inlägg/noder ska hamna högst upp. Att sortera i omvänd ordning
blir ologiskt - noderna bör ju visas på samma sätt i nodlistan som
på själva sidan. Problemet med att Umbraco lägger nya noder längst
ned gör att man efter varje nytt inlägg måste sorta för att få de
nya inlägget/noden högst upp.</p>

<p>&nbsp;</p>

<p>För att komma runt detta och få mina nya noder att hamna högst
upp skapade jag en metod som prenumererar på händelsen
"umbraco.BusinessLogic.Actions.ActionNew()" som aktiveras när en ny
nod har skapats. Läs mer om händelser i på <a
href="http://umbraco.org/documentation/books/creating-and-using-an-action-handler"
 target="_blank">umbraco.org</a>.<br />
<br />
 Följande kod gör att en ny nod automatiskt hamnar högst upp i
nodlistan istället för tvärtom:</p>

<p>&nbsp;</p>

<div dir="ltr" id="CodeDiv">
<pre class="brush: csharp">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using umbraco;
using umbraco.interfaces;
 
using umbraco.BusinessLogic.Actions;
using umbraco.BusinessLogic.console;
using umbraco.cms.businesslogic.web;
 
namespace em.umb.sortnewnode
{
   
    public class DefaultValueHandler : umbraco.BusinessLogic.Actions.IActionHandler
    {
        string umbraco.BusinessLogic.Actions.IActionHandler.HandlerName()
        {
            return "em.umb.sortnewnode";
        }
 
        umbraco.interfaces.IAction[] umbraco.BusinessLogic.Actions.IActionHandler.ReturnActions()
        {
            return new umbraco.interfaces.IAction[] { new umbraco.BusinessLogic.Actions.ActionNew() };
        }
 
       
        Boolean umbraco.BusinessLogic.Actions.IActionHandler.Execute(umbraco.cms.businesslogic.web.Document documentObject, umbraco.interfaces.IAction action)
        {
           
 
            // Getting the fist node.
 
            Document.GetChildrenForTree(documentObject.Id);
 
 
 
           // Creating a generic list of Documents
            List&lt;Document&gt; docs = new List&lt;Document&gt;();
 
 
 
            foreach(IconI d in documentObject.Parent.Children) {
                docs.Add(new Document(d.UniqueId));
            }
 

            // Sorting the list by sortOrder using Linq.
 
            var res = (from d in docs
                       orderby d.sortOrder ascending
                       select d);
 
 
 
           // Picking the first node
 
            Document firstDoc = res.First();
 
 
 
           // Setting sortOrder on the new node, by taking the first nod minus 5.
 
            documentObject.sortOrder = firstDoc.sortOrder - 5;
 
 
 
            return true;
 
        }
    }
 
}
</pre>
</div>

<p>&nbsp;</p>

<p>Självklart är jag medveten om att man kanske vill kunna ställa
in detta på katalognivå eller kanske confa det i web-config - har
dock inte behövt denna funktionalitet. Lovar att återkomma med
eventuella uppdateringar.</p>
]]></description></item><item><title>Stippa HTML-taggar via XSLT och C-Sharp</title><link>http://www.enkelmedia.se/blogg/2009/3/6/stippa-html-taggar-via-xslt-och-c-sharp.aspx</link><pubDate>fr, 06 mar 2009 19:26:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2009/3/6/stippa-html-taggar-via-xslt-och-c-sharp.aspx</guid><description><![CDATA[
<p>När innehåll från en html-editor skall visas i listor eller i
andra flöden kan det vara smidigt att "stippta" eller
radera/filtrera bort HTML-taggar.</p>

<p>&nbsp;</p>

<p>Alltså detta:</p>

<div id="CodeDiv" dir="ltr">
<pre class="brush: xml">
&lt;h1&gt;Hello World&lt;/h1&gt;
&lt;p&gt;I´m here&lt;/p&gt;
</pre>
</div>

<p>Blir till:</p>

<div id="CodeDiv" dir="ltr">
<pre class="brush: xml">
Hello World
I´m here
</pre>
</div>

<p>Hur gör man då? Faktum är att lösningen är väldigt enkel. Jag
skapade en egen c-sharp funktion som kör ett regex och sedan
beräknar längden på inlägget för att veta om det skall kortas ned
eller inte:</p>

<div id="CodeDiv" dir="ltr">
<pre class="brush: xml">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE xsl:stylesheet [ &lt;!ENTITY nbsp "&nbsp;"&gt; ]&gt;
&lt;xsl:stylesheet
 version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxml="urn:schemas-microsoft-com:xslt"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:umbraco.library="urn:umbraco.library"
 xmlns:em="urn:em"
 exclude-result-prefixes="msxml umbraco.library"&gt;


&lt;xsl:output method="xml" omit-xml-declaration="yes" /&gt;

&lt;xsl:param name="currentPage"/&gt;

&lt;!-- ******* SCRIPTS STARTS HERE *********** --&gt;

&lt;msxsl:script language="CSharp" implements-prefix="em"&gt;
&lt;![CDATA[

// Removes all HTML-taggs from parameter-string

public string generatePreview(string strHTML) {
 
 // Setting default string-length
 int intDefaultLength = 200;

// Removing HTML-tags using regex
 strHTML= Regex.Replace(strHTML, "&lt;[^&gt;]*&gt;", String.Empty);

 
 if(strHTML.Length &gt; intDefaultLength) {
  return strHTML.Substring(0,intDefaultLength) + "...";
 }
 else {
  return strHTML;
 }
}

]]&gt;
&lt;/msxsl:script&gt;

 &lt;!-- ******* SCRIPTS ENDSHERE *********** --&gt;

 

&lt;xsl:template match="/"&gt;

&lt;!-- The fun starts here --&gt;

  &lt;p&gt;&lt;xsl:value-of select="em:generatePreview($currentPage/data [@alias = 'HTMLContent'])" disable-output-escaping="yes"/&gt;&lt;/p&gt;

 

&lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;
</pre>
</div>

<p><br />
</p>

<p>Självklart kan man,&nbsp; om man vill skapa och kompilera sin
egen extension till XSLT, då kan man ha med denna funktionalitet i
sin extention. Detta är att föredra om man ska använda funktionen
på många olika XSLT-mallar.</p>
]]></description></item><item><title>Stilmallar/CSS i Umbracos editor</title><link>http://www.enkelmedia.se/blogg/2009/2/23/stilmallarcss-i-umbracos-editor.aspx</link><pubDate>må, 23 feb 2009 16:41:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2009/2/23/stilmallarcss-i-umbracos-editor.aspx</guid><description><![CDATA[
<p>När man lägger till en ny stillmall (CSS) i Umbraco viasas den
inte automatiskt när du redigerar innehåll i WYSIWYG-editorn
TinyMCE.<br />
<br />
 För att stillmallen ska "slå igenom" och synas i editorn måste man
kryssa för stillmallen i developer-delen.</p>

<p>&nbsp;</p>

<ul>
<li>Gå till Developer</li>

<li>Öppna upp "Data Types" och klicka på "Richtext editor".</li>

<li>Kryssa i de stilmallar du vill ska synas i editorn under
"Related stylesheets".</li>

<li>Spara och nu är det bara att köra.</li>

<li>TIPS: Skapa en speciallstillmall om du tex vill ha en annan
bakgrund i editorn än på själva sidan. Denna stilmall använder
endast i editorn, inte i själva HTML-koden.</li>
</ul>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><img src="http://www.enkelmedia.se/media/3512/datatypes_richtext_css.jpg" width="493" height="216" alt="Datatypes _richtext _css"/></p>
]]></description></item><item><title>Classer i TinyMCE editorns dropdown</title><link>http://www.enkelmedia.se/blogg/2009/2/23/classer-i-tinymce-editorns-dropdown.aspx</link><pubDate>må, 23 feb 2009 16:39:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2009/2/23/classer-i-tinymce-editorns-dropdown.aspx</guid><description><![CDATA[
<p>Umbracos inbyggda texteditor "Richtext editor" som baseras på
TinyMCE 3 har en dropdown som heter "Choose style".</p>

<p>&nbsp;</p>

<p><img src="http://www.enkelmedia.se/media/3501/choose_style_dropdown.jpg" width="400" height="94" alt="Choose _style _dropdown"/></p>

<p><em>Standardinställningen i TinyMCE är att alla klasser i de
stillmallar som är bundna till editorn ska visas i dropdownen.
Eftersom det oftast finns massa klasser i dessa stilmallar som man
inte vill ska synas i listan har Umbraco en annan lösning.<br />
<br />
</em> <strong>Så här fixar du en ny klass i listan "Choose
style"</strong></p>

<ul>
<li>Klicka dig till "Settings" och expandera "Stylesheets". Välj en
av de stillmallar som visas i Umbracos Richtext editor.</li>

<li>Högerklicka och välj "Create" för att skapa en ny
under-klass.</li>

<li>Döp den nya stilen till önskat namn, i rutan "styles" kan du
sedan skriva CSS-markup.</li>

<li>Denna markup syns inte automatiskt i editor, du måste också
lägga till denna markup i din stillmall. I detta fell i mallen
screen.</li>
</ul>

<p>&nbsp;</p>

<p><img src="http://www.enkelmedia.se/media/3496/choose_style_propertys.jpg" width="416" height="397" alt="Datatypes _richtext _css"/></p>
]]></description></item><item><title>Arbeta med Umbraco i Visual Studio 2008</title><link>http://www.enkelmedia.se/blogg/2009/2/6/arbeta-med-umbraco-i-visual-studio-2008.aspx</link><pubDate>fr, 06 feb 2009 21:16:00 +01:00</pubDate><guid>http://www.enkelmedia.se/blogg/2009/2/6/arbeta-med-umbraco-i-visual-studio-2008.aspx</guid><description><![CDATA[
<p>Ett tips för dig som utvecklar umbraco-lösningar är såklart att
använda Visual Studio.<br />
<br />
 Umbraco har ju möjligheta att redigera XSLT, CSS, JavaScript och
även HTML-mallar i sitt admingränsnitt.<br />
<br />
 Däremot missar man ju debugging och mycket annat som kommer
tillsammans med Visual Studio.<br />
 Om du vill utveckla och debugga med Visual Studio 2008, gör
såhär:</p>

<p>&nbsp;</p>

<p>1. Skapa en ny Umbraco-installation</p>

<p>Ställ in databas-koppling, rättigheter osv. Filerna kan tex
hamna i c:\inetpub\wwwroot\umbraco</p>

<p>&nbsp;</p>

<p>2. Skapa ett nytt "Website Application Project"</p>

<p>Detta projekt ska skapas i en annan mapp än din umbraco
installation.</p>

<p>Lägg till de mappar för de filer du vill kunna arbeta med. Jag
har följande:<br />
<br />
 &nbsp;&nbsp;&nbsp; * /css<br />
 &nbsp;&nbsp;&nbsp; * /scripts<br />
 &nbsp;&nbsp;&nbsp; * /xslt<br />
 &nbsp;&nbsp;&nbsp; * /masterpages<br />
 &nbsp;&nbsp;&nbsp; * /usercontrols</p>

<p>&nbsp;</p>

<p>3. Lägg till ett "Post Build Event"<br />
 Detta körs efter att projektet har kompilerats. Syftet är att vi
ska kopiera filerna från vår Web Application till vår Umbraco
installation.<br />
<br />
 Klicka på "Soulution&gt;Properties&gt;Build Events" och lägg till
följande kod under "Post Build Events" - alltså det som sker när
projektet är kompilerat.</p>

<div id="CodeDiv" dir="ltr">
<pre class="brush: xml">
XCOPY "$(ProjectDir)bin\$(ProjectName)*.*" "C:\Inetpub\soundforce - umbraco4\bin\" /y /S
XCOPY "$(ProjectDir)usercontrols\*.ascx" "C:\Inetpub\soundforce - umbraco4\usercontrols\" /y /S
XCOPY "$(ProjectDir)xslt\*.xslt" "C:\Inetpub\umbraco4\xslt\" /y /S
XCOPY "$(ProjectDir)css\*.css" "C:\Inetpub\umbraco4\css\" /y /S
XCOPY "$(ProjectDir)scripts\*.js" "C:\Inetpub\umbraco4\scripts\" /y /S
XCOPY "$(ProjectDir)\*.pbd" "C:\Inetpub\umbraco4\" /y /S
</pre>
</div>

<p><br />
</p>

<p>Parametern /y gör att filer skrivs över, och /S att även
underkataloger inkluderas.</p>

<p>&nbsp;</p>

<p>4. För att debuga<br />
<br />
 &nbsp;&nbsp;&nbsp; * Öppna siten i din webbläsrae<br />
 &nbsp;&nbsp;&nbsp; * I Visual Studio väljer du Debug &gt; Attach
to Process och väljer w3wp.exe från listan. (På IIS on XP/2000
heter proccesen asp_net.exe).<br />
 &nbsp;&nbsp;&nbsp; * Var noga med att *.pbd-filerna kopieras till
umbraco-installationen.<br />
 &nbsp;&nbsp;&nbsp; * Debugga för fulla muggar!</p>
]]></description></item></channel></rss>  

