Ver Mensaje Individual
  #3 (permalink)  
Antiguo 16/07/2011, 20:22
Avatar de Italico76
Italico76
 
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: [APORTE] form_helper mejorado con JS

Tienes toda la razon!

VERSION con menos errores

Código PHP:
<?php    
/*  
    Helper para formularios JFORM (incluyen llamadas JS)
     
    JS desarrollado por JOTFORM     
    JS alojado en http://www.2shared.com/document/sPHAvxc1/form.html
*/

   /* agrega campo oculto si no se dice que no */
   
function form_close($extra '',$hidden_sent=true) { 
    
      if (
$hidden_sent){
        
$hidden_sentform_hidden('sent''sent');
      }else{
        
$hidden_sent='';
      }    
      return 
$hidden_sent.'</form>'.$extra;
    }

    function 
jform_open($url,$title=null,$js=true) { 
      if (
$js){
        
$js_open '<script src="'.PATH_JS.'form.js" type="text/javascript"></script>';
      }else{ 
        
$js_open='';
      }
      
$style   '<style>input { width:320px;}
        input.boton {width:75px;height:25px;}
       </style>'
;      
      if (
$title!=null){
         
$heading $title;
      }     
      return 
$style.$js_open.$heading.form_open($url,'name="q_form_72680528871"');
    }  
      
    function 
jform_close($html='',$hidden_sent=true) { 
    
      if (
$hidden_sent){
        
$hidden_sentform_hidden('sent''sent');
      }else{
        
$hidden_sent='';
      }    
    
      return 
$hidden_sent.'</form>'.$html.'<script type="text/javascript">validate("q_form_72680528871");</script>';      
    }

    function 
form_send_button($title='Enviar'){
      return 
"<input type=\"submit\" class=\"boton\" value=\"$title\" />";
    }      
    
    
/*
      required = Email | Required        
    */
    
function jform_input($name,$label='',$type='text',$value='',$required='Required'){ 
    
    
$onblur '';    
    
    if (
$label!=''){
      if (
$required!=false){
        
$span   '<span class="required">*</span>';
        
$onblur "onblur=\"validate(this,'$required')\"";
      }else{
        
$span '';        
      }
      
$label"<label>$label $span</label><br/>";
    }  

    
// No remover los <p></p> o el JS deja de funcionar!
    
return "<p>$label
<input type=\"$type\" size=\"50\" name=\"$name\" $onblur value=\"$value\" /></p>"
;    
    }    
    
    
/* devuelve TRUE si el form fue enviado */
    
function form_sent(){
      
$CI = &get_instance();
      return 
$CI->input->post('sent')=='sent';
    }  

    
//uso: input_value('fullname',$userdata);
    
function value ($field,$userdata){
      
$CI = &get_instance();
      return (
form_sent() ? $CI->input->post($field) : $userdata->{$field});
    }

    
/*
          Form data extractor and cleanner -> usar en controllers     
      devuelve array limpio para insersion / actualizacion en DB 
    */
    
function form_data(){
      
$CI = &get_instance();
      
$userdata $CI->input->post();          
      unset (
$userdata['submit']);
      unset (
$userdata['sent']); /* campo oculto */      
      
return $userdata;
    }

Y ejemplo de uso (tambien actualizado!)

Código PHP:
<?= jform_open('cpanel/account/validate','<h3><span>Cuenta</span> usuario</h3>'); ?>

<?= jform_input('fullname','Su nombre:','text',form_sent() ? $this->input->post('fullname') : $userdata[0]->fullname,'Required'); ?>    

<?= jform_input('email','E-mail:','text',form_sent() ? $this->input->post('email') : $userdata[0]->email,'Email'); ?>  

<?= jform_input('paypal_email','Paypal:','text',form_sent() ? $this->input->post('paypal_email') : $userdata[0]->paypal_email,'Email'); ?> 
        
<?= jform_input('country','Pais:','text',form_sent() ? $this->input->post('country') : $userdata[0]->country); ?>    
    
<p class="clear"></p>

<?= br().form_send_button ('Actualizar'); ?>   

<?= jform_close(); ?>
Y...como yapa... utilizando la funcion value() se puede simplificar mucho mas el codigo que se deberia colocar en <input name="..." value="" .. ya que ya no es necesario andar con condicionales sobre si el dato proviene de la base de datos o de... el form recien enviado donde $userdata es un arreglo de objetos que proviene de la consulta al modelo y logicamente $userdata[0] es el objeto que contiene la informacion del registro tal como viene de la DB

Código PHP:
<?= jform_input('fullname','Su nombre:','text'value('fullname',$userdata[0]),'Required'); ?>
Ademas... form_data() limpia el array de $_POST devuelto al enviarse el formulario dejandolo limpio para hacer inserciones, actualizaciones en la DB:

Código PHP:
$userdata form_data();
$this->user_m->user_update($userdata); 
Cabe aclarar que form_close() fue extendida de igual forma que jform_close() para agregar el campo oculto de verificacion de formulario enviado con form_sent()

Gracias amigos...por sus correcciones!
__________________
Salu2!

Última edición por Italico76; 17/07/2011 a las 07:49