# DEMO Progressive Enhancement package Public::Estash; use base main; use strict; use warnings; use ScaligerLang; # Wenn keine Parameter im Request anliegen sub browse{ my $self = shift; # Eingabefeld mit aktuellem Datum vorbelegen my $sca = ScaligerLang->new; $self->{STASH}{date} = $sca->gregdate; $self->{STASH}{result} = "Bitte Datum eingeben und auf Prüfen klicken!"; } # Parameter Controller sub control{ my $self = shift; $self->{STASH}{param} = 1; # Eingegebenes Datum prüfen if( $self->param('cc') ){ $self->{STASH}{date} = $self->trim($self->ents($self->param('date'))) || 'Nichts eingegeben!'; # Scaliger nutzt das Exceptionmodell my $sca = ScaligerLang->new( date => $self->{STASH}{date}); # Platzhalter fürs HTML Template befüllen if($sca){ $self->{STASH}{result} = 'Das Datum ist gültig!'; $self->{STASH}{valide} = 1; $self->{STASH}{julidate} = $sca->julidate; $self->{STASH}{gregdate} = $sca->gregdate; $self->{STASH}{wochentag} = $sca->wochentag; $self->{STASH}{age} = $sca->age eq 'G' ? 'Gregorianischer Kalender' : 'Julianischer Kalender'; $self->{STASH}{jd} = $sca->jd; $self->{STASH}{isleap} = $sca->leap eq 'Y' ? 'Ja' : 'Nein'; } else{ # Eingegebenes Datum ungültig $self->{STASH}{result} = $@; } # Ajax, da wird nur der STASH serialisiert $self->{CONTENT} = $self->encode_stash if $ENV{HTTP_X_HR}; } # Diese Datei im Browser ausgeben elsif( $self->param('src') ){ $self->nocache; $self->header('Content-Type','text/plain; Charset=UTF-8'); my $fh = IO::File->new; $fh->open($INC{'Public/Estash.pm'},'r') or die "$!\n"; read($fh, $self->{CONTENT}, -s $fh); $fh->close; } } # HTML Template unterhalb des DATA Token 1;######################################################################### __DATA__

Diese Anwendung ist eine DEMO. Wenn ist, erfolgt der Request mit Ajax, ansonsten als ein normaler Submit.

Zu Prüfen ist ein eingegebenes Datum

Hier ist das Ergebnis: %result%

%if_valide%

Was das Datum noch verrät

%endif% %if_param%

Seite neu laden

%endif%

Erläuterungen

Werfen Sie einen Blick auf die Sources! Was Sie sehen ist eine sogenannte Kompaktklasse, Perlcode und HTML Template in einer einzigen Datei und doch sauber voneinander getrennt. Das native HTML-Template erkennen Sie an der Schreibweise der Platzhalter wie %result%. Im Template für JavaScript hingegen sehen die Platzhalter so aus: @result@

Wenn JavaScript verfügbar ist, wird das Submit-Event abgefangen und anstelle dessen erfolgt das Senden der Eingaben mit AJAX. Damit bei gleichen Request-Parametern serverseitig ein native Submit von Ajax unterschieden werden kann, sendet AJAX einen Custom-Header. Im Controller bzw. in der Parameter-Kontrollstruktur wird also festgestellt, ob ein solcher Request-Header vorliegt. Ist das der Falll, wird der STASH, eine Hash-Referenz welche die Reponsedaten puffert, serialisiert was die Methode encode_stash() erledigt. Das Gegenstück zu dieser Methode findet sich in request.js::decode_stash() womit sämtliche Daten aus dem STASH im Browser wiederhergestellt und in das DOM gerendert werden.

Anders jedoch bei einem native Submit, da wird der STASH serverseitig in das HTML-Template gerendert und eine komplette HTML-Datei als Response ausgeliefert. Insgesamt ergeben sich auf diese Art und Weise fürs Framework einheitliche Prozesse. Die Methode encode_stash() verwendet per Default einen eigenen Serializer, kann jedoch auch aus dem STASH einen JSON-String erzeugen und ist darüber hinaus auch offen für weitere Serialize-Algorithmen.

Dasselbe gilt natürlich auch für die JavaScript-Funktion decode_stash(response,'json') für den umgekehrten Vorgang.