Frågan 20 apr. 2005 14:09 #1 Först problemet:
Jag har ett kodblock med HTML och PHP mixat i varandra.
Nu vill jag lagra detta kodblock i en sträng för senare utskrift. Det hela är en del i ett template system.
Jag har trixat runt en del med "here document" syntax http://se.php.net/print och detta är nästan det jag söker.
Det fungerar så länge jag varvar HTML med PHP kod som egentligen bara skriver ut variabler eller arrayer. Problemet uppstår om jag försöker mig på lite mer avancerad PHP kod som tex if-satser. Dessa körs inte som PHP kod utan de printas som text.
så vad jag söker:
Hur kan jag exikvera ett kodblock som innehåller HTML och PHP kod men ställa utskriften av denna till en variabel för att senare köra echo på denna?
Ett exempel:
//start capturing
echo <<< EOF
<table width="100%" border="0" cellpadding="3" cellspacing="0">
<tr>
<td>
<form name="form1" method="post" action="?module=login">
<p align="center" class="text_default"><font color="#FF0000">
{if(isset($error))$error;}
</font></p>
<table width="10" border="0" align="center" cellpadding="3" cellspacing="0">
<tr>
<td class="text_default"> {$lang_login['username']}:</td>
</tr>
<tr>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td class="text_default"><br>{$lang_login['password']} :</td>
</tr>
<tr>
<td><input type="password" name="passwd"></td>
</tr>
<tr>
<td><div align="center"><br>
<input name="dologin" type="submit" value="{$lang_login['do_login']}">
</div></td>
</tr>
</table>
<p> </p>
</form>
<p> </p></td>
</tr>
</table>
EOF;
ovanstående kod fungerar som jag vill förutom den ifstats som återfinns som skrivs ut såhär:
{if(isset());}
Fuel Medlem sedan okt. 2000 1 285 inlägg varför inte göra en funktion av det ? eller har jag missförstått dig ?
<?
function capturing()
{
?>
<table width="100%" border="0" cellpadding="3" cellspacing="0">
<tr>
<td>
<form name="form1" method="post" action="?module=login">
<p align="center" class="text_default"><font color="#FF0000">
<?
if(isset($error)) { echo $error; }
?>
</font></p>
<table width="10" border="0" align="center" cellpadding="3" cellspacing="0">
<tr>
<td class="text_default"> <?=$lang_login['username'];?>:</td>
</tr>
<tr>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td class="text_default"><br><?=$lang_login['password'];?> :</td>
</tr>
<tr>
<td><input type="password" name="passwd"></td>
</tr>
<tr>
<td><div align="center"><br>
<input name="dologin" type="submit" value="<?=$lang_login['do_login'];?>">
</div></td>
</tr>
</table>
<p> </p>
</form>
<p> </p>
</td>
</tr>
</table>
<?
}
?>
hmm... vet inte vad jag skulle vinna på att göra det till en funktion...
Meningen med ovanstående är att olika kodare skall kunna skriva "moduler" med PHP och HTML blandat precis som vanligt och utan att behöva bry sig om hur systemet i övrigt är uppbyggt.
Tanken är alltså att systemet skall kunna läsa in dessa moduler och presentera dem med en template.... Alltså måste jag fånga upp såväl PHP som ren HTML och kunna parsa ut det på rätt ställe i template:en
G GunnarD Medlem sedan juni 2001 4 290 inlägg Re: print <<<END "here doc" men inte riktigt vad jag söker...
Jag skulle löst det så här:
<table width="100%" border="0" cellpadding="3" cellspacing="0">
<tr>
<td>
<form name="form1" method="post" action="?module=login">
<p align="center" class="text_default"><font color="#FF0000">
<?php if(isset($error)) {echo $error;} ?>
</font></p>
<table width="10" border="0" align="center" cellpadding="3" cellspacing="0">
<tr>
<td class="text_default"> <?php echo $lang_login['username']; ?> :</td>
</tr>
<tr>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td class="text_default"><br><?php echo $lang_login['password']; ?> :</td>
</tr>
<tr>
<td><input type="password" name="passwd"></td>
</tr>
<tr>
<td><div align="center"><br>
<input name="dologin" type="submit" value=" <?php echo $lang_login['do_login']; ?> ">
</div></td>
</tr>
</table>
<p> </p>
</form>
<p> </p></td>
</tr>
</table>
Om du har denna koden i en variabel so kan du använda php funktione eval() på den för att köra php kommandona innan du skriver ut variabeln.
/red: Redigerat in några ; tecken.
precis så som jag vill ha det... bara ett problem. Jag får parse error på sidan om jag gör som du föreslår.
-- 8< ---------
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /xxx/xxx/xxxx/xxxx/xxx/modules/login.php on line 25
------------
Rad 25 är den raden där <?php echo $lang_login['username'] ?> återfinns
G GunnarD Medlem sedan juni 2001 4 290 inlägg Hadde glömt att avlsuta php kommandona med ; är ändrat nu.
nepp... det är inte det som är problemet. Jag misstänker att den den slutar att tolka PHP koden efter första if-satsen.
Alltså:
---------- 8< ---------------------
<?php
...
...
echo <<< EOF
//massa html kod
<?php if(isset($error)) {echo $error;} ?> [php taggen avslutas (den första tolkas aldrig som start på php kod)]
//mer HTML kod
...
...
----------------------------------------
Tror det är lite fel att sätta in php kod taggarna då vi redan öppnat en php tagg som ej avslutats än? eller?
Printar hela sidan för överblickens skull...
<?php
//start capturing
echo <<< END
<table width="100%" border="0" cellpadding="3" cellspacing="0">
<tr>
<td>
<form name="form1" method="post" action="?module=login">
<p align="center" class="text_default"><font color="#FF0000">
<?php if(isset($error)) {echo $error;} ?>
</font></p>
<table width="10" border="0" align="center" cellpadding="3" cellspacing="0">
<tr>
<td class="text_default"> <?php echo $lang_login['username']; ?> :</td>
</tr>
<tr>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td class="text_default"><br><?php echo $lang_login['password']; ?> :</td>
</tr>
<tr>
<td><input type="password" name="passwd"></td>
</tr>
<tr>
<td><div align="center"><br>
<input name="dologin" type="submit" value=" <?php echo $lang_login['do_login']; ?> ">
</div></td>
</tr>
</table>
<p> </p>
</form>
<p> </p></td>
</tr>
</table>
END;
?>
Jag är rädd för att jag måste läsa in hela den aktuella filen och sedan köra eval() på den. Är det rätt uppfattat?
ett annat problem är att eval() endast validerar PHP kod så ovanstående borde inte gå...
Om jag läser in ovanstående kod i en string och sedan kör eval på den så får jag följande fel...
---------- 8< ---------
Parse error: parse error, unexpected '<' in /xxx/xxxx/xxxxx/xxxxx/xxxx/includes/xxxxx.php(23) : eval()'d code on line 1
Matte Medlem sedan aug. 2000 2 975 inlägg Annars så lägg dina if-satser och liknande utanför heredoc-satsen, och spara i variabel, typ:
$error_output = isset($error) ? $error : '';
//start capturing
echo <<< EOF
<table width="100%" border="0" cellpadding="3" cellspacing="0">
<tr>
<td>
<form name="form1" method="post" action="?module=login">
<p align="center" class="text_default"><font color="#FF0000">
$error_output
</font></p>
<table width="10" border="0" align="center" cellpadding="3" cellspacing="0">
<tr>
<td class="text_default"> {$lang_login['username']}:</td>
</tr>
<tr>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td class="text_default"><br>{$lang_login['password']} :</td>
</tr>
<tr>
<td><input type="password" name="passwd"></td>
</tr>
<tr>
<td><div align="center"><br>
<input name="dologin" type="submit" value="{$lang_login['do_login']}">
</div></td>
</tr>
</table>
<p> </p>
</form>
<p> </p></td>
</tr>
</table>
EOF;
eval() tycker jag är ett klart sämre alternativ att använda.
fast om jag tvingas manipulera det som står innanför echo <<< EOF och EOF "taggarna" så missar jag ju mitt mål lite... Tanken är som sagt att alla andra utvecklare i systemet inte skall behöva bry sig om hur systemet är kodat. Systemet skall alltså kunna parsa in PHP/HTML kod från olika filer och belägga dessa med en template...
Fuel Medlem sedan okt. 2000 1 285 inlägg Jag är lite förvirrad här.. men jag gör ett nytt försök
Liiiite mycket tabeller i onödan.. slå ett slag för webstandard, xhtml & css m.m :)
...
<style type="text/css">
body { text-align:center; }
.chunk { margin:0 auto; width:200px; text-align:center; }
.loginform { margin:0 auto 0 auto; width:150px; text-align:left; }
form { margin:0; }
.field { width:150px; }
.error { color:red; }
</style>
</head>
<body>
<?
$lang_login['username'] = "laban";
$lang_login['password'] = "labolina";
$lang_login['do_login'] = "Logga in";
$error_output = "Heybaberiba!";
$chunk = '
<div class="chunk">
<form name="form1" method="post" action="?module=login">
<p class="error"><strong>'.$error_output.'</strong></p>
<div class="loginform">
<p>'.$lang_login['username'].':<br />
<input type="text" name="username" class="field" /></p>
<p>'.$lang_login['password'].' :<br />
<input type="password" name="passwd" class="field" /></p>
</div>
<p><input name="dologin" type="submit" value="'.$lang_login['do_login'].'" /></p>
</form>
</div>
';
echo $chunk;
?>
...