Hallo,

Ik ben bezig met een functie om formulier velden te tonen, maar krijg het niet voor elkaar om alle velden te returnen.

Dit is een niet-volledig uitgewerkt voorbeeld (het gaat om de foreach):


function mijn_function()
	// hier initieer ik $fields en $value etc
	if( $fields ) {
		foreach( $fields as $field_name => $field ) {
			$the_field = '';
			$the_field .= '<p>';
				if ( $field['type'] == 'text' ) {
					$the_field .= '<span>'.$value.'</span>';
				}
				if ( $field['type'] == 'textarea' ) {
					$the_field .= '<span>'.$value.'</span>';
				}
				if ( $field['type'] == 'url' ) {
					$the_field .= '<span>'.$value.'</span>';
				}
			$the_field .= '</p>';
			return $the_field;
		}
	}
}


Hij returned alleen het eerste veld (het 'text' veld). Ik weet dat dit normaal gedrag is, maar het lukt me niet om dit werkend te maken... zodat alle velden gereturned worden.

Moet ik het result omzetten naar een array en dan in één keer returnen? Wie kan me verder helpen?

Guido
Er ontbreken alleen een paar { en $ tekens

<?php
function mijn_function()
{
	if( $fields )
	{
		foreach( $fields as $field_name => $field )
		{
			$the_field = '';
			$the_field .= '<p>';
			if ( $field['type'] == 'text' )
			{
				$the_field .= '<span>'.$value.'</span>';
			}
			if ( $field['type'] == 'textarea' )
			{
				$the_field .= '<span>'.$value.'</span>';
			}
			if ( $field['type'] == 'url' )
			{
				$the_field .= '<span>'.$value.'</span>';
			}
			$the_field .= '</p>';
			return $the_field;
		}
	}
}
?>
<?php
function mijn_function()
{
$the_field = '';
if( $fields )
{
foreach( $fields as $field_name => $field )
{
$the_field .= '<p>';
if ( $field['type'] == 'text' )
{
$the_field .= '<span>'.$value.'</span>';
}
if ( $field['type'] == 'textarea' )
{
$the_field .= '<span>'.$value.'</span>';
}
if ( $field['type'] == 'url' )
{
$the_field .= '<span>'.$value.'</span>';
}
$the_field .= '</p>';
}
}
return $the_field;
}
?>

Waar $fields vandaan komt zie ik niet.
Misschien handig om in de functie aanroep te zetten.

Dus: function mijn_function( $fields )
En $the_field staat binnen de foreach, dus geen wonder dat alleen het eerste veld wordt teruggegeven.
Het return-statement (regel 23) zou tussen regel 24 en 25 (in het fragment van @adoptive) geplaatst moeten worden.

Waar komt $fields trouwens vandaan (en hoe kan dit uberhaupt werken op dit moment, is dit een volledig codefragment)?

En wat gebeurt er als $fields niet bekend is? Dan wordt er niets geretourneerd. Het is meestal handiger als er altijd iets wordt teruggegeven, al was het maar false ofzo.
Er ontbreken alleen een paar { en $ tekens

Stom, wordt aangepast. Maar nog steeds wordt alleen het eerste veld gereturned (type 'text').

En $the_field staat binnen de foreach, dus geen wonder dat alleen het eerste veld wordt teruggegeven.

Als ik hem na de closing tag van de foreach plaats, wordt alleen de laatste veld gereturned (type 'url').

Ik had al aangegeven dat het om de foreach ging, de rest vd functie leek me niet relevant en daarom niet volledig vermeld. Overigens, als ik echo ipv return worden alle velden wel weergegeven.
Ik heb dit verzonnen.

<?php
function mijn_function( $fields )
{
	$the_field = '';
	foreach( $fields as $field_name => $field )
	{
		$the_field .= '<p>';
		if ( $field_name == 'text' )
		{
			$the_field .= '<span>' . $field . '</span>';
		}
		if ( $field_name == 'textarea' )
		{
			$the_field .= '<span>' . $field . '</span>';
		}
		if ( $field_name == 'url' )
		{
			$the_field .= '<span>' . $field . '</span>';
		}
		$the_field .= '</p>' . PHP_EOL;
	}
	return $the_field;
}


$inputvelden = [];
$inputvelden['text'] = 'Een tekst';
$inputvelden['textarea'] = 'Tekst in een textarea';
$inputvelden['url'] = 'http://www.example.com';

echo mijn_function( $inputvelden );
?>


Krijg je dit

<p><span>Een tekst</span></p>
<p><span>Tekst in een textarea</span></p>
<p><span>http://www.example.com</span></p>
Wil je ook echt een lege paragraaf retourneren als de veldnaam niet bekend is?
En is het waarschijnlijk dat de verschillende veldtypen een verschillende opmaak krijgen, en het bovenstaande gevalsonderscheid dus geoorloofd is?

Anders kan het namelijk allemaal een stuk korter.

Misschien is het ook het overwegen waard om hier output buffering te gebruiken, in plaats van alles te concateneren in een string.

<?php
function my_function($fields) {
    ob_start();
        foreach ($fields as $type => $text) {
            if (in_array($type, array(
                'text',
                'textarea',
                'url',
            ))) {
                ?><p><span><?php echo $text; ?></span></p><?php
            } else {
                ?><p></p><?php
            }
        }
    return ob_get_clean();
}
?>
Hoi,

Ik heb niet de volledige inhoud van de functie hier weergegeven omdat het binnen WordPress gebruikt wordt en ik native WordPress functies aanroep, die ik anders allemaal hier moet gaan uitleggen.

Daarom dacht ik dat ik kon volstaan met de kern van mijn probleem: hij returned alleen het eerste of laatste veld (afhankelijk op welke locatie ik return plaats binnen de functie).

Wil je ook echt een lege paragraaf retourneren als de veldnaam niet bekend is?

Nee sorry, als veld type niet ondersteund wordt moet hij inderdaad een melding returnen (had ik niet verwerkt in mijn voorbeeld).

Echo gebruiken is helaas geen optie, omdat ik de output weer in een andere functie aanroep.

Guido
Guido - op 19/07/2019 17:17:43
Echo gebruiken is helaas geen optie, omdat ik de output weer in een andere functie aanroep.

Je bedoelt dat het niet de bedoeling is dat de functie zelf output produceert? Dat gebeurt ook niet want de output wordt opgevangen in een buffer. Vandaar output buffering. Alle "output" wordt dus nog steeds geretourneerd als string, maar dan zonder al dat gedoe met quotes, concatenering en de hele santekraam.

Reageren