Newsgroup: it.comp.lang.perl
Titolo: HTML::Mason, prima domanda

Una domandina sull'uso di variabili globali.
Ammettendo che in ogni pagina utiilizzo:
	<& /core/start &>
per caricare una Apache::Session
come posso fare per far si che
	%session
definito in /core/start sia visibile in tutte
le pagine?
Ho provato a metterlo sia in <%once> che
in <%init> ma senza risultato!
Grazie anticipate :-)
Anto.


package HTML::Mason;
use HTML::Mason;
use HTML::Mason::ApacheHandler (args_method=>'mod_perl');
use strict;
# Elenco di tutti i moduli che verranno usati nei componenti
{
    package HTML::Mason::Commands;
    use DBI;
    use LWP;
    use Apache::SessionManager;
    ...
}
 
# Crea l'oggetto Mason
my $ah = new HTML::Mason::ApacheHandler (
	comp_root => '/usr/local/apache/htdocs/mason',
	data_dir  => '/usr/local/apache/htdocs/mason/data',
	allow_globals => [ '$session' ]
                                        );
sub handler {
    my ($r) = @_;
    return $ah->handle_request($r);
}
 
1;  
---CUT HERE---
ed infine l'autohandler /usr/local/apache/htdocs/mason/autohandler:
---CUT HERE---
<%init>
local $session = Apache::SessionManager::get_session($r);
</%init>
<% $m->call_next %>
---CUT HERE---
Da questo momento in poi puoi usare $session (un hash reference) 
in tutte le pagine gestite da HTML::Mason. Ad esempio 
/usr/local/apache/htdocs/mason/session.html:
---CUT HERE---
...
<%perl>
	my $foo = 'bla bla';
	$$session{'foo'} = $foo;
	print $$session{'bar'};
</%perl>
...
---CUT HERE---
by
	- Enrico

 PerlRequire /usr/local/apache/conf/
masonhandler.pl
Non c'è un'altro metodo senza modificare httpd.conf ???



Mmhh..., non è la cosa migliore, è poco flessibile e la meno efficiente
(PerlRequire esegue run-time ogni volta 
masonhandler.pl
) ma puoi mettere 
tutta la configurazione in un .htaccess, ma, ripeto, non te lo consiglio:
---CUT HERE---
PerlRequire /usr/local/apache/conf/
masonhandler.pl
<FilesMatch "\.html$">
   SetHandler perl-script
   PerlHandler HTML::Mason
   PerlHeaderParserHandler Apache::SessionManager
   PerlSetVar SessionManagerTracking On
   PerlSetVar SessionManagerExpire 3600
   PerlSetVar SessionManagerInactivity 900
   PerlSetVar SessionManagerName MASONSESSIONID
   PerlSetVar SessionManagerStore File
   PerlSetVar SessionManagerStoreArgs "Directory => /tmp/session_data/mason"
   PerlSetVar SessionManagerDebug 5
</FilesMatch>
---CUT HERE---
Alternativamente puoi utilizzare la modalità di configurazione httpd.conf 
'only' (ancora meno flessibile) utilizzando solamente direttive PerlSetVar 
Mason* sempre in .htaccess:
---CUT HERE---
<FilesMatch "\.html$">
   SetHandler perl-script
   PerlHandler HTML::Mason::ApacheHandler
   PerlSetVar MasonCompRoot /usr/local/apache_1.3.20/htdocs/mason
   PerlSetVar MasonDataDir /usr/local/apache_1.3.20/htdocs/mason/data
   PerlSetVar MasonAllowGlobals $session
 
   PerlHeaderParserHandler Apache::SessionManager
   PerlSetVar SessionManagerTracking On
   PerlSetVar SessionManagerExpire 3600
   PerlSetVar SessionManagerInactivity 900
   PerlSetVar SessionManagerName MASONSESSIONID
   PerlSetVar SessionManagerStore File
   PerlSetVar SessionManagerStoreArgs "Directory => /tmp/session_data/mason"
   PerlSetVar SessionManagerDebug 5
</FilesMatch> 
---CUT HERE---
Note
====
* In entrambi i casi è necessario installare Apache::SessionManager
nella fase di Header parsing e non nella URI translation di Apache (in tale 
fase ancora non c'è stata la traduzione la URI->filename e .htaccess non è 
stato ancora processato).
** Agendo solo su .htaccess, non è possibile utilizzare la feature di URI 
rewriting ma solo i cookies per il tracking delle sessioni.
by
	- Enrico

 tutta la configurazione in un .htaccess, ma, ripeto, non te lo consiglio:
Per le sessioni è OK, ma per una qualsiasi altra generica variabile?
Forse ho scelto un'esempio poco felice :-)



In genere bisogna usare parsimonia con le variabili globali.
Comunque, se ho capito:
	PerlSetVar MasonAllowGlobals $session
	PerlAddVar MasonAllowGlobals @array
	PerlAddVar MasonAllowGlobals %hash
	...
by
	- Enrico

 	PerlAddVar MasonAllowGlobals %hash
E' uno scherzo? :-) Devo mettere in httpd.conf tutte le 
variabili globali???
Ehm... allora che alternative a Mason ho per non 
dover riscrivere il 100% del precedente codice?
:-)
Grazie anticipate!!!!!!

 :-)
A questo punto ti consiglio di leggerti attentamente tutta l'ottima 
documentazione a corredo di HTML::Mason, nonché la versione on-line del 
libro O'reilly (
www.masonbook.com
) per stabilire se questo app server può
fare al caso tuo.
by
	- Enrico
 

 fare al caso tuo.
Ti ringrazio moltissimo per il tempo che mi stai dedicando!
Quello che vorrei realizzare e la seguente cosa:
Ogni template in testa deve richiamare una libreria che svolge diverse operazioni:
- carica la sessione utente e ne controlla la validità (username, linguaggio e skin selezionata);
- collega al database;
Successivamente richiamare una funzione che esegua una query su una delle possibili funzionalità:
- elenco degli utenti collegati;
- elenco dei forum;
- elenco dei messaggi in bacheca;
Quindi semplicemente stampare il tutto con un foreach.
Io pensavo ad un qualcosa di simile per il mio index.html:
	<& /core/start &>
	<& /layout/header &>
	<& /layout/topbanner &>
	<& /layout/leftmenu &>
	<& /layout/content_begin &>
	<h1>Elenco Forum</h1>
	<table>
	% foreach $k (keys %forums) {
	<tr>
	<td><% $forum{$k}{'titolo'} ?></td>
	</tr>
	% }
	</table>
	<& /layout/content_end &>
	<& /layout/footer &>
Probabilmente il mio approccio e sbagliato! Ma questo mi consentirebbe di portare tutto
il vecchio applicativo dal PHP in poco tempo.
Dovrei realizzare un'unico componente da cui richiamo solo dei metodi???
Ammettendo di ottenere l'hash forum da una chiamata a un metodo di /core/start
come posso rendere accessibile il tutto anche dai componenti sotto /layout ???
Spero di essere stato chiaro :-)
Grazie a tutti anticipatamente!!!
Saluti, Antonio Gallo - AGX per gli amici di Usenet
(o_         
http://www.antoniogallo.it/
   Sito personale
//\         
http://www.badpenguin.org/
    Progetto "Bad Penguin" (d)
V_/_        
http://www.linux.it/ILS/
      Italian Linux Society 

Spero di essere stato chiaro :-)
Adesso si comincia a capire... vuoi portare codice già realizzato da PHP a 
Perl. Forse il paradigma più simile è allora quello fornito da Apache::ASP, 
l'implementazione (free) Apache/mod_perl della tecnologia Active Server 
Pages.
Tra l'altro trovi molto più facilmente Apache::ASP già installato nei vari
hosting provider che HTML::Mason
	- Enrico

 come ti ho postato giorni fa.
Allora credo di aver finalmente capito!
Leggendo il libro di fretta avevo capito che gli autohandler venivano chiamati
SOLO quando nella directory mancava il file corrispondente al componente.
Invece se c'è un file autohandler questo viene chiamato sempre.
A questo punto mi basta inizializzare database, sessioni e altre variabili
come elementi di un'unico hash in /autohandler e modificare httpd.conf
giusto? :-)

 giusto? :-)
Teoricamente sì. Una cosa del genere:
---CUT HERE---
<%init>
local %conf;
$conf{'session'} = Apache::SessionManager::get_session($r);
$conf{'dbh'} = DBI->connect('DBI:mysql:mydb;...') 
	or die "Can't connect to database: $DBI::errstr";
</%init>
<% $m->call_next %>
---CUT HERE---
Facci sapere... :-)
	- Enrico 

 	- Enrico 
'pito!!!!!
Non so come ringraziarvi!!!
Il sito che voglio portare è 
www.mitici.it
-- 
