webForumDet fria alternativet

print <<<END "here doc" men inte riktigt vad jag söker...

PHP

11 svar · 474 visningar · startad av fredriksk

Medlem sedan maj 2001211 inlägg
Frågan#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>&nbsp;</p>
      </form>
      
    <p>&nbsp;</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());}

Medlem sedan okt. 20001 285 inlägg
#2

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>&nbsp;</p>

    </form>

    <p>&nbsp;</p>
    
    </td>
	</tr>
	</table>
	<?
}
?>
Medlem sedan maj 2001211 inlägg
#3

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

Medlem sedan juni 20014 290 inlägg
#4

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>&nbsp;</p>
      </form>
      
    <p>&nbsp;</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.

Medlem sedan maj 2001211 inlägg
#5

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

Medlem sedan juni 20014 290 inlägg
#6

Hadde glömt att avlsuta php kommandona med ; är ändrat nu.

Medlem sedan maj 2001211 inlägg
#7

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?

Medlem sedan maj 2001211 inlägg
#8

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>&nbsp;</p>
      </form>
      
    <p>&nbsp;</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?

Medlem sedan maj 2001211 inlägg
#9

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

Medlem sedan aug. 20002 975 inlägg
#10

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>&nbsp;</p>
      </form>
      
    <p>&nbsp;</p></td>
  </tr>
</table>
EOF;

eval() tycker jag är ett klart sämre alternativ att använda.

Medlem sedan maj 2001211 inlägg
#11

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...

Medlem sedan okt. 20001 285 inlägg
#12

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;
?>
...
513 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
382 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)