Diferencia entre revisiones de «Validando formulario con clase kumbia validate»

De KumbiaPHP Framework Wiki
 
(No se muestran 3 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
'''Atención: Este tutorial esta basado en la version Spirit beta2 de KumbiaPHP Framework.'''
+
'''Atención: Este tutorial esta basado en la version 1.x de KumbiaPHP Framework.'''
  
 
Muchas veces necesitamos usar formularios para que una empresa/persona contacte con nosotros a través de nuestra web. Para validar los datos enviados y evitar un mal uso del mismo, el equipo de Kumbia ha desarrollado una nueva clase llamada Validate desvinculada de las validaciones propias de los modelos basados en ActiveRecord.
 
Muchas veces necesitamos usar formularios para que una empresa/persona contacte con nosotros a través de nuestra web. Para validar los datos enviados y evitar un mal uso del mismo, el equipo de Kumbia ha desarrollado una nueva clase llamada Validate desvinculada de las validaciones propias de los modelos basados en ActiveRecord.
Línea 13: Línea 13:
 
 
 
return array(
 
return array(
'NombreCompleto' => array(
+
'NombreCompleto' => [
'required'=>array('error'=>'Indique su nombre.'),
+
'required' => ['error' => 'Indique su nombre.'],
'alpha' =>array('error'=>'Nombre incompleto o incorrecto.')
+
'alpha'   => ['error' => 'Nombre incompleto o incorrecto.']
),
+
],
'Email' => array(
+
'Email' => [
'required'=>array('error'=>'Indique su email.'),
+
'required' => ['error' => 'Indique su email.'],
'email' => array('error'=>'Email incorrecto.')
+
'email'   => ['error' => 'Email incorrecto.']
),
+
],
'Movil' => array(
+
'Movil' => [
'required'=>array('error'=>'Indique su teléfono / móvil.'),
+
'required' => ['error' => 'Indique su teléfono / móvil.'],
'length' => array('min'=>'9','max'=>'17','error'=>'Teléfono / móvil incorrecto'),
+
'length'   => ['min' => '9',
'pattern' => array('regexp'=>'/^\+(?:[0-9] ?){6,14}[0-9]$/','error'=>'Teléfono incorrecto. Formato ejemplo. +34 862929929')
+
                                'max' => '17',
),
+
                                'error' => 'Teléfono / móvil incorrecto'],
'Asunto' => array(
+
'pattern' => ['regexp' => '/^\+(?:[0-9] ?){6,14}[0-9]$/',  
'required'=>array('error'=>'Indique un asunto.'),
+
                                'error' => 'Teléfono incorrecto. Formato ejemplo. +34 862929929']
),
+
],
'Mensaje' => array(
+
'Asunto' => [
'required'=>array('error'=>'Indique un mensaje.'),
+
'required' => ['error' => 'Indique un asunto.'],
'length'=>array('min'=>100, 'error'=>'Si es posible, concrete más en su mensaje.'),
+
],
)
+
'Mensaje' => [
 +
'required' => ['error' => 'Indique un mensaje.'],
 +
'length'   => ['min' => 100,
 +
                                'error' => 'Si es posible, concrete más en su mensaje.'],
 +
]
 
);
 
);
  
 
 
 
}
 
}
  
  
// Envio de datos para generar email
+
    // Envio de datos para generar email
public function enviar($datos) {
+
    public function enviar($datos) {
+
   
$validador = new Validate($datos, $this->reglas() );
+
        $validador = new Validate($datos, $this->reglas() );
if (!$validador->exec()) {
+
        if (!$validador->exec()) {
$validador->flash();
+
                $validador->flash();
} else {
+
                return false;
+
        }
// Enviar email
+
   
 
+
        // Enviar email
}
+
   
 
+
    }
}
 
  
 
}
 
}
Línea 64: Línea 65:
  
 
<div class="container">
 
<div class="container">
<?php echo Form::open() ?>
+
<?= Form::open() ?>
 
<?php View::content() ?>
 
<?php View::content() ?>
 
<fieldset><legend>Contactar</legend>
 
<fieldset><legend>Contactar</legend>
<?php echo Form::label('Nombre completo:', 'contactar_NombreCompleto') ?> <?php echo Form::text('contactar.NombreCompleto') ?>
+
<label required>Nombre completo:
<?php echo Form::label('Email:', 'contactar_Email') ?> <?php echo Form::text('contactar.Email') ?>
+
<?= Form::text('contactar.NombreCompleto') ?>
<?php echo Form::label('Teléfono / Móvil:', 'contactar_Movil') ?> <?php echo Form::text('contactar.Movil') ?>
+
</label>
<?php echo Form::label('Mensaje:', 'contactar_Mensaje') ?> <?php echo Form::textarea('contactar.Mensaje') ?>
+
<label required>Email:
<?php echo Form::submit('Enviar') ?>
+
<?= Form::text('contactar.Email') ?>
 +
</label>
 +
<label required>Teléfono / Móvil:
 +
<?= Form::text('contactar.Movil') ?>
 +
</label>
 +
<label required>Mensaje:
 +
<?= Form::textarea('contactar.Mensaje') ?>
 +
</label>
 +
<?= Form::submit('Enviar') ?>
 
</fieldset>
 
</fieldset>
<?php echo Form::close() ?>
+
<?= Form::close() ?>
 
</div>
 
</div>
  
Línea 82: Línea 91:
 
<source lang=php line>
 
<source lang=php line>
  
Load::model('sendform');
+
 
 
class IndexController extends AppController
 
class IndexController extends AppController
 
{
 
{
Línea 88: Línea 97:
 
     public function index()
 
     public function index()
 
     {
 
     {
         // Verificamos que se envian datos desde el formulario
+
         // Verificamos que se envían datos desde el formulario
 
if (Input::hasPost('contactar')) {
 
if (Input::hasPost('contactar')) {
 
 
Línea 94: Línea 103:
 
// Procesamos envio de formulario
 
// Procesamos envio de formulario
 
if ($form->enviar(Input::post('contactar'))) {
 
if ($form->enviar(Input::post('contactar'))) {
// Si se envia correctamente, limpiamos el formulario para evitar reenvios
+
// Si se envía correctamente, limpiamos el formulario para evitar reenvíos
 
Input::delete('contactar');
 
Input::delete('contactar');
 
}  
 
}  

Revisión actual del 10:57 11 jun 2020

Atención: Este tutorial esta basado en la version 1.x de KumbiaPHP Framework.

Muchas veces necesitamos usar formularios para que una empresa/persona contacte con nosotros a través de nuestra web. Para validar los datos enviados y evitar un mal uso del mismo, el equipo de Kumbia ha desarrollado una nueva clase llamada Validate desvinculada de las validaciones propias de los modelos basados en ActiveRecord.

Para este tutorial necesitaremos como mínimo un controller, un modelo y una vista. Si descargamos el paquete KumbiaPHP del GitHub podemos usar el controller por defecto y su vista y sólo nos quedaría crear el modelo.

Modelo: sendform.php[editar]

class SendForm {
	
	private function reglas() {
	
		return array(
			'NombreCompleto' => [
				'required' => ['error' => 'Indique su nombre.'],
				'alpha'    => ['error' => 'Nombre incompleto o incorrecto.']
			],
			'Email' => [
				'required' => ['error' => 'Indique su email.'],
				'email'    => ['error' => 'Email incorrecto.']
			],
			'Movil' => [
				'required' => ['error' => 'Indique su teléfono / móvil.'],
				'length'   => ['min' => '9',
                                'max' => '17',
                                'error' => 'Teléfono / móvil incorrecto'],
				'pattern'  => ['regexp' => '/^\+(?:[0-9] ?){6,14}[0-9]$/', 
                                'error'  => 'Teléfono incorrecto. Formato ejemplo. +34 862929929']
			],
			'Asunto' => [
				'required' => ['error' => 'Indique un asunto.'],
			],
			'Mensaje' => [
				'required' => ['error' => 'Indique un mensaje.'],
				'length'   => ['min' => 100,
                                'error' => 'Si es posible, concrete más en su mensaje.'],
			]
		);

	}


    // Envio de datos para generar email
    public function enviar($datos) {
    		
        $validador = new Validate($datos, $this->reglas() );
        if (!$validador->exec()) {
                $validador->flash();
                return false;
        }
    		
        // Enviar email
    
    }

}

Vista: index.phtml[editar]

En nuestra vista debemos añadir los controles para los campos del formulario. Hemos usado la nomenclatura contactar.<field> para agrupar en una única variable los datos del formulario.

<div class="container">
<?= Form::open() ?>
<?php View::content() ?>
<fieldset><legend>Contactar</legend>
<label required>Nombre completo:
<?= Form::text('contactar.NombreCompleto') ?>
</label>
<label required>Email:
<?= Form::text('contactar.Email') ?>
</label>
<label required>Teléfono / Móvil:
<?= Form::text('contactar.Movil') ?>
</label>
<label required>Mensaje:
<?= Form::textarea('contactar.Mensaje') ?>
</label>
<?= Form::submit('Enviar') ?>
</fieldset>
<?= Form::close() ?>
</div>

Controller: index_controller.php[editar]

class IndexController extends AppController
{

    public function index()
    {
        // Verificamos que se envían datos desde el formulario
	if (Input::hasPost('contactar')) {
			
		$form = new SendForm();
		// Procesamos envio de formulario
		if ($form->enviar(Input::post('contactar'))) {
			// Si se envía correctamente, limpiamos el formulario para evitar reenvíos
			Input::delete('contactar');
		} 
			
	}
		
    }

}

Notas finales[editar]

Este tipo de validaciones a nivel de servidor son una excelente herramienta para asegurarnos que los datos llegan correctamente. Validate también se puede combinar con la librería Filter para evitar inyecciones de código o ataques malicioso basados en formularios.