CodeIgniter Forums
Validaciones Personalizadas - Printable Version

+- CodeIgniter Forums (https://forum.codeigniter.com)
+-- Forum: General (https://forum.codeigniter.com/forum-1.html)
+--- Forum: Regional User Groups (https://forum.codeigniter.com/forum-25.html)
+--- Thread: Validaciones Personalizadas (/thread-79240.html)



Validaciones Personalizadas - ysanchez - 05-16-2021

Saludos a todos, soy nuevo en la programacion en general y estoy comenzando en codeigniter 4, mi problema es que ha la hora de realizar validaciones personalizadas no logro que el campo me valide, el codigo explota por completo y me dice que no es correcta la validacion, en la documentacion explica como hacerlo y trato de realizarlo pero no lo consigo, a continuacion les dejo el ejemplo:

tengo un campo en la vista que se llama mes y quiero validar que a la hora de llenar este campo se registre un numero del 1 al 12, en el controlador he realizado esto:
public function reglaM($mes,&$error = null){
        if((int)$mes<1 && (int)$mes>12){
            $error=lang('reglaMeses');
            return false;
        }
            return true;
    }

y este es el error que me da (reglaM no es una regla de validación válida)

Code:
use CodeIgniter\Exceptions\ExceptionInterface;
4 use CodeIgniter\Exceptions\FrameworkException;
5
6 class ValidationException extends FrameworkException implements ExceptionInterface
7 {
8     public static function forRuleNotFound(string $rule = null)
9     {
10         return new static(lang('Validation.ruleNotFound', [$rule]));
11     }
12
13     public static function forGroupNotFound(string $group = null)
14     {
15         return new static(lang('Validation.groupNotFound', [$group]));
16     }

tambien lo realizo como explica la documentacion, yo creo un carpeta en app\Validacion y dentro un archivo que se llama MiVal.php, en este archivo porgo lo siguiente:
<?php
namespace App\Validacion;
class Myregla{
    public function reglaMeses($mes,&$error = null){
        if((int)$mes<1 && (int)$mes>12){
            $error=lang('reglaMeses');
            return false;
        }
            return true;
    }
}
?>

en el archivo app\Validation.php dentro de:
public $ruleSets = [
        \CodeIgniter\Validation\Rules::class,
        \CodeIgniter\Validation\FormatRules::class,
        \CodeIgniter\Validation\FileRules::class,
        \CodeIgniter\Validation\CreditCardRules::class,
        \App\Validacion\Myregla::class,
  
    ];
y en el controlador en las reglas del campo mes: 'meses'=>['label'=>'(Cantidad de Meses Atrasados)','rules'=>'required|numeric|reglaMeses'],
y tampoco me lo reconoce codeigniter 4 ya no se que mas hacer, necesito su ayuda. gracias


RE: Validaciones Personalizadas - Beewez - 06-04-2021

Porque estas validando de esta manera ?

Te dejo un ejemplo de como validar campos

$validadores = service('validation');
$validadores->setRules(
[
'Usuario' => 'required',
'Telefono' => 'required',
],
);

if (!$validadores->withRequest($this->request)->run()) {
# - Redirijo hacia la pagina anterior
# - Con withInput envio los valores de entrada para no volver a escribir los valores de los input
# - Se estarian enviando los valores del request que llegan a esta funcion. Tambien se envian los errores. Todo eso se envia por una SESSION que genera CI
return redirect()->back()->withInput()->with('errors', $validadores->getErrors());
}


RE: Validaciones Personalizadas - shadowmx - 06-10-2021

Yo lo que e realizado para aplicar funciones de validación mas fácil las e cargado como Helper para usarlas en cualquier lado para empezar, por ejemplo creo un Helper (validation_helper.php)
Dentro creo mi función, en tu caso.
PHP Code:
if(!function_exists('reglaMeses')){
    function reglaMeses(int $mes): bool
    
{
      if($mes<or $mes>12){
        return FALSE;
      }else{
        return true;
      }
    
    
}


Sobre el error en respuesta en idiomas (Language) creo dentro dentro de la carpeta de idioma el archivo Validation.php
osea que quedaría el archivo con la ruta /app/Language/es/Validation.php el cual el contenido seria para esta funcion:

PHP Code:
return [
    // Rule Messages
  'reglaMeses'                => 'El campo {field} debe contener un mes valido.',
]; 

Cargo mi helper en mi BaseController que uso para todos mis controladores o en el controlado que requiera, segun tu gusto.
PHP Code:
helper['validation'

Y ya en mi Modulo o Controlador donde defina las validaciones lo incorporo.

Ejemplo en tu Modelo lo metemos como unas reglas personalizadas a tu gusto:
PHP Code:
protected $validando_fechas_amigusto    = [
        'meses'              => 'required|integer|max_length[2]|reglaMeses',
        'dias'              => 'required|integer|max_length[2]',
        'ubicacion_etc_etc'          => 'required',
    ]; 

Y en mi Controlador que carga el Modelo con las reglas definidas previamente, en la funcion o pagina que lo requiera ya sea post o get, (en mi caso Post) lo valido asi por ejemplo
PHP Code:
//Controlador XYZ en el Construct llamo mi modelo
public function __construct()
    {
        //Load
        $this->mimodulodefinidoatugusto = new \App\Models\mimodelo();
        // Alternativa a cargar el Modelo
        //$this->mimodulodefinidoatugusto = model('App\Models\mimodelo', false);
    
PHP Code:
//Controlador XYZ
public function mipagina()
{
  if ($_POST) {
    //SI no pasa la validacion mando un error para algun popup o funcion que recoga y muestre errores
    if (!$this->validate($this->mimodulodefinidoatugusto->validando_fechas_amigusto)) {
                        $content = [
                            'msj' => langv2('Error.some_entry_needs_to_be_corrected'),
                        ];
                        //Regreso a la pagina anterior y le cargo el error
                        return redirect()->back()->withInput()->with('error'$content);
                    
                    ///SI paso la validacion ejecuto lo que requiera con los datos.
                  else {
                    //Recupero mis valores y ya los utilizo como quiera
                    $mes $this->request->getPost('mes');
                    $dia $this->request->getPost('dia');

                  }


Y en mi plantilla de vista que esta dentro de la carpeta view cargo la funcion de validator
PHP Code:
$validation service('validation'
Y en mis field de forms la uso asi

PHP Code:
if ($validation->hasError('meses'))
{
    echo 
$validation->getError('meses');


Espero te sirva. Saludos