webForumDet fria alternativet

Templats

21 svar · 321 visningar · startad av nordan

nordanMedlem sedan juni 2000949 inlägg
#1

Jag har försökt mig på lite tmpl
men såklart funkar det inte hmm.
Jag har perl på IIS
Detta är koden:
tmpl koden:

<html>
<head>
<title>Current time</title>
</head>
<body bgcolor="#FF00FF">
<h1>Current time</h1>
<p>Welcome. The current time is <TMPL_VAR NAME="current_time">.</p>
</body>
</html>

Och detta är perl koden

#!/usr/bin/perl 
use strict;
use HTML::Template;
use constant TMPL_FILE => "$ENV{DOCUMENT_ROOT}/templates/current-time.tmpl";
my $tmpl = new HTML::Template( filename => TMPL_FILE );
my $time = localtime;

$tmpl->param{ current_time => $time };

print "Content-type: text/html\n\n",
	$tmpl->output;

my $q = new CGI;
my $tmpl = new HTML::Template( filename => TMPL_FILE,
					asociate => $q);

Så här är resultatet *SUCK*
:( :(
CGI Error

The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:

Can't locate HTML/Template.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .) at C:\Inetpub\wwwroot\cgi-bin\current_time.cgi line 3.
BEGIN failed--compilation aborted at C:\Inetpub\wwwroot\cgi-bin\current_time.cgi line 3.

Någon som vet vad lösningen är ?

------------------
/nordan

JojoxxMedlem sedan juni 20004 308 inlägg
#2

Det verkar som du inte har den modulen installerad. Antingen får du ladda ner den från CPAN (http://www.perl.com/CPAN-local/modules/01modules.index.html) och installera den manuellt, eller så använder du det lilla verktyget PPM (Perl Package Manager). PPM (.bat) ligger i bin-katalogen i din perl-installation.

C:\>cd perl\bin [enter]
C:\perl\bin>ppm [enter]

och följ instruktionerna.

------------------

/ J

nordanMedlem sedan juni 2000949 inlägg
#3

Tack Jojoxx men jag får detta medelande när jag skall installera det

Error installing package 'ppm': Could not locate a PPM file for package ppm

Fattar noll som vanligt :)
Kan någon hjälpa mig kanske ?

------------------
/nordan

JojoxxMedlem sedan juni 20004 308 inlägg
#4

Error installing package 'ppm': Could not locate a PPM file for package ppm

När får du det där felmeddelandet? Vad kör du för distribution av perl? Det låter som du försöker installera en modul som heter ppm... PPM är alltså ett litet script som du får med senare perl-installationer (från ActiveState). Har du en fräsh installation av ActivePerl ställer du dig i bin-katalogen och startar ppm. Vid prompten skriver du;

PPM> install HTML-Template

Så är tanken att ppm skall ladda ner och installera modulen i fråga. Fungerar inte detta bör du titta över din perl-installation. Det skadar inte att uppgradera din perl-installation.

------------------

/ J

nordanMedlem sedan juni 2000949 inlägg
#5

Oki Jojoxx som vanligt hade du rätt igen :) Du är klart en guru asså :D :D
Funka utmärkt när man får hjälp av dig.

Kan man nu göra templats som skriver viss html kod typ en meny som skall ploppa upp på varje sida och sedan ha massa text från en databas som fylls för olika sidor :)
Är det så man anväder detta eller har jag helt fel?

------------------
/nordan

JojoxxMedlem sedan juni 20004 308 inlägg
#6

Kan man nu göra templats som skriver viss html kod typ en meny som skall ploppa upp på varje sida och sedan ha massa text från en databas som fylls för olika sidor

Ja, det tycker jag låter som ett alldeles förträffligt ändamål för denna modul ;) Jag har den inte installerad (jag byggde en egen för länge sedan som passade mina behov istället). Enligt dokumentationen borde det kunna se ut så här;

use HTML::Template;
$template = HTML::Template->new(path => 'mallar', filename => 'minmall.tmpl',debug => 0);

# Ladda lite template-värden.
$template->param('min_meny', '<!-- Här är det plats för en meny... -->');
$output = $template->output;

print "Content-type: text/html\n\n $output";

Så kan du från template-filen lägga in <TMPL_VAR NAME=min_meny> för att lägga till menyn. Detta är dock inte testat men bör fungera utifrån dokumentationen. Det är bara att testa och leka.

------------------

/ J

nordanMedlem sedan juni 2000949 inlägg
#7

Oki Tack
Jag misstänkte att det skulle funka på detta sett som du sa men vill få det bekräftat av ett proffs som har lite koll på detta med perl.

En annan fråga då är ju att när man gör dessa sidor så har man ju en perl fil alltså tex min_meny.cgi sen har man ju en .tmpl fil.
Frågan är då om man vill ha detta på index sidan är det så att man måste ha detta i en .cgi fil eller kan man kanske använda sig av ssi och lägga in det i en shtml fil istället?

Jag vet inte om det är vanligt att man har en sida som heter index.cgi men det kasnke det är? Eller jag kanske är ute och cyklar nu igen?

------------------
/nordan

JojoxxMedlem sedan juni 20004 308 inlägg
#8

Nejdå, det är helt rätt. Teoretiskt (och praktiskt) är båda möjligheterna tänkbara, men ofta väljer man ju att avgränsa cgi-script till en speciell katalog, i.e. cgi-bin och då är SSI varianten ett bättre alternativ. Jag skulle köra på det senare.

------------------

/ J

[Redigerat av Jojoxx den 09 maj 2001]

nordanMedlem sedan juni 2000949 inlägg
#9

Ok Tack
Men min tanke är att man skall kunna köra olika saker från en databas från menyn så att dom vissa på index sidan
Räcker det då men ssi fil eller
Tex massa html kod i en text fil som jag har gjort vid nått tillfälle eller går det att använda templatsen tillsammans med ssi då?
Eftersom jag skall ha detta med en databas där man hämtar info ifån när man klicka på en länk typ.
Frågar så här så jag vet om det är möjligt för då vet man om det är någon vitts med att leta efter info om just detta :)

Nog för att jag får jättebra och tydliga svar av Jojoxx så har jag inte riktat frågorna bara till honom. Så är det någon annan som sitter inne med samma goda kunskap så är ni också välkommna att svara på dessa frågor ;)

------------------
/nordan

JojoxxMedlem sedan juni 20004 308 inlägg
#10

Men min tanke är att man skall kunna köra olika saker från en databas från menyn så att dom vissa på index sidan
Räcker det då men ssi fil eller

Är "njaaa" ett bra svar? ;) Om vi säger så här; CGI-scriptet i sig beter sig inte annorlunda bara för att resultatet returneras till en sida via SSI, så på det viset kan du använda databas-komponenter, template-moduler eller vad man nu kan tänka sig. Däremot kan det vara svårt att hämta data från användaren (som ex från en meny postad med method="get) om scriptet är inkluderat av webservern via SSI. Det kan gå eftersom datat är sparat i miljödataarean (enviroment space) för query-string, men det kan skilja mellan olika webservrar. Därför skulle jag föreslå att du antingen

  • Genererar all output från cgi-scriptet och endast lägger in <!--#exec cgi="/cgi-bin/mySuperDuperScript.pl"--> i SSI-dokumentet. När användaren anropar index-sidan blir det utan argument till scriptet och "default"-inställningar visas. Svårt att säga hur det blir eftersom jag inte vet vad det är för script. Från menyn som du har anropar du istället scriptet direkt istället för att gå via SSI-sidan.
  • eller så gör du bara en vidarebefordring från index-sidan till scriptet <meta http-equiv="Refresh" content="/cgi-bin/mySuperDuperScript.pl">

------------------

/ J

nordanMedlem sedan juni 2000949 inlägg
#11

Om jag har hajat det rätt nu då.
Man kan alltså lägga in ssi ett vanligt html doc Klart man kan.
Men sedan så när jag tycker på Länk ett
som då är läkat på nått sätt till mitt
perl script . Så kan man alltså med hjälp av ssi skriva ut det man vill på sidan hmm det var nog rörigt men men

Typ så här skulle scriptet vara alltså enkelt och kanske inte helt rätt men jag tror jag kan få fram det jag vill med frågan.

if($link = "link1"){
$out = "Länk 1";
}
elsif($link = "link2"){
$out = "Länk 2";
}
else{
&skrivlink;
}
sub skrivlink{
print "Klicka på en länk i menyn";
}

Sedan skulle man alltså kunna styra allt detta med ett och samma program och med olika subrutiner beroende på hur användare har klickat på sidan?

Säg att jag är på rätt spår nu :)
Tackar för det goda hjälpen som jag har fått. :D

------------------
/nordan

JojoxxMedlem sedan juni 20004 308 inlägg
#12

Jo, på rätt spår är du nog. Men vi pratar nog lite förbi varandra. Om vi hoppar över SSI biten till att börja med. Vi gör ett litet exempel som vi kollar input från användaren. Vi använder oss av standardmodulen CGI.

use CGI;

print "Content-type: text/html\n\n";
if(!CGI::param('mittval')){
   print "Detta visas när användaren först anropar scriptet. Detta kan vara ett resultat från din mall (template) sida. Det kan inkludera output från en databas eller andra roliga beräkningar";
} elsif(CGI::param('mittval') eq 'foo'){
   print 'Här har användaren val någonting från din meny exempelvis genom en länk som ser ut så här <a href="script.pl?mittval=foo">länk</a>';
} elsif(CGI::param('mittval') eq 'faa'){
   print "Ytterligare ett val";
} else {
   print "Här borde inte användaren hamna om denne inte hittat på ett eget val.";
}

------------------

/ J

[Redigerat av Jojoxx den 09 maj 2001]

nordanMedlem sedan juni 2000949 inlägg
#13

Japp hänger med på detta där nu :D
Antar att du la detta i en ifsatts för att förklara det jag försökte göra som exempel eller?
För vad förstår skulle jag kunna lägga in dessa länkar i det som användaren ser först? Alltså det som ligger under if
Fågra bara för att se om jag fattat rätt :e

Oki hur går man vidar nu då ? :D :D

------------------
/nordan

JojoxxMedlem sedan juni 20004 308 inlägg
#14

Japp, du är på rätt spår. Hur du går vidare... Lägg till template-funktionerna om du ville använda sådanna kanske? :) Testa dig fram och så får du fråga igen när du stöter på något problem.

------------------

/ J

nordanMedlem sedan juni 2000949 inlägg
#15

oki nu vart jag trög ingen :)
Men sdan när jag vill ha detta på en shtml sida så skall det bara vara att köra med ssi på sidan och starta perl programmet?

------------------
/nordan

JojoxxMedlem sedan juni 20004 308 inlägg
#16

Ja. Precis. Eftersom när du anropar cgi-scriptet från sidan gör du det utan argument och "default"-läge eller vad man ska kalla det visas.

------------------

/ J

nordanMedlem sedan juni 2000949 inlägg
#17

Jaha inge då!
Jag har nu setat och testat detta script mera som du skrev åt mig

use CGI;

                                   print "Content-type: text/html\n\n";
                                   if(!CGI::param('mittval')){
                                   print "Detta visas när användaren först anropar scriptet. Detta kan vara ett resultat från din mall (template) sida. Det kan
                                   inkludera output från en databas eller andra roliga beräkningar";
                                   } elsif(CGI::param('mittval') eq 'foo'){
                                   print 'Här har användaren val någonting från din meny exempelvis genom en länk som ser ut så här <a
                                   href="script.pl?mittval=foo">länk</a>';
                                   } elsif(CGI::param('mittval') eq 'faa'){
                                   print "Ytterligare ett val";
                                   } else {
                                   print "Här borde inte användaren hamna om denne inte hittat på ett eget val.";
                                   }

Frågan är:
Jag har lagt in detta i en shtml sida
Och när man då laddar den så laddas det som står efter if.
jag har också lagt in en länk på shtml sidan som ser ut typ så här
<a href="script.pl?mittval=foo">länk</a>
Och det funkar fin fin för det är ju inte jag som har gjort scriptet :e
men problemet är att jag vill att texten som står under elsif skall komma in på .shtml sidan.
Vet du hur man gör Jojoxx?

------------------
/nordan

nordanMedlem sedan juni 2000949 inlägg
#18

Någon som har koll på frågan över detta inlägget? Samt hur använder man tmpl på bäst sätt
Någon som kan förklara på ett enkelt sätt hur man använder dess?
Vad jag förstår så är det mallar men jag ser inte logiken i det bara Men och andra sidan så är jag inte så kunnig i detta heller så :) Men någon annan kanske är det?

------------------
/nordan

JojoxxMedlem sedan juni 20004 308 inlägg
#19

Nordan, ett bra sätt att lära sig på är att testa sig fram. Prova att renerera lite html-kod från en mall och se hur det fungerar. Ett praktiskt exempel kan vara att lägga mallen (templaten) som en grund för en databas output. Men, du kan ju börja med att bara lägga in lite variabler i templaten så du ser hur det fungerar.

Ang. SSI finns det 2 varianter. Vilken du skall använda beror på vilken webserver du har.

<!--#exec cgi="/cgi-bin/script.pl?mitt_val=foo"-->

eller;

<!--#include virtual="/cgi-bin/script.pl?mitt_val=foo"-->

IIS vill ha den översta varianten medans Apache vill ha den nedre. Använder du fel får du helt enkelt inte med query-stringen till scriptet.

------------------

/ J

nordanMedlem sedan juni 2000949 inlägg
#20

Tjena!
Om jag har en sida som ser ut så här

<html>
<head>
</head>
<body>
<!-- #exec cgi="script.pl" -->
<br>
<a href="script.pl?mittval=foo">Länk</a>
</body>
</html>

script.pl koden


use CGI;

print "Content-type: text/html\n\n";
if(!CGI::param('mittval')){
print "Detta visas när användaren först anropar scriptet. Detta kan vara ett resultat från din mall (template) sida. Det kan
inkludera output från en databas eller andra roliga beräkningar";
} elsif(CGI::param('mittval') eq 'foo'){
print 'Här har användaren val någonting från din meny exempelvis genom en länk som ser ut så här <a
href="script.pl?mittval=foo">länk</a>';
 } elsif(CGI::param('mittval') eq 'faa'){
print "Ytterligare ett val";
} else {
print "Här borde inte användaren hamna om denne inte hittat på ett eget val.";
}

När jag då kommer in på sidan så ser den ut typ såhär:

Detta visas när användaren först anropar scriptet. Detta kan vara ett resultat från din mall (template) sida. Det kan
inkludera output från en databas eller andra roliga beräkningar

Länk

När jag klickar på Länk så vill jag bara att texten som skrivs in med SSI skall bytas ut inte all html

Det som händer när jag kickar på Länk är att jag kör scriptets elsif vilket gör att det är bara texten
Här har användaren val någonting från din meny exempelvis genom en länk som ser ut så här länk
som skrivs ut där scriptet ligger.

Det jag vill är alltså att texten skall lägga sig där den första texten låg.

Någon som kan tipsa mig?

------------------
/nordan

141 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)