У меня была такая же проблема.Я создал контактную форму, которая позволяет пользователю загружать аватар и редактировать другую информацию одновременно.Ошибки проверки формы отображаются отдельно для каждого поля.Я не мог позволить себе другую схему отображения для ввода файла и другие - у меня есть стандартный метод, который заботится об отображении ошибок.
Я использовал определенное контроллером свойство и функцию проверки обратного вызова, чтобы объединить любую загрузкуошибка с проверкой формы.
Вот выдержка из моего кода:
# 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;
}
Примечание: поскольку входной файл не будет заполнен заново, если в других полях формы будет ошибка,при успешной загрузке я сохраняю и обновляю ее до того, как произойдет какая-либо другая проверка, поэтому пользователю не нужно повторно выбирать файл.Мое уведомление немного отличается, если это произойдет.