TUTORIAL: Intro à l'aide de Embedded Perl Mason
- mk27
- Proficient


- Inscription: Juin 09, 2009
- Messages: 334
- Status: Offline
Introduction
Mason est un module Perl qui fonctionne avec apaches mod_perl pour présenter les pages Web avec Perl inclus. Son une belle alternative à PHP si vous connaissez et aimez perl. Pour utiliser Mason avec ce tutoriel, vous avez besoin de faire trois ou quatre choses:
- installer HTML:: Mason de CPAN . Soyez averti, HTML:: Mason exige un assez grand nombre d'autres modules, de sorte que vous souhaitez utiliser mai CPAN.pm à l'auto-install.
- installer mod_perl . Comment vous faites cela dépend du système, et vous ne devez exécuter Apache.
- lire les chapitres de deux ou trois premières Le Livre Mason , Qui est publié par OReilly mais aussi gratuitement en ligne et facilement téléchargeables. Vous pouvez essayer et faites-le »en même temps" si vous voulez. Ils sont courts chapitres et le livre est joliment écrit de l'OMI (merci beaucoup à Dave Rolsky et Ken Williams pour la rendre accessible! ) Il ya très peu de ressources Mason pour les débutants sur le net, c'est pourquoi j'ai décidé d'écrire ce tutoriel; à cette fin, je ne vais pas répéter les bases de maçon comme décrit dans «le livre» mais présentent certains documents complémentaires. Le tutoriel suppose que vous comprenez au moins les basée sur les composants structure d'un site maçon, qui est détaillée dans le chapitre 1 de «le livre» .
- allaient aussi à utiliser une base de données sqlite3, géré via Perls DBI et DBD:: SQLite, vous devez donc ceux qui sont trop.
Il est largement utilisé Perl cadre d'applications Web, Catalyst , Qui s'apparente à Ruby on Rails, Django, ou ASP.NET, qui utilise maçon. Alors que la démo tutoriel ressemble à un simple framework MVC web-app dans la mesure où elle est basée autour d'une base de données SQL, il n'implique pas de catalyseur, et je n'utilise pas le vocabulaire MVC pour le décrire. L'un des objectifs de ce tutoriel est de démontrer comment SQL et AJAX peut être utilisé en conjonction avec Mason, tandis que les exemples sont assez simples, je ne présume une certaine familiarité avec les deux. Toutefois, vous ne n'avez pas besoin de rien savoir MVC ou web-app cadres.
Le. htaccess, et préoccupations liées à
Le Livre Mason inclut des instructions sur la façon de configurer correctement Apache, mod_perl, soit en utilisant, ou avec CGI plaine. Mod_perl est préférable, et l'idéal est de faire la configuration dans httpd.conf. Toutefois, en accord avec mon intention de "présenter des alternatives», la démo utilisée dans le tutoriel utilise à la place un fichier. htaccess comme ceci:
Code: [ Select ]
PerlRequire /var/www/html/zoodemo/apache-perl.pl
SetHandler perl-script
PerlHandler HTML::Mason::ApacheHandler
AddType text/html mhtml
AddType text/html comp
AddHandler perl-script mhtml comp
<Files *>
Header set Cache-Control: "private, pre-check=0, post-check=0, max-age=0"
Header set Expires: 0
Header set Pragma: no-cache
</Files>
- PerlRequire /var/www/html/zoodemo/apache-perl.pl
- SetHandler perl-script
- PerlHandler HTML::Mason::ApacheHandler
- AddType text/html mhtml
- AddType text/html comp
- AddHandler perl-script mhtml comp
- <Files *>
- Header set Cache-Control: "private, pre-check=0, post-check=0, max-age=0"
- Header set Expires: 0
- Header set Pragma: no-cache
- </Files>
La section "Files" est juste une norme no-cache bit pour utilisation dans le développement, de sorte que vous pouvez modifier les fichiers et ne pas avoir à traiter avec les versions Apache mis en cache. La partie la plus importante réside dans l'PerlHandler, AddType et commandes AddHandler. Vous pouvez appeler vos fichiers que vous voulez, mais (une) Convention est d'utiliser les préfixes. Mhtml et. Comp. Il ya une certaine Suite de la discussion dans la FAQ Mason à Mason HQ ".
En outre, mod_perl doit charger les modules requis; ceux ci sont listés dans apache-perl.pl:
Code: [ Select ]
use HTML::Mason::ApacheHandler;
use CGI;
1;
- use HTML::Mason::ApacheHandler;
- use CGI;
- 1;
Vous pouvez effectivement appeler ce fichier que vous voulez tant que sa référencé correctement avec PerlRequire dans le fichier. Htaccess. Notez le vrai retour ( "1;") à la fin. Ceci est la liste des modules pour le maçon / apache mod_perl processus; modules utilisés dans les pages réelles (comme DBI) doivent être inclus dans ces pages (et nb. -- "utiliser" et pas "require") Et ne devraient pas être inclus ici.
Structure du site
Le tutorial comporte un site simple, Le Mason Internet Zoo . Ce site est contenu dans la structure de répertoires suivante:
Code: [ Select ]
db/
newDB.pl
zoodemo.db
js/
.htaccess
prototype.js
site_specific.js
log/
DBI_trace.log*
perl.log*
.htaccess
INSTALL
ZooAnimal.pm
ZooDemo.pm
animal.comp
animals.mhtml
apache-perl.pl
cage.comp
cages.mhtml
class.comp
classes.mhtml
create_animal.comp
db_error.mhtml
header.comp
index.html
new_animal.comp
style.css
*do not exist initially and can be erased later
- db/
- newDB.pl
- zoodemo.db
- js/
- .htaccess
- prototype.js
- site_specific.js
- log/
- DBI_trace.log*
- perl.log*
- .htaccess
- INSTALL
- ZooAnimal.pm
- ZooDemo.pm
- animal.comp
- animals.mhtml
- apache-perl.pl
- cage.comp
- cages.mhtml
- class.comp
- classes.mhtml
- create_animal.comp
- db_error.mhtml
- header.comp
- index.html
- new_animal.comp
- style.css
- *do not exist initially and can be erased later
Vous pouvez télécharger la démo comme un fichier zip:
Attachments:
Vous devrez rechercher à travers ce changement et les références au chemin / var / www / html / zoodemo cas échéant, si vous ne pouvez pas l'utiliser dans ce répertoire...INSTALL contient quelques brèves instructions.
Je devrais bientôt avoir une sur-host en ligne pour Le Mason Internet Zoo , Mais pour le moment, si vous voulez voir la démo, vous devrez l'installer vous-même, qui devrait être assez facile et peut vous familiariser avec quelques points de base.
index.html
Thats le premier document que nous voyons. Tant que vous avez le fichier. Htaccess correct et mod_perl installé, Apache processus d'indexation. html avec Mason, donc:
Code: [ Select ]
<& header.comp, title=>"Zoo Demo", heading=>"Mason Internet Zoo"&>
<ul>
<li><a href="animals.mhtml">Animals</a>
<li><a href="cages.mhtml">Cages</a>
<li><a href="classes.mhtml">Classes</a>
</ul>
</body></html>
- <& header.comp, title=>"Zoo Demo", heading=>"Mason Internet Zoo"&>
- <ul>
- <li><a href="animals.mhtml">Animals</a>
- <li><a href="cages.mhtml">Cages</a>
- <li><a href="classes.mhtml">Classes</a>
- </ul>
- </body></html>
La ligne est ici le grand en rouge, mais depuis que le youve a lu un chapitre de «le livre» vous comprenez que cela signifie pour inclure un autre fichier ici, dans ce cas header.comp , Et de le passer deux variables -- Titre et rubrique . So heres header.comp:
Code: [ Select ]
<html><head>
<title><% $ARGS{title} |h %></title>
<link rel="stylesheet" type="text/css" href="style.css"></style>
<script type="text/javascript" src="js/site_specific.js"></script>
<script type="text/javascript" src="js/prototype.js"></script>
</head>
<body text="#cccccc" bgcolor="#222222">
<div id="utildiv" class="utility"></div>
<h1><% $ARGS{heading} |h %></h1>
- <html><head>
- <title><% $ARGS{title} |h %></title>
- <link rel="stylesheet" type="text/css" href="style.css"></style>
- <script type="text/javascript" src="js/site_specific.js"></script>
- <script type="text/javascript" src="js/prototype.js"></script>
- </head>
- <body text="#cccccc" bgcolor="#222222">
- <div id="utildiv" class="utility"></div>
- <h1><% $ARGS{heading} |h %></h1>
en-tête. comp est une sorte de pré-wrap Im en utilisant toutes les pages. MHTML. Encore une fois, si vous lisez le chapitre 2 de «le livre» vous reconnaîtrez l'utilisation de l'% ARGS hachage qui est passé à la composante. Notez le "| h", ce qui est une fonction de maçon pour qualifier html caractères réservés qui mai être présents dans une variable, puisque la valeur réelle apparaît dans la source de la page réel passé au navigateur. Comme il est, je l'ai codé en dur le contrôle de toutes les instances au Zoo de ce composant particulier et n'ont pas à s'inquiéter de problèmes de caractères, mais sur le pressentiment que je mai dès à inclure des pages individuelles pour chaque animal en fonction des commentaires des utilisateurs, ils sont inclus ici.
Il existe un fichier Mason spéciale, le autohandler , Qui vous permet d'écrire un wrapper universelle pour tous les composants maçon, mais puisque certains des éléments Zoo sont effectivement contenu innerHTML pour une utilisation avec AJAX (en fait, tous les fichiers. Comp sauf header.comp sont tels), je ne utiliser un autohandler.
Sont également inclus dans header.comp sont "site_specific.js» et la volonté, librement distribuable prototype. js . Prototype nous donne accès à des fonctions AJAX simplifiée comme Ajax.Request. Im gonna utiliser ces surtout avec $ ( "utildiv"), créé dans l'autre ligne en rouge (haut). Note de classe CSS "utilité" est réglé display: none dans style.css, également inclus dans header.comp. Utildiv est un popup nous réutiliser avec Ajax.Updater pour des choses différentes dans toutes les pages. MHTML. Par exemple:
Code: [ Select ]
<& header.comp, title=>"Mason Internet Zoo", heading=>"Cages List"&>
<%init># cages.mhtml
BEGIN { push @INC,"/var/www/html/zoodemo"; }
use ZooDemo;
$m->interp->set_escape("j"=>\&js_esc);
my $db = db_handle();
my $sql = $db->prepare("select * from cages");
$sql->execute;
</%init>
<center>
% while (my @data=$sql->fetchrow_array()) {
<p class="link" onclick="new Ajax.Updater($('utildiv'),'cage.comp', { method: 'post',
parameters: { name: '<%$data[1]|j,h%>', id: '<%$data[0]%>' } });
$('utildiv').style.display='inline';"><%$data[1]|h%> (<%$data[2]%> species)
% }
</center>
</body></html>
- <& header.comp, title=>"Mason Internet Zoo", heading=>"Cages List"&>
- <%init># cages.mhtml
- BEGIN { push @INC,"/var/www/html/zoodemo"; }
- use ZooDemo;
- $m->interp->set_escape("j"=>\&js_esc);
- my $db = db_handle();
- my $sql = $db->prepare("select * from cages");
- $sql->execute;
- </%init>
- <center>
- % while (my @data=$sql->fetchrow_array()) {
- <p class="link" onclick="new Ajax.Updater($('utildiv'),'cage.comp', { method: 'post',
- parameters: { name: '<%$data[1]|j,h%>', id: '<%$data[0]%>' } });
- $('utildiv').style.display='inline';"><%$data[1]|h%> (<%$data[2]%> species)
- % }
- </center>
- </body></html>
Oui, un peu de javascript inline envahissante, a présenté de cette façon dans la démo pour la facilité d'illustration (puisque nous ne pouvons voir les perl / html contexte sans avoir à mon site plusieurs fichiers). Si vous préférez, il peut facilement être caché dans le fichier site_specific.js. La source réelle ici est cages.mhtml, où toutes les cages du zoo sont répertoriés. En cliquant sur une cage, vous obtenez un pop-up contenant la liste des animaux dans la cage.
Attachments:
La fonction init <%> bloc, partout où situé dans la page, est le code Perl exécuté avant toute chose est faite. Dans ce cas, nous faisons usage de ZooDemo.pm, qui contient quelques fonctions basiques, db_handle (), js_esc (), et log_msg ().
Code: [ Select ]
package ZooDemo;
use strict;
use DBI;
use base ("Exporter");
our @EXPORT = qw(db_handle js_esc log_msg);
our $path = "/var/www/html/zoodemo";
- package ZooDemo;
- use strict;
- use DBI;
- use base ("Exporter");
- our @EXPORT = qw(db_handle js_esc log_msg);
- our $path = "/var/www/html/zoodemo";
ZooDemo prend soin de chargement DBI et la connexion à la DB SQLite en fournissant db_handle () pour la gestion des erreurs, et. al (ce qui peut faire aussi des bases de commutation, etc, beaucoup plus simple). js_esc () est un gestionnaire personnalisé pour échapper les guillemets simples dans des variables qui sont passés aux fonctions javascript:
Code: [ Select ]
sub js_esc {
my $ref = shift;
$$ref =~ s/\*'/\'/g;
}
- sub js_esc {
- my $ref = shift;
- $$ref =~ s/\*'/\'/g;
- }
Ceci est enregistré avec Mason via le $ m-> interp-> set_escape (), comme indiqué plus haut, puis utilisé comme le "| h" fonction mentionnée plus tôt. Beau! Il est important d'utiliser le "j" avant la lettre "H" du pavillon. Prenez un survol de certains possible "source de la page" Résultat:
Code: [ Select ]
<p class="link" onclick="new Ajax.Updater($('utildiv'),'animal.comp', { method: 'post',
parameters: 'name=heap\'s moose &data=Rotunda&data=unknown'});
$('utildiv').style.display='inline';">heap's moose
- <p class="link" onclick="new Ajax.Updater($('utildiv'),'animal.comp', { method: 'post',
- parameters: 'name=heap\'s moose &data=Rotunda&data=unknown'});
- $('utildiv').style.display='inline';">heap's moose
Depuis elle est intégrée dans la source HTML, le pouvoir être rendus & #39; (par le drapeau | h) dans les deux endroits, même si il n'est pas nécessaire dans la balise js car elle serait précédée d'un \ en raison de l'| j pavillon. Toutefois, la variable pourrait avoir encore échappés et <ou> à elle aussi, donc nous devrions rester en sécurité et à l'utilisation de la H | et les | j Indicateur avec des variables pour javascipt. Lorsqu'il est passé à Ajax.Updater, cela termine en tant que "terril \ s orignal», heureusement, pas "terril \ & #39; s orignal ». L'exemple de la violette apparaît sur la page et ne fait pas partie du code JavaScript, donc il n'utilisait que le flag | h - par conséquent, aucune \ là.
Encore une fois, juste pour être clair: il n'ya pas de défaut | j drapeau, de sorte que vous pouvez utiliser vos propres idées ici. Il ya d'autres personnages qui peut entraîner une erreur js, mais le single-quote/apostrophe sera celle la plus couramment utilisée de façon légitime, et est également le plus dangereux à des fins malveillantes. Vous pouvez remplacer la valeur par défaut | Handler h ainsi que les notes FAQ:
Quote:
...ne fonctionnera pas avec les non-ISO-8559-1 encodages. Si vous utilisez un tel encodage et que vous souhaitez passer le «h» du pavillon pour échapper à tout l'ensemble minimal de caractères (<,>, &, "), mettez cela dans votre configuration d'Apache:
MasonEscapeFlags PerlSetVar "h => \ & HTML:: Mason:: Escapades:: basic_html_escape"
MasonEscapeFlags PerlSetVar "h => \ & HTML:: Mason:: Escapades:: basic_html_escape"
Database Integration
"cages.mhtml" et "cage.comp« à la fois d'interagir avec une base de données (DB / zoodemo.db). Im using DBI avec SQLite3. La base de données a été créée et pré-remplie avec db / newDB.pl, qui, si vous modifiez la DB, vous pouvez la supprimer et la remplacer en utilisant ce script pour restaurer l'état initial du zoo. Toutes les commandes SQL qui a créé les tableaux sont en newDB.pl. Parce que apache doit écrire à zoodemo.db, n'oubliez pas que sur un système de fichiers de type Unix, la propriété de celui-ci * et * dans le répertoire contenant doit être «apache. "apache (ou quel que soit le runtime UID d'apache est).
"zoodemo.db" contient trois tableaux (cages, les classes et les animaux), chacune utilisant une clé autoincrementing entier primaire "id" pour que nous puissions essayer de maintenir la base de données de travail par les règles du 3ème forme normale (3FN).
Une composante Mason accepter les arguments d'une autre composante maçon, comme dans le cas de index.html & header.comp ( <& En-tête. maquette, title => "Zoo Demo", titre => "Mason Internet Zoo" &> ), Ou en tant que «forme» des paramètres transmis via POST. À Le Mason Internet Zoo , L'affichage se fait avec Ajax.Updater (comme ci-dessus). Il ya une explication détaillée de cette AJAX sans () dans le chapitre 2 de «le livre» En tout cas, maçon et apache faire le travail, donc il n'y a pas de différence dans la composante de la façon dont les paramètres sont transmis. En cliquant sur une cage énumérés dans cages.mhtml sera pop-up utildiv la fenêtre contenant une instance de cage.comp, soit un par cage liste spécifique des animaux dans la cage de particulier. Donc, ce sera le innerHTML pour "utildiv« lorsque invoqué:
Code: [ Select ]
<%init># cage.comp
#called from cages.mhtml with args "name" "id"
BEGIN { push @INC,"/var/www/html/zoodemo" }
use ZooDemo ("db_handle");
my $db = db_handle();
my $sql = $db->prepare("select * from animals where cage_id=?;");
$sql->execute($ARGS{id});
</%init>
<h3><%$ARGS{name}|h%></h3>
<p>Contains:
<ul>
% while (my @data = $sql->fetchrow_array()) {
<li><%$data[1]|h%>
% }
% $db->disconnect;
</ul>
<p class="mini" align="center" onclick="$('utildiv').style.display='none';">[close]
- <%init># cage.comp
- #called from cages.mhtml with args "name" "id"
- BEGIN { push @INC,"/var/www/html/zoodemo" }
- use ZooDemo ("db_handle");
- my $db = db_handle();
- my $sql = $db->prepare("select * from animals where cage_id=?;");
- $sql->execute($ARGS{id});
- </%init>
- <h3><%$ARGS{name}|h%></h3>
- <p>Contains:
- <ul>
- % while (my @data = $sql->fetchrow_array()) {
- <li><%$data[1]|h%>
- % }
- % $db->disconnect;
- </ul>
- <p class="mini" align="center" onclick="$('utildiv').style.display='none';">[close]
Theres the $ ARGS hachage à nouveau, avec le "| h" pavillon; noter que nous n'ont pas vraiment besoin d'examiner les cages de table, puisque nous avons déjà le nom de la cage. Quelque chose à noter ici est l'utilisation d'un placeholder ( ? ) Dans l'appel select SQL ( «où cage_id = ? ». Cet espace réservé est rempli dans la -> execute () avec $ ARGS (id). Cela aurait pu être écrite:
Code: [ Select ]
my $sql = $db->prepare("select * from animals where cage_id='$ARGS{id}'");
$sql->execute();
- my $sql = $db->prepare("select * from animals where cage_id='$ARGS{id}'");
- $sql->execute();
Le point d'utiliser un espace réservé est de prévenir les abus de l'apostrophe (à nouveau) dans SQL injection les attaques contre la base de données.
"classes.mhtml" & "class.comp" fonctionnent exactement de la même manière que cages.mhtml & cages.comp faire. Cet extrait contient également les trois moyens de "consolider" le Perl dans ce qui est apparemment une page HTML:
- Perl-sections seulement entre <% perl> </% perl> ou <init%> </ init%> tags (il y en a d'autres, mais ce sont les deux plus courantes).
- Mixte en html avec <%.....%>
- Alternant avec% HTML à l'aide au début d'une ligne.
Il pourrait être utile de mentionner à ce stade que le ARGS% hash peut être pré-traités, en plaçant les paires clé / valeur dans des variables individuelles (en utilisant le nom de la clé) pour la simplification. Ceci est particulièrement pratique si vous voulez passer un tableau ou un hachage en utilisant une référence dans l'appelant. Le mécanisme à cet effet dans l'appelé est un <% args> Bloquer. Il ya un explication complète au chapitre 2 de «le livre» Internet Zoo démo contient un exemple de comment utiliser un <% args> block:
Code: [ Select ]
<%args># animal.comp
#called from animals.mhtml with args "name" and [color=#FF0000]"data" (x2)
$name
@data
</%args>
<h3><%$name|h%></h3>
<p>Cage: <%$data[0]|h%><br/>Class: <%$data[1]|h%>
<p class="mini" align="center" onclick="$('utildiv').style.display='none';">[close]
- <%args># animal.comp
- #called from animals.mhtml with args "name" and [color=#FF0000]"data" (x2)
- $name
- @data
- </%args>
- <h3><%$name|h%></h3>
- <p>Cage: <%$data[0]|h%><br/>Class: <%$data[1]|h%>
- <p class="mini" align="center" onclick="$('utildiv').style.display='none';">[close]
Avis du bloc args n'est pas normative du code perl et ne doivent contenir aucun. Il pourrait avoir été plus simple ici d'utiliser uniquement la table de hachage% args nouveau, ou d'utiliser trois scalaires. But hey, whats une démo si elle ne démontre pas? Passage d'un tableau à partir d'un autre composant est aussi simple que de passer une référence, mais en utilisant des données de formulaire POST est légèrement plus compliquée. L'explication de «le livre» décrit comment des champs avec le même nom dans une chaîne de requête sera mis dans un tableau du même nom dans le composant. Toutefois, vous ne pouvez pas passer une telle chaîne en utilisant la JS normative Object Notation avec Ajax.Updater (par exemple, "paramètres: (name:" bob ", id: 666)"). Au lieu de cela, vous devez utiliser la notation chaîne de ce genre, qui est l'appel qui ont utilisé pour animal.comp, en haut, de animals.mhtml, ci-dessous:
Code: [ Select ]
<p class="link" onclick="new Ajax.Updater($('utildiv'),'animal.comp', { method: 'post',
parameters: 'name=<%$_->{name}|j,h%>&data=<%$_->{cage}|j,h%>&data=<%$_->{class}|j,h%>' });
$('utildiv').style.display='inline';">
- <p class="link" onclick="new Ajax.Updater($('utildiv'),'animal.comp', { method: 'post',
- parameters: 'name=<%$_->{name}|j,h%>&data=<%$_->{cage}|j,h%>&data=<%$_->{class}|j,h%>' });
- $('utildiv').style.display='inline';">
Témoin, "donnée" est utilisée deux fois , Raison pour laquelle vous ne pouvez pas utiliser le js Object Notation. Vous remarquerez peut-être il ya quelque perl-> syntaxe d'objet là-dedans aussi. Utilisation des objets avec Mason est un peu limité, car les variables y compris les références d'objet ne persistent pas entre les appels de page. Cependant, nous avons un exemple dans ZooAnimal.pm, l'autre module, qui est utilisé pour contenir les routines Perl pour animals.mhtml et new_animal.comp. Ceux qui sont discutés dans la section suivante.
Formulaires
Ive a comporté une présentation sous forme par exemple de sorte que vous pouvez ajouter plus d'animaux au zoo. Cette option apparaît dans la barre de titre »de animals.comp:
Attachments:
Code: [ Select ]
<div class="menu">
<p class="menulink" onclick="new Ajax.Updater($('utildiv'),'create_animal.comp');
$('utildiv').style.display='inline';">Add New Animal
</div>
- <div class="menu">
- <p class="menulink" onclick="new Ajax.Updater($('utildiv'),'create_animal.comp');
- $('utildiv').style.display='inline';">Add New Animal
- </div>
create_animal.comp est seulement une forme normale avec id = "NewAdmin" et action = "javascript & #058; processform ($ ( "newamin"), new_animal.comp) " . "processform ()" est en site_specific. JS:
Code: [ Select ]
function processform(form,comp) {
new Ajax.Updater(document.body, comp, { method: 'post', parameters: form.serialize(true) });
}
- function processform(form,comp) {
- new Ajax.Updater(document.body, comp, { method: 'post', parameters: form.serialize(true) });
- }
Vous pouvez voir comment bien maçon et AJAX travailler ensemble ici, en prenant soin de l'envoi du formulaire et en passant le long de l'entrée à new_animal.comp, ce qui ajoute à la base de données et ne pas afficher aucune html - en revanche, elle comprend un peu <& animaux. mhtml &> à la fin, ce qui devrait afficher la liste à jour. En fait, si le ZooAnimal.pm create () de routine renvoie une erreur SQL ou autre, new_animal. comp répondra à quelque chose que, en incluant au lieu de animals.mhtml:
Code: [ Select ]
<%init># new_animal.comp
#called from create_animal.comp with args "name" "class" "cage"
BEGIN { push @INC,"/var/www/html/zoodemo"; }
use ZooAnimal ("create");
my $check = create ZooAnimal($ARGS{name},$ARGS{cage},$ARGS{class});
</%init>
% if ($check) {
<& animals.mhtml &>
% } else {
<& db_error.mhtml &>
% }
- <%init># new_animal.comp
- #called from create_animal.comp with args "name" "class" "cage"
- BEGIN { push @INC,"/var/www/html/zoodemo"; }
- use ZooAnimal ("create");
- my $check = create ZooAnimal($ARGS{name},$ARGS{cage},$ARGS{class});
- </%init>
- % if ($check) {
- <& animals.mhtml &>
- % } else {
- <& db_error.mhtml &>
- % }
Cette méthode de gestion d'erreur se produit dans quelques autres endroits aussi bien.
C'est donc un peu comme une routine normale CGI, seulement beaucoup plus agréable de travailler avec l'OMI.
Si votre animal appartient à une nouvelle classe, la classe est également créée.
Mais ne pouvais & #39; vous juste ne t tous cela avec CGI de toute façon?
Youre welcome to try!
Debugging / Exploitation forestière
db_handle () dans ZooDemo.pm s'allume DBIS mécanisme de traçage lorsque la poignée est créé:
Code: [ Select ]
DBI->trace(1,"$path/log/DBI_trace.log");
- DBI->trace(1,"$path/log/DBI_trace.log");
La sortie de trace est assez copieux.
En outre, de nombreuses erreurs Perl et SQL, ainsi que tout ce que vous imprimez sur STDERR, apparaîtra dans apaches error.log. log_msg (), d'ZooDemo.pm, permet d'imprimer dans un fichier journal / perl.log; le seul endroit où cela est effectivement utilisé, c'est quand vous créez un nouvel animal. Comme dans le répertoire db, mod_perl Apache écrit des fichiers dans le répertoire de log et donc il apache.apache doit être chownd.
Questions diverses
Pour une raison ou une autre, CSS: hover attributs ne fonctionnera que si vous utilisez la balise entière dans la définition. Donc si vous êtes habitué à utiliser:
Code: [ Select ]
.link { color: #fffff; }
.link:hover { background: #ffff00; color: #000088; font-weight: bold;}
- .link { color: #fffff; }
- .link:hover { background: #ffff00; color: #000088; font-weight: bold;}
Et avoir un tel effet une variété de tags, il existe un léger inconvénient:. lien s'appliquer à n'importe quoi class = "link", mais le lien: hover ne veux pas. Pour le faire fonctionner, vous devez faire ceci:
Code: [ Select ]
.link { color: #fffff; }
p.link:hover { background: #ffff00; color: #000088; font-weight: bold;}
h2.link:hover { background: #ffff00; color: #000088; font-weight: bold;}
[etc]
- .link { color: #fffff; }
- p.link:hover { background: #ffff00; color: #000088; font-weight: bold;}
- h2.link:hover { background: #ffff00; color: #000088; font-weight: bold;}
- [etc]
Je n'ai pas trouvé une explication pour cela (si vous en avez un, laissez-nous le savoir!), Donc je ne peux pas dire si ce comportement est conforme partout ou quelle partie de maçon / apache / mod_perl est responsable, mais il vaut la peine d'être mentionnés.
Thats all Folks! Si vous avez des commentaires ou des critiques, s'il vous plaît poste et je ferai de mon mieux pour incorporer (Sane) suggestions! Et merci aux membres de la Mason-liste des utilisateurs pour leur contribution - très apprécié.
-MK27
Moderator Remark: Major update!
- Anonymous
- Bot


- Inscription: 25 Feb 2008
- Messages: ?
- Loc: Ozzuland
- Status: Online
Juin 27th, 2009, 10:00 am
- mk27
- Proficient


- Inscription: Juin 09, 2009
- Messages: 334
- Status: Offline
- chrisscm
- Born


- Inscription: Sep 23, 2010
- Messages: 3
- Status: Offline
Merci beaucoup pour ce tutoriel!
Deux choses:
- Le lien démo ne semble pas active!?
- Malheureusement, dans Ubuntu 10.04, l'zoodemo ne fonctionne pas correctement lorsqu'il est utilisé localement.
Il ya des exemples Mason inclus dans Ubuntu (libhtml-mason-perl-exemples), qui sont copiés dans / var / www / mason_examples. Ces travaux w / tous les problèmes, mais la zoodemo. Mhtml fichiers ne semblent pas avoir interprété.
Comme Im nouvelle Mason, Id apprécions grandement toutes les allusions sur une solution possible à ce problème!
Cordialement,
chrisscm
Deux choses:
- Le lien démo ne semble pas active!?
- Malheureusement, dans Ubuntu 10.04, l'zoodemo ne fonctionne pas correctement lorsqu'il est utilisé localement.
Il ya des exemples Mason inclus dans Ubuntu (libhtml-mason-perl-exemples), qui sont copiés dans / var / www / mason_examples. Ces travaux w / tous les problèmes, mais la zoodemo. Mhtml fichiers ne semblent pas avoir interprété.
Comme Im nouvelle Mason, Id apprécions grandement toutes les allusions sur une solution possible à ce problème!
Cordialement,
chrisscm
- chrisscm
- Born


- Inscription: Sep 23, 2010
- Messages: 3
- Status: Offline
J'ai trouvé une solution rapide:
- Fichier de configuration de copie / etc/apache2/conf.d/libhtml-mason-perl-examples.conf à l'emplacement même / libhtml-mason-perl-zoodemo.conf
- Commenter whats pas nécessaire
C'est le fichier de configuration résultant:
- Fichier de configuration de copie / etc/apache2/conf.d/libhtml-mason-perl-examples.conf à l'emplacement même / libhtml-mason-perl-zoodemo.conf
- Commenter whats pas nécessaire
C'est le fichier de configuration résultant:
Code: [ Select ]
<IfModule mod_perl.c>
PerlModule CGI::Cookie
<Directory /var/www/zoodemo>
SetHandler perl-script
PerlResponsehandler HTML::Mason::ApacheHandler
PerlSetVar MasonArgsMethod CGI
# CGI was previously required for Mason to work in Apache2
</Directory>
</IfModule>
PerlModule CGI::Cookie
<Directory /var/www/zoodemo>
SetHandler perl-script
PerlResponsehandler HTML::Mason::ApacheHandler
PerlSetVar MasonArgsMethod CGI
# CGI was previously required for Mason to work in Apache2
</Directory>
</IfModule>
- <IfModule mod_perl.c>
- PerlModule CGI::Cookie
- <Directory /var/www/zoodemo>
- SetHandler perl-script
- PerlResponsehandler HTML::Mason::ApacheHandler
- PerlSetVar MasonArgsMethod CGI
- # CGI was previously required for Mason to work in Apache2
- </Directory>
- </IfModule>
- chrisscm
- Born


- Inscription: Sep 23, 2010
- Messages: 3
- Status: Offline
Mon dernier post a été affectée par l'ignorance - désolé.
Ce que j'essayais d'atteindre devait être atteint par la livraison. Htaccess fichiers.
Juste ces quelques petites modifications pour Ubuntu 10.04 (pour ceux qui rencontrent le même problème):
. - Htaccess peut-être besoin d'être activé, donc placer un fichier dans / etc/apache2/conf.d:
- Reload apache2
- Dans les fichiers zoodemo-.htaccess (theres plus d'un! ) Enlever le "* Fichiers" que la partie apache Ubuntu actuelle ne semble pas comme le "Header" directive
Et bien sûr - comme déjà indiqué dans le fichier README tutoriels, remplacer l'emplacement de base (par défaut: / var / www / html / zoodemo, pour moi, c'est / var / www / zoodemo).
Enjoy.
Ce que j'essayais d'atteindre devait être atteint par la livraison. Htaccess fichiers.
Juste ces quelques petites modifications pour Ubuntu 10.04 (pour ceux qui rencontrent le même problème):
. - Htaccess peut-être besoin d'être activé, donc placer un fichier dans / etc/apache2/conf.d:
Code: [ Select ]
# Enable .htaccess server side includes
<Directory /var/www/zoodemo>
AllowOverride Options
AllowOverride FileInfo
</Directory>
<Directory /var/www/zoodemo>
AllowOverride Options
AllowOverride FileInfo
</Directory>
- # Enable .htaccess server side includes
- <Directory /var/www/zoodemo>
- AllowOverride Options
- AllowOverride FileInfo
- </Directory>
- Reload apache2
- Dans les fichiers zoodemo-.htaccess (theres plus d'un! ) Enlever le "* Fichiers" que la partie apache Ubuntu actuelle ne semble pas comme le "Header" directive
Et bien sûr - comme déjà indiqué dans le fichier README tutoriels, remplacer l'emplacement de base (par défaut: / var / www / html / zoodemo, pour moi, c'est / var / www / zoodemo).
Enjoy.
Page 1 sur 1
Pour répondre à ce sujet, vous devez vous connecter ou vous enregistrer. Il est gratuit.
Afficher de l'information
- Total des messages de ce sujet: 5 messages
- Modérateur: Tutorial Writers
- Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité
- Vous ne pouvez pas poster de nouveaux sujets
- Vous ne pouvez pas répondre aux sujets
- Vous ne pouvez pas éditer vos messages
- Vous ne pouvez pas supprimer vos messages
- Vous ne pouvez pas joindre des fichiers
