Scenariet for serversidevalidering i Tea Commerce
Helt grundlæggende har jeg tænkt mig, at validere det der oftest er step 2, hvor der skal indtastes kundeoplysninger. Min løsning skal tage sørge for, at tjekke om data er udfyldt korrekt, hvis man er på et step højere end 2.Der skal også tages højde for sprogversionering af kurven. Det betyder at jeg ikke vil hardcode nogen id’er i min serverside kode. Der skal også tjekkes om der er en ordre og om ordren har tilknyttet ordrelinier. Hvis ikke ordren validerer vil jeg sende folk tilbage til det step, som ikke validerer.
Hvordan man kan lave serversidevalidering i Tea Commerce
Serversidevalidering er ikke standard i Tea Commerce. Til gengæld er det med Tea Commerce’s .NET API let, at lave det selv. Der er uden tvivl masser af måder, at løse problemstillingen på. Jeg har dog valgt, at gøre det med en Umbraco XSLT library extension.Jeg vil derfor lave en Umbraco XSLT library metode, som kan kaldes fra alle xslt’er. Nærmere bestemt skal den kaldes på de steps der kommer efter step 2, for på den måde at kunne sende kunden tilbage.
Umbraco XSLT library extensionen
Der er ikke meget at sige og jeg vil egentligt mest lade koden og de indlagte kommentarer tale for sig. Dog kan jeg give denne huskeliste med de ting man skal have ordnet før det vil virke. Koden til det hele har jeg sat ind lidt længere nede.- Byg en dll med library extensionen og smid den op i bin mappen
- Registrer din XSLT extension i filen /config/xsltExtensions.config
- Lav kaldet i dine xslt’er. Husk at den nye extension også skal registreres i selve xslt’en. Nye xslt’er får automatisk din extension sat ind i xsl:stylesheet tag’et. Du kan derfor eventuelt lave en ny og kopiere hele toppen fra den
Fuld XSLT library extension kode
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TeaCommerce;
using TeaCommerce.Data;
namespace ServersideValidation {
public class Library {
public Library() {
//This has to be here, because of the way umbraco runs xslt extension
}
public static string ValidateOrder( int currentStepId, int cartStep2Id ) {
try {
//Test to make sure we are not logged in at the back end
var test = HttpContext.Current.CurrentHandler as umbraco.BasePages.UmbracoEnsuredPage;
if ( test == null ) {
//Get the order
Order order = TeaCommerce.Razor.TeaCommerce.GetOrder();
//If there is no order we redirect to step 1 of the cart
if ( order == null || order.OrderLines.Count() == 0 )
HttpContext.Current.Response.Redirect( umbraco.library.NiceUrl( cartStep2Id ) + "?validate=false", true );
//If the current step is not step 1 we validate the data on that step
if ( currentStepId != cartStep2Id ) {
//Get the values we must validate
string firstName = order.GetPropertyValue( "firstName" ),
lastName = order.GetPropertyValue( "lastName" ),
streetAddress = order.GetPropertyValue( "streetAddress" ),
zipCode = order.GetPropertyValue( "zipCode" ),
city = order.GetPropertyValue( "city" ),
email = order.GetPropertyValue( "email" );
//Simple validation of the values
if ( string.IsNullOrEmpty( firstName ) ||
string.IsNullOrEmpty( lastName ) ||
string.IsNullOrEmpty( streetAddress ) ||
string.IsNullOrEmpty( zipCode ) ||
string.IsNullOrEmpty( city ) ||
string.IsNullOrEmpty( email ) ) {
//Go back to step 1 if validation fails
HttpContext.Current.Response.Redirect( umbraco.library.NiceUrl( cartStep2Id ) + "?validate=false", true );
}
}
}
} catch ( Exception ex ) {
return ex.Message;
}
return string.Empty;
}
}
}
Registreringen i Umbraco’s /config/xsltExtensions.config fil
Kaldet i cartStep03.xslt (Og eventuelt andre efterfølgende)
<xsl:template match="/">
<xsl:variable name="step2PageId" select="umbraco.library:GetDictionaryItem('step2PageId')"/>
<xsl:value-of select="ServersideValidation:ValidateOrder($currentPage/@id, $step2PageId)" />
English version
