Código PHP:
<?php
// Establecer los arrays de opciones en los menús select
// estos son necesarios en display_form(), validate_form(),
// y process_form(), por lo que se declaran en el ámbito global
$sweets = array('puff' => 'Sesame Seed Puff',
'square' => 'Coconut Milk Gelatin Square',
'cake' => 'Brown Sugar Cake',
'ricemeat' => 'Sweet Rice and Meat');
$main_dishes = array('cuke' => 'Braised Sea Cucumber',
'stomach' => "Sauteed Pig's Stomach",
'tripe' => 'Sauteed Tripe with Wine Sauce',
'taro' => 'Stewed Pork with Taro',
'giblets' => 'Baked Giblets with Salt',
'abalone' => 'Abalone with Marrow and Duck Feet');
// La lógica de la página principal
// - Si se envía el formulario, validar y luego procesar o volver a mostrar
// - Si no se envía, mostrar
if ($_POST['_submit_check']) {
// Si validate_form() devuelve errores, pasarlos a show_form()
if ($form_errors = validate_form()) {
show_form($form_errors);
} else {
// Los datos enviados son válidos, entonces procesarlos
process_form();
}
} else {
// El formulario no fue enviado, entonces mostrarlo
show_form();
}
function show_form($errors = '') {
// Si el formulario se envió, obtener los valores por defecto
if ($_POST['_submit_check']) {
$defaults = $_POST;
} else {
// Sino, establecer los propios valores por defecto
$defaults = array('delivery' => 'yes',
'size' => 'medium');
}
// Si se pasaron errores, ponerlos en $error_text (con códigos HTML)
if ($errors) {
$error_text = '<tr><td>You need to correct the following errors:';
$error_text .= '</td><td><ul><li>';
$error_text .= implode('</li><li>',$errors);
$error_text .= '</li></ul></td></tr>';
} else {
// Si no había errores, entonces $error_text está en blanco
$error_text = '';
}
// Salimos del modo PHP para facilitar la visualización de todas las etiquetas HTML
?>
<form method="POST" action="<?php print $_SERVER['PHP_SELF']; ?>">
<table>
<?php print $error_text ?>
<tr><td>Your Name:</td>
<td><?php input_text('name', $defaults) ?></td></tr>
<tr><td>Size:</td>
<td><?php input_radiocheck('radio','size', $defaults, 'small'); ?> Small <br/>
<?php input_radiocheck('radio','size', $defaults, 'medium'); ?> Medium <br/>
<?php input_radiocheck('radio','size', $defaults, 'large'); ?> Large
</td></tr>
<tr><td>Pick one sweet item:</td>
<td><?php input_select('sweet', $defaults, $GLOBALS['sweets']); ?>
</td></tr>
<tr><td>Pick two main dishes:</td>
<td>
<?php input_select('main_dish', $defaults, $GLOBALS['main_dishes'], true) ?>
</td></tr>
<tr><td>Do you want your order delivered?</td>
<td><?php input_radiocheck('checkbox','delivery', $defaults, 'yes'); ?> Yes
</td></tr>
<tr><td>Enter any special instructions.<br/>
If you want your order delivered, put your address here:</td>
<td><?php input_textarea('comments', $defaults); ?></td></tr>
<tr><td colspan="2" align="center"><?php input_submit('save','Order'); ?>
</td></tr>
</table>
<input type="hidden" name="_submit_check" value="1"/>
</form>
<?php
} // final de show_form()
function validate_form() {
$errors = array();
// el nombre es necesario
if (! strlen(trim($_POST['name']))) {
$errors[] = 'Please enter your name.';
}
// size es necesario
if (($_POST['size'] != 'small') && ($_POST['size'] != 'medium') &&
($_POST['size'] != 'large')) {
$errors[] = 'Please select a size.';
}
// sweet necesario
if (! array_key_exists($_POST['sweet'], $GLOBALS['sweets'])) {
$errors[] = 'Please select a valid sweet item.';
}
// exacatmente se necesitan dos platos
if (count($_POST['main_dish']) != 2) {
$errors[] = 'Please select exactly two main dishes.';
} else {
// Sabemos que hay dos platos seleccionados, por lo tanto
// asegurarse de que los dos son válidos
if (! (array_key_exists($_POST['main_dish'][0], $GLOBALS['main_dishes']) &&
array_key_exists($_POST['main_dish'][1], $GLOBALS['main_dishes']))) {
$errors[] = 'Please select exactly two valid main dishes.';
}
}
// Si el envío (delivery) está activado, entonces los comentarios deben contener algo
if (($_POST['delivery'] == 'yes') && (! strlen(trim($_POST['comments'])))) {
$errors[] = 'Please enter your address for delivery.';
}
return $errors;
}
function process_form() {
// Buscar los nombres completos del dulce (sweet) y los platos principales (main_dishes)
// en los arrays $GLOBALS['sweets'] y $GLOBALS['main_dishes']
$sweet = $GLOBALS['sweets'][ $_POST['sweet'] ];
$main_dish_1 = $GLOBALS['main_dishes'][ $_POST['main_dish'][0] ];
$main_dish_2 = $GLOBALS['main_dishes'][ $_POST['main_dish'][1] ];
if ($_POST['delivery'] == 'yes') {
$delivery = 'do';
} else {
$delivery = 'do not';
}
// Crear el texto del mensaje
$message=<<<_ORDER_
Thank you for your order, $_POST[name].
You requested the $_POST[size] size of $sweet, $main_dish_1, and $main_dish_2.
You $delivery want delivery.
_ORDER_;
if (strlen(trim($_POST['comments']))) {
$message .= 'Your comments: '.$_POST['comments'];
}
// enviar el mensaje al cocinero :)
mail('[email protected]', 'New Order', $message);
// Imprimir el mensaje pero codificar cualquier entidad HTML
// <br/> tags y convertir las nuevas líneas en etiquetas <br/>
print nl2br(htmlentities($message));
}
?>
Existen cuatro partes en el código: el código en el ámbito global al principio del ejemplo, la función show_form(), la función validate_form(), y la función process_form().
El código de ámbito global hace dos cosas. La primera es establecer dos arrays que describen las opciones de los menús <select> del formulario. La otra tarea del código global es procesar la sentencia if() que decide qué hay que hacer: mostrar el formulario por pantalla, validarlo o procesarlo.
Mostrar el formulario se lleva a cabo mediante show_form(). En primer lugar, la función convierte en un array de valores por defecto. Si se ha enviado el formulario y se está volviendo a mostrar, entonces los valores por defecto proceden de $_POST. De lo contrario, está explícitamente establecidos.
Luego show_form() imprime una lista de errrores, si los hubiera. La lista de los errores se imprime utilizando HTML y la función implode(), aunque también se podría hacer con foreach. A continuación show_form() sale del modo PHP para imprimir el formulario.
La función validate form() crea un array de mensajes de error si los datos enviados no cumplen los requisitos.
Por último, process_form() entra en acción cuando se envía el formulario con datos válidos. Antes den enviar el mensaje, éste pasa por htmlentities(), que codifica cualquier carácter especial como entidades HTML. Y también pasa por nl2br(), que convierte cualquier línea nueva en las etiquetas <br> de HTML, para que los saltos de línea en el mensaje se muestren por pantalla adecuadamente en un navegador web.
Ejemplo extraído de "Introducción a PHP 5. Autor David Sklar. Editorial Anaya Multimedia
Espero que sirva
Saludos