webForumDet fria alternativet

PHP-kod inuti echo

19 svar · 1 054 visningar · startad av Trankan

TrankanMedlem sedan okt. 2006129 inlägg
#1

Hej!

Undrar lite kort om det går att ha PHP-kod inuti en echo? Har nämligen en sida med en if-sats som skriver ut ett helt formulär genom en echo, och då formuläret innehåller en del PHP-kod så måste jag hitta något sätt att få med den när formuläret skrivs ut.

aasahMedlem sedan mars 20034 471 inlägg
#2

Du kan läsa om olika sätt att använda fnuttar ihop med php-kod och echo här, det beskriver nog en del.

Värt att nämna i övrigt är att punkt (.) används för strängkonkatinering samt att heredoc syntax är kul för formulär.

$me = $_SERVER['PHP_SELF'];

$forgForm = <<< EOFPNFORM
<form method="POST" name="fForm" action="$me" >
Name <input type="text" name="name" >
Registered email <input type="text" name="email" >
<input type="submit" name="submit" value="Help!" >
EOFPNFORM;

echo $forgForm;

OBS! Ändordet måste vara exakt som startordet, annars får du urskumma fel. Och INGENTING får finnas efter startordet på första raden.

TrankanMedlem sedan okt. 2006129 inlägg
#3

Tack för svaret! :) Testade heredoc syntax och det fungerade rätt bra, förrutom att if-satser och liknande inte fungerade. Går det att få såna här satser att fungera om man lägger dem i strängen, eller bör man välja en annan lösning?

vicMedlem sedan apr. 2006244 inlägg
#4

funkar inte

echo eval($str)

personligen avskyr jag heredoc, tycker att det är svårläst :)

TrankanMedlem sedan okt. 2006129 inlägg
#5

vic skrev:

echo eval($str)

Fungerar inte heller riktigt som jag tänkt. Har bland annat en foreach-sats i strängen, och på det stället skriver funktionen ut själva koden istället för att läsa den som PHP. Vet inte om jag har gjort något fel?

$str = "<select name=country>
$selected = AL;
$countrylist = array(
            'AF' =>    'Afganistan',
            'AL' =>    'Albania',
            'DZ' =>    'Algeria');

foreach ($countrylist as $key => $value) {
<option value=$keyif($key==$selected) echo ' selected';>$value</option>
}
</select>";

echo eval($str);
nitro2k01Medlem sedan aug. 20039 342 inlägg
#6
$str = "<select name=\"country\"> \n";
$selected = 'AL';
$countrylist = array(
            'AF' =>    'Afganistan',
            'AL' =>    'Albania',
            'DZ' =>    'Algeria');

foreach ($countrylist as $key => $value) {
    $selstr = ($key==$selected)?"selected=\"selected\"":"";
    $str .= "<option value=\"{$key}\" {$selstr}>{$value}</option>\n";
}
$str .= "</select>";

echo $str;
aasahMedlem sedan mars 20034 471 inlägg
#7

Trankan skrev:

Tack för svaret! :) Testade heredoc syntax och det fungerade rätt bra, förrutom att if-satser och liknande inte fungerade. Går det att få såna här satser att fungera om man lägger dem i strängen, eller bör man välja en annan lösning?

Heredoc kan användas för att skriva ut långa stycken av HTML/JS-kod mm som alltså är "stränginfo" i PHP. Och då slipper man strula med "escapade" fnuttar. En enkel variabel kan klämmas in och evalueras då. Men allt som är mer komplicerat än så (inklusive array-variabler) måste först evalueras och göras om till en sträng innan heredoc-startar.

Så i ditt fall hade jag inte använt heredoc.

jmeMedlem sedan maj 20012 237 inlägg
#8

trankan; kan du inte tänka dig att refaktorera koden så att den returnerar datan istället för att direkt skriva ut det?

TrankanMedlem sedan okt. 2006129 inlägg
#9

nitro2k01 skrev:

$str = "<select name=\"country\"> \n";
$selected = 'AL';
$countrylist = array(
            'AF' =>    'Afganistan',
            'AL' =>    'Albania',
            'DZ' =>    'Algeria');

foreach ($countrylist as $key => $value) {
    $selstr = ($key==$selected)?"selected=\"selected\"":"";
    $str .= "<option value=\"{$key}\" {$selstr}>{$value}</option>\n";
}
$str .= "</select>";

echo $str;

Koden fungerar, men jag misstänker att det kan bli klurigt att få med resten av formuläret i samma sträng?

jme skrev:

trankan; kan du inte tänka dig att refaktorera koden så att den returnerar datan istället för att direkt skriva ut det?

Förstår nog inte riktigt hur du menar? :)

jmeMedlem sedan maj 20012 237 inlägg
#10
function createSelect()
{
$str = "<select name=\"country\"> \n"; 
$selected = 'AL'; 
$countrylist = array( 
            'AF' =>    'Afganistan', 
            'AL' =>    'Albania', 
            'DZ' =>    'Algeria'); 

foreach ($countrylist as $key => $value) { 
    $selstr = ($key==$selected)?"selected=\"selected\"":""; 
    $str .= "<option value=\"{$key}\" {$selstr}>{$value}</option>\n"; 
} 
$str .= "</select>"; 

return $str; 
}

echo createSelect();
TrankanMedlem sedan okt. 2006129 inlägg
#11

jme skrev:

function createSelect()
{
$str = "<select name=\"country\"> \n"; 
$selected = 'AL'; 
$countrylist = array( 
            'AF' =>    'Afganistan', 
            'AL' =>    'Albania', 
            'DZ' =>    'Algeria'); 

foreach ($countrylist as $key => $value) { 
    $selstr = ($key==$selected)?"selected=\"selected\"":""; 
    $str .= "<option value=\"{$key}\" {$selstr}>{$value}</option>\n"; 
} 
$str .= "</select>"; 

return $str; 
}

echo createSelect();

Vet inte om jag har förstått det här rätt, men fungerar det så att endast HTML-koden skrivs ut medan PHP-koden körs direkt i funktionen?

Frågan är nu hur jag får in det här i resten av formuläret? Ska jag kanske lägga hela formuläret i en sträng som tidigare och sedan skriva ut createSelect() på det ställe där jag vill att menyn ska visas?

jmeMedlem sedan maj 20012 237 inlägg
#12

Här är ett exempel. Koden kan ha fel:


function createForm($formType = 'post', $action, $id = '', array $elements)
{
	$html = '';
	
	$html .= '<form method="' . $formType . '" action="' . $action . '" >';
	
	foreach($elements as $element):
		$html .= $element;
	endforeach;
	
	$html .= '</form>';
	
	return html;
}

function createSelect() 
{ 
	$str = "<select name=\"country\"> \n"; 
	$selected = 'AL'; 
	$countrylist = array( 
	            'AF' =>    'Afganistan', 
	            'AL' =>    'Albania', 
	            'DZ' =>    'Algeria'); 
	
	foreach ($countrylist as $key => $value) { 
	    $selstr = ($key==$selected)?"selected=\"selected\"":""; 
	    $str .= "<option value=\"{$key}\" {$selstr}>{$value}</option>\n"; 
	} 
	$str .= "</select>"; 
	
	return $str; 
} 

function createInput($type = 'text', $name, $id = '')
{
	return '<input type="' . $type . '" name="' . $name . '" id="' . '" />';	
}

$elements = array();
$elements[] = createSelect();
$elements[] = createInput('text', 'firstname', 'firstname');

$html = createForm('post', 'processForm.php', 'myform', $elements);

echo $html;

Idén ä alltså att man har små funktioner som skapar elementen som och som inte själv skriver ut nåt men returnerar strängen som du sedan kan baka in där du vill. T ex så lagrar jag all genererad text i en array som sedan ges till funktionen createForm() och som själv generarar ett komplett form-element som sedan kan skrivas ut.

Kan även tillägga att de brukar vara effektivare att skriva ut allt på en gång, än att hela tiden anropa echo eller print().

EDIT: en jävla massa felskrivningar! x(

TrankanMedlem sedan okt. 2006129 inlägg
#13

Okej, då förstår jag nog lite bättre. Tycker dock att den här lösningen verkar lite omständig? Finns det inget lättare sätt att få ett formulär att skrivas ut om ett visst påstående är sant? Kanske borde jag lägga formuläret i en separat fil och köra en include om påståendet är sant?

jmeMedlem sedan maj 20012 237 inlägg
#14

trankan:

Jag ville ge ett mer utförligt exempel där jag bättre kan visa vad jag egentligen menar. :)

Det ä väl inte fel att skriva ut strängen i funktionen men det kan bli ett problem senare.

Du kan ju, som du själv säger, lägga koden i en separat fil och sedan inkludera den.

jmeMedlem sedan maj 20012 237 inlägg
#15

Jag tycker att du i dina if-satser antingen kallar på en funktion som returnerar strängen eller så kör du med en include.

Välj det som du tycker känns mest bekvämt.

TrankanMedlem sedan okt. 2006129 inlägg
#16

jme skrev:

Jag tycker att du i dina if-satser antingen kallar på en funktion som returnerar strängen eller så kör du med en include.

Välj det som du tycker känns mest bekvämt.

Jo precis, tack för hjälpen! :)

Gick tillbaka till förslaget som nitro2k01 gav och kom fram till att det verkar fungera bra. Tänkte att jag skulle ta bort lite kod så att endast alternativen och inte själva menyn skrivs ut, eftersom den koden egentligen inte behöver finnas med i strängen. Det vill dock inte fungera, får bara fram ett enda alternativ i menyn. Någon som vet om jag har gjort något fel?

$selected = 'AL';
$countrylist = array(
            'AF' =>    'Afganistan',
            'AL' =>    'Albania',
            'DZ' =>    'Algeria');

foreach ($countrylist as $key => $value) {
    $selstr = ($key==$selected)?"selected=\"selected\"":"";
    $str = "<option value=\"{$key}\" {$selstr}>{$value}</option>\n";
}

echo "<select name=\"country\">$str</select>";
jmeMedlem sedan maj 20012 237 inlägg
#17

du har

$str = ...

men du ska ha

$str .= ...

TrankanMedlem sedan okt. 2006129 inlägg
#18

jme skrev:

du har

$str = ...

men du ska ha

$str .= ...

Ah, trodde inte att jag skulle ha med punkten eftersom jag bara definierade $str en gång. Tack igen! :)

aasahMedlem sedan mars 20034 471 inlägg
#19

Trankan skrev:

Ah, trodde inte att jag skulle ha med punkten eftersom jag bara definierade $str en gång.

Det är helt rätt. Jag tror att rådet förutsatte att $selstr också hette $str ?

Sedan dina måsvingar i strängen har noll funktion utöver att göra den mer svårläst:

//Du skriver:
$str = "<option value=\"{$key}\" {$selstr}>{$value}</option>\n"; 

//Detta är SAMMA SAK som:
$str = "<option value=\"$key\" $selstr>$value</option>\n";

Du behöver bara måsvingar om din variabel tex ser ut så här:
$myArray[0], dvs variabeln slutar inte där texten tar slut '[0]' hör till den också.

jmeMedlem sedan maj 20012 237 inlägg
#20

$str kommer ju ha det sista värdet i arrayn $countrylist.

Flytta in echo raden som sista raden i loopen så kommer varje option-element att skrivas ut.

Jag skulle dock antingen konkatenera dessa rader i loopen.

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