Ver Mensaje Individual
  #5 (permalink)  
Antiguo 17/12/2005, 05:01
Avatar de franquero
franquero
 
Fecha de Ingreso: julio-2005
Mensajes: 179
Antigüedad: 18 años, 9 meses
Puntos: 1
Ejemplo de formulario PHP con validación y valores enviados por defecto

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
__________________
Es una suerte que la sociedad libre sea más productiva, porque de no haberlo sido jamás se habría tolerado.