Thread Zwei Array ein Hash mit CGI (18 answers)
Opened by bianca at 2010-06-28 17:44

renee
 2010-06-29 09:28
#139163 #139163
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich sehe generelle Vorteile bei der Verwendung von einem Template-System:

* "Design" und Programm sind voneinander getrennt. Bei einer Änderung am HTML läuft man nicht Gefahr, einen Programmierfehler einzubauen.

* Man sieht leichter, was gemacht werden soll.

* Die Verwendung von CGI.pm ist für die HTML-Generierung zu "sperrig".

* Manche Templating-System erlauben so etwas wie automatisches encoding von HTML-Entities, so dass man sich nicht mehr selbst darum kümmern muss.

* Alles in allem wird die Anwendung wartbarer

Vergleiche
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl

use strict;
use warnings;
use HTML::Template::Compiled;

my $bad_userinput = "<script>alert('test');</script>";
my $options = [
    { value => 1, label => 'option 1' },
    { value => 2, label => 'option 2' },
];

my $template = HTML::Template::Compiled->new(
    filename => 'test.tmpl',
    default_escape => 'html',
);

$template->params(
    bad_userinput => $bad_userinput,
    options => $options,
);

print $template->output;


mit dem Template

Code (html): (dl )
1
2
3
4
5
6
7
8
9
<html>
  <body>
    <p>Boese Benutzereingabe: <%= bad_userinput %></p>
    <select>
      <%LOOP options %><option value="<%= value %>"><%= label %></option>
      <%/LOOP %>
    </select>
  </body>
</html>


gegenüber

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use HTML::Entities;

my $bad_userinput = "<script>alert('test');</script>";
my %options = (
    'option 1' => 1,
    'option 2' => 2,
);

my $escaped_input = encode_entities( $bad_userinput );

print CGI->start_html() . 
      CGI->p( 'Boese Benutzereingabe ' . $escaped_input ) .
      CGI->popup_menu(
          -values => [ keys %options ],
          -labels => \%options,
      ) . 
      CGI->end_html();


Und das ist jetzt eine mehr als einfache Seite und die HTML-Ausgabe kann hier gesammelt am Ende gemacht werden. Jetzt stell Dir aber vor, dass das ein sehr langes Programm ist, bei dem die ganzen Informationen über das komplette Programm gesammelt werden. Machst Du die HTML-Ausgabe am Ende, brauchst Du einige "globale" Variablen. Machst Du die HTML-Ausgabe zwischendrin, hast Du die Methodenaufrufe irgendwo im Code versteckt. Dann such mal die Stelle, an der Du das "<p>" (bzw. p() ) zu "<b>" (bzw. b() ) abändern musst.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/

View full thread Zwei Array ein Hash mit CGI