fredag 2 november 2007

Visa postade XForms formulär utan editeringsmöjlighet

I bland är det önskvärt att kunna visa innehållet i ett postat formulär för användaren som postade det utan att ge användare möjlighet att redigera postad data.

Det första att göra är att skapa en instans av det aktuella formuläret med metoden XForm.CreateInstance. Om id för postad data är känt kan det skickas som argument med CreateInstance, annars går det att använda GetPostedData på det skapade XForms objektet för att hämta en lista med postade dataobjekt. Loopa igenom listan och plocka ut användarens data. Slutligen sätts formulärets data genom att tilldela dataobjektet till FormControl.Data.

När nu formuläret renderas är alla fält ifyllda med användarens postade data. Men formuläret är editerbart. För att undvika att användaren postar om formuläret behöver fälten låsas och eventuella submit-knappar tas bort.


Börja med att lägga till en event hanterare i OnLoad för kontrollen/sidan.

FormControl.ControlsCreated += new EventHandler(FormControl_ControlsCreated); }

Skapa en delegat som hanterar eventet:

void FormControl_ControlsCreated(object sender, EventArgs e) {

foreach (System.Web.UI.Control var in FormControl.Controls) {
if (var.GetType().Equals(typeof(XForms.WebControls.TextArea)))
((XForms.WebControls.TextArea)var).Attributes.Add("readonly", "readonly");
if (var.GetType().Equals(typeof(XForms.WebControls.Input)))

((XForms.WebControls.Input)var).Attributes.Add("readonly", "readonly");
if (var.GetType().Equals(typeof(XForms.WebControls.Submit)))
// logik för att ta bort en kontroll säkert
}
}

Nyckeln till att låsa fälten att lägga till ett attribut som inkluderas i renderingen av kontrollen.

Det går också att plocka ut input-kontroller ur ett XForms-formulär med

System.Collections.ArrayList al = FormControl.ExtractXFormControls();

Den här informationen finns på EPiServers hemsida men jag rekommenderar även användandet av Reflector för att se hur saker och ting sköts under skalet i EPiServer.

onsdag 31 oktober 2007

Simsalabim - TextArea blir Editor!

Häromveckan upptäckte jag den hårda vägen hur EPiServers egenskapstyp LongString, eller lång sträng, tolkas annorlunda i redigeringsläge beroende av vilka funktionsrättigheter den inloggade användaren har satta.

I mitt fall hade jag konfigurerat egenskapen för att bete sig som en TextArea, dvs jag avmarkerade alla kryssrutor när jag la till egenskapen på sidmallen. Anledningen var att jag ville utnyttja möjligheten att separera textsträngar med radbrytningar. Det fungerade fint i utvecklings- och testmiljön, men havererade utan nåd i kundens driftmiljö.

När jag gick in redigeringsläget för sidan såg jag hur min TextArea tolkades som en editor med alla funktioner som det innebär. Mina radbrytningar var som bortblåsta och kundens webbsida fungerade inget vidare.

Efter att ha vänt mig till EPiServers Support är problemet slutligen löst:

Min användare var medlem av en grupp som var satt att ha "Alla funktioner tillgängliga i editorn". Inställningen återfinns i EPiServers administrationsläge under fliken Konfig -> Säkerhet -> Åtkomst till funktioner. Efter att jag tagit bort gruppen fungerade min TextArea som en - TextArea.

Lesson learned!

Hello World!