que tenían el mismo problema. Creé un formulario de contacto que permite al usuario subir un avatar y editar otra información al mismo tiempo. Los errores de validación de formulario se muestran por separado para cada campo. No podía pagar un esquema de visualización diferente para la entrada del archivo y los demás: tengo un método estándar que se encarga de mostrar los errores.
Utilicé una propiedad definida por el controlador y una función de validación de devolución de llamada para combinar cualquier error de carga con los de validación de formulario.
Aquí es un extracto de mi código:
# controller property
private $custom_errors = array();
# form action controller method
public function contact_save()
{
# file upload for contact avatar
$this->load->library('upload', array(
'allowed_types'=>'gif|jpg|jpeg|png',
'max_size'=>'512'
));
if(isset($_FILES['avatar']['size']) && $_FILES['avatar']['size']>0)
{
if($this->upload->do_upload('avatar'))
{
# avatar saving code here
# ...
}
else
{
# store any upload error for later retrieval
$this->custom_errors['avatar'] = $this->upload->display_errors('', '');
}
}
$this->form_validation->set_rules(array(
array(
'field' => 'avatar',
'label' => 'avatar',
'rules' => 'callback_check_avatar_error'
)
# other validations rules here
);
# usual form validation here
if ($this->form_validation->run() == FALSE)
{
# display form with errors
}
else
{
# update and confirm
}
}
# the callback method that does the 'merge'
public function check_avatar_error($str)
{
#unused $str
if(isset($this->custom_errors['avatar']))
{
$this->form_validation->set_message('check_avatar_error', $this->custom_errors['avatar']);
return FALSE;
}
return TRUE;
}
Nota: como el archivo de entrada no va a repoblar si hay algún error en los otros campos de formulario, en caso de éxito de subida, almaceno y actualizarlo antes de cualquier se realiza otra validación, por lo que el usuario no necesita volver a seleccionar el archivo. Mi notificación es un poco diferente si esto sucede.
Normalmente hago esto validando primero el formulario y, si todo está bien, comienzo a verificar la validez de la carga del archivo. – janosrusiczki