[SOLUCIONADO] Ayuda con Script de Validación de RUT

Muy buenas a todos:

Soy muy nuevo en Yii y PHP y tengo una duda que quizás sea bastante básica pero realmente no se como hacerlo.

En mi proyecto los usuarios hacen Login a la aplicación con su número cédula de identidad (en mi país se le llama RUT) y un password, me gustaría validar el RUT al momento de que este lo escriba, lo cual se hace con el siguiente Script que tengo guardado en un block de notas:


function checkRutField(rut)

{

  var tmpstr = "";

  for ( i=0; i < rut.length ; i++ )

    if ( rut.charAt(i) != ' ' && rut.charAt(i) != '.' && rut.charAt(i) != '-' )

      tmpstr = tmpstr + rut.charAt(i);

  rut = tmpstr;

  largo = rut.length;

// [VARM+]

  tmpstr = "";

  for ( i=0; rut.charAt(i) == '0' ; i++ );

  for (; i < rut.length ; i++ )

     tmpstr = tmpstr + rut.charAt(i);

  rut = tmpstr;

  largo = rut.length;

// [VARM-]

  if ( largo < 2 )

  {

    alert("Debe ingresar el rut completo.");

    document.login.rut_aux.focus();

    document.login.rut_aux.select();

    return false;

  }

  for (i=0; i < largo ; i++ )

  {

    if( (rut.charAt(i) != '0') && (rut.charAt(i) != '1') && (rut.charAt(i) !='2') && (rut.charAt(i) != '3') && (rut.charAt(i) != '4') && (rut.charAt(i) !='5') && (rut.charAt(i) != '6') && (rut.charAt(i) != '7') && (rut.charAt(i) != '8') && (rut.charAt(i) != '9') && (rut.charAt(i) !='k') && (rut.charAt(i) != 'K') )

    {

      alert("El valor ingresado no corresponde a un R.U.T valido.");

      document.login.rut_aux.focus();

      document.login.rut_aux.select();

      return false;

    }

  }

  var invertido = "";

  for ( i=(largo-1),j=0; i>=0; i--,j++ )

    invertido = invertido + rut.charAt(i);

  var drut = "";

  drut = drut + invertido.charAt(0);

  drut = drut + '-';

  cnt = 0;

  for ( i=1,j=2; i<largo; i++,j++ )

    {

    if ( cnt == 3 )

    {

      drut = drut + '.';

      j++;

      drut = drut + invertido.charAt(i);

      cnt = 1;

    }

    else

    {

      drut = drut + invertido.charAt(i);

      cnt++;

    }

  }

  invertido = "";

  for ( i=(drut.length-1),j=0; i>=0; i--,j++ )

    invertido = invertido + drut.charAt(i);

  document.login.rut_aux.value = invertido;

  if(!checkDV(rut))

    return false;

  return true;

}


function checkDV(crut)

{

  largo = crut.length;

  if(largo < 2){

    alert("Debe ingresar el rut completo.");

    document.login.rut_aux.select();

    document.login.rut_aux.focus();

    return false;

  }

  if(largo > 2){

    rut = crut.substring(0, largo - 1);

  }

  else{

    rut = crut.charAt(0);

  }

  dv = crut.charAt(largo-1);


  if(!checkCDV(dv))

     return false;


  if(rut == null || dv == null){

      return false;

  }


  var dvr = '0';

  suma = 0;

  mul  = 2;

  for (i= rut.length -1 ; i >= 0; i--){

    suma = suma + rut.charAt(i) * mul;

    if(mul == 7){

      mul = 2;

    }

    else{

      mul++;

    }

  }

  res = suma % 11;

  if (res==1){

    dvr = 'k';

  }

  else{

    if(res==0){

      dvr = '0';

    }

    else{

      dvi = 11-res;

      dvr = dvi + "";

    }

  }

  if(dvr != dv.toLowerCase()){

    alert("EL rut es incorrecto.");

    document.login.rut_aux.select();

    document.login.rut_aux.focus();

    //document.login.rut_aux.value = "";

    return false;

  }

  return true;

}


function checkCDV(dvr)

{

  dv = dvr + "";

  if(dv != '0' && dv != '1' && dv != '2' && dv != '3' && dv != '4' && dv != '5' && dv != '6' && dv != '7' && dv != '8' && dv != '9' && dv != 'k'  && dv != 'K'){

    alert("Debe ingresar un digito verificador valido.");

    document.login.rut_aux.select();

    document.login.rut_aux.focus();

    return false;

  }

  return true;

}




function checkAll(){ 


	rut_val = document.login.rut_aux.value;  

	if(rut_val.length == 0){         

	    alert("Ingrese su R.U.T.");

        document.login.rut_aux.select();

	    document.login.rut_aux.focus();

	    return;

	}

	if(!checkRutField(document.login.rut_aux.value)){  

      //  document.login.rut_aux.select();

	 //   document.login.rut_aux.focus();

	    return;

	}


  if(document.login.clv.value.length == 0){

    alert("Debes ingresar tu Clave");

	 document.login.clv.select();

	 document.login.clv.focus();

     return;

  }

  if (document.login.clv.value.length != 6){

    alert("La clave a ingresar corresponde a la clave alfanumérica de 6 caracteres, la misma que utilizas cuando llamas al 600 5 242424");

	 document.login.clv.select();

	 document.login.clv.focus();

    return;

  }


	var tmpstr = "";

  	for(i=0; i < rut_val.length ; i++){

    	if(rut_val.charAt(i) != ' ' && rut_val.charAt(i) != '.' && rut_val.charAt(i) != '-'){

      		tmpstr = tmpstr + rut_val.charAt(i);

      	}

    }

    rut_val = tmpstr;

    rut_valor = rut_val.substring(0,rut.length);


  document.login.rut.value = rut_val.substring(0,rut.length);

  document.login.dig.value = rut_val.substring(rut.length,rut.length+1);	

  document.login.rut_aux.value = "";


  document.login.clv.value = document.login.clv.value.toUpperCase();

  document.login.dig.value = document.login.dig.value.toUpperCase();

 

  document.login.clave.value = document.login.clv.value; 

  document.login.clv.value = "";

 

  document.login.submit();

}

Mi problema es que no se donde se pone dicho script o si tengo que guardarlo con alguna extensión en particular,

ni como llamar la función checkRutField(rut) para pasarle como parámetro el username que es de donde voy a tomar el RUT que ingrese el usuario.

De antemano Muchas gracias.

Hola RiosEspinosa.

Para referenciar un Script en Yii puedes hacerlo de la siguiente forma, poniendo estas lienas de codigo en la vista en la cual necesitas llamar el Script:




 Yii::app()->getClientScript()->registerScriptFile(Yii::app()->baseUrl . '/js/DynamicChangeTable.js', CClientScript::POS_END);



Debes crear un folder, puede ser donde tienes la aplicación, en el ejemplo anterior el folder se llama js, es aqui donde almaceno el Script, ya solo te queda que configurar el evento, para que se active cuando ocurra determinanda acción.

Saludos

Hola espero estés bien. una explicación más detallada esta aquí guide-output-client-scripts pero es más recomendado utilizar asset Asset Bundles assets puede costar un poco al inicio pero luego es muy fácil, :) también te aconsejo que leas validating-input

por lo menos lo que pretendes hacer quedaría más elegante y eficiente utilizando los Validators que yii2 proporciona o creando el tuyo propio [url=&quot;http://www.yiiframework.com/doc-2.0/guide-input-validation.html#creating-validators&quot;]creating-validators

[/url]

espero te ayude ;)

Perdón por la tardanza, pero ¿Cómo se hace eso de configurar el evento?, soy muy nuevo en esto de yii y php, si pudieras darme un ejemplo me ayudaría bastante.

Intenté algo así y no me resultó


<?php echo $form->textFieldRow($model,'username', array('onchange'=>'return checkRutField(this.value)')); ?>

Hola RiosEspinosa.

Como tu necesitas validar el Rut, con la función que ya tienes definida podrias hacerlos de la siguiente forma:

Este seria tu Script, el cual se activa cada que cambie el campo rut en tu formulario




 $('#id_campo_rut').change(function() { //debes colocar el id del campo rut de tu formulario.

     var rut = $('#id_campo_rut').val(); //capturas el valor que tenga el campo rut

     function checkRutField(rut)

     {

       var tmpstr = "";

       for ( i=0; i < rut.length ; i++ )

         if ( rut.charAt(i) != ' ' && rut.charAt(i) != '.' && rut.charAt(i) != '-' )

         tmpstr = tmpstr + rut.charAt(i);

         rut = tmpstr;

         largo = rut.length;

         // [VARM+]

         tmpstr = "";

         ...

         //Aqui colocar toda la función que ya tienes...

 });



Y como ya te habia dicho, en la vista donde este el formulario de Login invocas el Script que estara pendiente de cuando cambie el campo rut con el id especificado Ejm:




 <?php Yii::app()->getClientScript()->registerScriptFile(Yii::app()->baseUrl . '/js/verificarRut.js', CClientScript::POS_END); ?>

 <div class="row">

        <?php echo $form->labelEx($model,'rut'); ?>

	<?php echo $form->textField($model,'rut', array('id'=>'id_campo_rut')); ?>

	<?php echo $form->error($model,'rut'); ?>

 </div>



Espero me entiendas, igual sigo pensando que todo esto lo deberias hacer con las validaciones que trae Yii por defecto, todo esto lo podrias controlar con las rules en tu modelo, podrias buscar documentación al respecto.

Saludos.

lo solucioné de esta forma en la vista login




Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.'/js/jquery.Rut.min.js',CClientScript::POS_END);

Yii::app()->clientScript->registerScript('Validar_rut', "

    $('#id_campo_rut').Rut({

  on_error: function(){ alert('Rut incorrecto');}

});

");


$this->pageTitle=Yii::app()->name . ' - Entrar';

$this->breadcrumbs=array(

	'Inicio de Sesión',

);

?>

<h2>Login</h2>


<div class="form">


<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array(

	'id'=>'login-form',

    'type'=>'horizontal',

	'enableClientValidation'=>true,

	'clientOptions'=>array(

		'validateOnSubmit'=>true,

	),

)); ?>


	<p class="note">Campos con <span class="required">*</span> son Obligatorios.</p>


	<?php echo $form->textFieldRow($model,'username',array('id'=>'id_campo_rut')); ?>


	<?php echo $form->passwordFieldRow($model,'password'); ?>


	<?php echo $form->checkBoxRow($model,'rememberMe'); ?>


	<div class="form-actions">

		<?php $this->widget('bootstrap.widgets.TbButton', array(

            'buttonType'=>'submit',

            'type'=>'primary',

            'label'=>'Entrar',

        )); ?>

	</div>


<?php $this->endWidget(); ?>


</div><!-- form -->




y el script que utilicé, es uno distinto al que publiqué anteriormente, se llama jquery.Rut.min.js

coloco el código a continuación,se que no se entiende para nada pero lo publico por si alguien busca validar el rut en yii.


(function($){jQuery.fn.Rut=function(options){var defaults={digito_verificador:null,on_error:function(){},on_success:function(){},validation:true,format:true,format_on:'change'};var opts=$.extend(defaults,options);return this.each(function(){if(defaults.format){jQuery(this).bind(defaults.format_on,function(){jQuery(this).val(jQuery.Rut.formatear(jQuery(this).val(),defaults.digito_verificador==null));});}if(defaults.validation){if(defaults.digito_verificador==null){jQuery(this).bind('blur',function(){var rut=jQuery(this).val();if(jQuery(this).val()!=""&&!jQuery.Rut.validar(rut)){defaults.on_error();}else if(jQuery(this).val()!=""){defaults.on_success();}});}else

{var id=jQuery(this).attr("id");jQuery(defaults.digito_verificador).bind('blur',function(){var rut=jQuery("#"+id).val()+"-"+jQuery(this).val();if(jQuery(this).val()!=""&&!jQuery.Rut.validar(rut)){defaults.on_error();}else if(jQuery(this).val()!=""){defaults.on_success();}});}}});}})(jQuery);jQuery.Rut={formatear:function(Rut,digitoVerificador){var sRut=new String(Rut);var sRutFormateado='';sRut=jQuery.Rut.quitarFormato(sRut);if(digitoVerificador){var sDV=sRut.charAt(sRut.length-1);sRut=sRut.substring(0,sRut.length-1);}while(sRut.length>3){sRutFormateado="."+sRut.substr(sRut.length-3)+sRutFormateado;sRut=sRut.substring(0,sRut.length-3);}sRutFormateado=sRut+sRutFormateado;if(sRutFormateado!=""&&digitoVerificador){sRutFormateado+="-"+sDV;}else if(digitoVerificador){sRutFormateado+=sDV;}return sRutFormateado;},quitarFormato:function(rut){var strRut=new String(rut);while(strRut.indexOf(".")!=-1){strRut=strRut.replace(".","");}while(strRut.indexOf("-")!=-1){strRut=strRut.replace("-","");}return strRut;},digitoValido:function(dv){if(dv!='0'&&dv!='1'&&dv!='2'&&dv!='3'&&dv!='4'&&dv!='5'&&dv!='6'&&dv!='7'&&dv!='8'&&dv!='9'&&dv!='k'&&dv!='K'){return false;}return true;},digitoCorrecto:function(crut){largo=crut.length;if(largo<2){return false;}if(largo>2){rut=crut.substring(0,largo-1);}else

{rut=crut.charAt(0);}dv=crut.charAt(largo-1);jQuery.Rut.digitoValido(dv);if(rut==null||dv==null){return 0;}dvr=jQuery.Rut.getDigito(rut);if(dvr!=dv.toLowerCase()){return false;}return true;},getDigito:function(rut){var dvr='0';suma=0;mul=2;for(i=rut.length-1;i>=0;i--){suma=suma+rut.charAt(i)*mul;if(mul==7){mul=2;}else

{mul++;}}res=suma%11;if(res==1){return'k';}else if(res==0){return'0';}else

{return 11-res;}},validar:function(texto){texto=jQuery.Rut.quitarFormato(texto);largo=texto.length;if(largo<2){return false;}for(i=0;i<largo;i++){if(!jQuery.Rut.digitoValido(texto.charAt(i))){return false;}}var invertido="";for(i=(largo-1),j=0;i>=0;i--,j++){invertido=invertido+texto.charAt(i);}var dtexto="";dtexto=dtexto+invertido.charAt(0);dtexto=dtexto+'-';cnt=0;for(i=1,j=2;i<largo;i++,j++){if(cnt==3){dtexto=dtexto+'.';j++;dtexto=dtexto+invertido.charAt(i);cnt=1;}else

{dtexto=dtexto+invertido.charAt(i);cnt++;}}invertido="";for(i=(dtexto.length-1),j=0;i>=0;i--,j++){invertido=invertido+dtexto.charAt(i);}if(jQuery.Rut.digitoCorrecto(texto)){return true;}return false;}};



Espero que le sirva alguien, saludos.