Salvar dados do formulario sem obrigacao de atualizar a imagem

28/04/2016

Tenho um formulario de cadastro e este formulario tem uma imagem de perfil do usuario cadastrado.
O insert e update da imagem estao funcionando perfeitamente.
O problema esta em quando atualizo qualquer dado que não seja a imagem, o sistema nao salva, retornando erro de upload de imagem.
O formulario nao esta aceitando o input file vazio e quer atualizar a imagem de qualquer forma.
O que eu quero: Editar e Salvar CPF ou NOME. Manter IMAGEM que ja esta cadastrado sem obrigacao de altera-la

Parte do código HTML - PHP - CSS - JAVASCRIPT
<div class="collapse in accordion-body" id="collapseGOne"><!--Dados Pessoais-->
<div class="widget-content ">
<table>
         <tbody>
         <tr>
         <td style="width: 14%">
                 <?php if (!empty($result->url_foto)) { ?>
                         <img id="avatar" src="<?php echo $result->url_foto; ?>" >
                 <?php }
                 else
                 {
                         return;
                 }
                 ?>
                 </div>
         </td>
<td>
<div class="span12" style="padding: 1%">
         <div class="span4">
         <?php echo form_hidden('idColaboradores',$result->idColaboradores) ?>
                 <label for="nome">Nome<span class="required">*</span></label>
                 <input id="nome" class="span12" type="text" name="nome" value="<?php echo $result->nome; ?>" />
         </div>
         <div class="span2">
                 <label for="sexo">Sexo<span class="required">*</span></label>
                 <select name="sexo" id="sexo" class="span12" value="">
                         <option <?php if($result->sexo == 'Masculino'){echo 'selected';} ?> value="Masculino">Masculino</option>
                                 <option <?php if($result->sexo == 'Feminino'){echo 'selected';} ?> value="Feminino">Feminino</option>
                 </select>
         </div>
</div>
<div class="span12" style="padding: 1%; margin-left: 0">
         <div class="span2">
                 <label for="cpf">CPF<span class="required">*</span></label>
                 <input id="cpf" class="span12 cpf" type="text" name="cpf" placeholder="000.000.000-00" value="<?php echo $result->cpf; ?>" />
         </div>
         <div class="span2">
                 <label for="rg">RG<span class="required">*</span></label>
                 <input id="rg" class="span12" type="text" name="rg" value="<?php echo $result->rg; ?>" />
         </div>
         <div class="span2">
                 <label for="data_nascimento">Data Nascimento<span class="required">*</span></label>
                         <input id="data_nascimento" class="span12" type="date" name="data_nascimento" value="<?php echo $result->data_nascimento; ?>" />
         </div>
</div>
</td>
                 </tr>
         </tbody>
</table>
</div>
<div class=""><!--input Foto-->
<label for="" class="control-label"><span class="required">Foto*</span></label>
<div class="controls">
         <input type="file" onchange="preview(this)" name="userfile" /> (.png, .jpg, .jpeg)
</div>
</div><!--input Foto-->

</div><!--Dados Pessoais-->


CSS
#avatar {
width: 180px;
height: 180px;
background-position: center center;
background-size: cover;
border-radius: 0;
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
-webkit-box-shadow: 0 0 1px 1px rgba(0, 0, 0, .3);
display: inline-block;
}


SCRIPT
function preview(fileInput) {
var files = fileInput.files;
for (var i = 0; i < files.length; i++) {                
         var file = files[i];
         var imageType = /image.*/;     
         if (!file.type.match(imageType)) {
                 continue;
         }              
         var img=document.getElementById("avatar");             
         img.file = file;
         var reader = new FileReader();
         reader.onload = (function(aImg) {
                 return function(e) {
                         aImg.src = e.target.result;
                 };
         })(img);
         reader.readAsDataURL(file);
}
}


FUNÇÃO EDITAR NO CONTROLLER(CODEIGNITER)
function editar() {
         if(!$this->permission->checkPermission($this->session->userdata('permissao'),'eColaborador')){
                 $this->session->set_flashdata('error','Você não tem permissão para editar colaboradores.');
                 redirect(base_url());
         }
         $this->load->library('form_validation');
         $this->data['custom_error'] = '';
         if ($this->form_validation->run('colaboradores') == false) {
                 $this->data['custom_error'] = (validation_errors() ? '<div class="form_error">' . validation_errors() . '</div>' : false);
         } else {
                 $data_admissao = $this->input->post('data_admissao');
$data_demissao = $this->input->post('data_demissao');

$foto = $this->do_upload();
                 $file = $foto['file_name'];
                 $url_foto = base_url().'assets/fotos/'.date('d-m-Y').'/'.$file;
                 try {
                 }catch (Exception $e) {
                         $data_admissao = date('Y/m/d');
         $data_demissao = date('Y/m/d');
         $data_inicio_aviso = date('Y/m/d');
         $data_fim_aviso = date('Y/m/d');
         $data_inicio_ferias = date('Y/m/d');
         $data_fim_ferias = date('Y/m/d');
         $data_abandono1 = date('Y/m/d');
         $data_abandono15 = date('Y/m/d');
         $data_abandono28 = date('Y/m/d');
         $data_inicio_previdencia = date('Y/m/d');
         $data_fim_previdencia = date('Y/m/d');
         $data_inicio_justica_a = date('Y/m/d');
         $data_fim_justica_a = date('Y/m/d');
         $data_inicio_justica_i = date('Y/m/d');
         $data_fim_justica_i = date('Y/m/d');
         $data_inicio_licasamento = date('Y/m/d');
         $data_fim_licasamento = date('Y/m/d');
         $data_inicio_suspensao = date('Y/m/d');
         $data_fim_suspensao = date('Y/m/d');
                 }

                 $data = array(
                         'nome' => $this->input->post('nome'),
                         'sexo' => $this->input->post('sexo'),
'cpf' => $this->input->post('cpf'),
'rg' => $this->input->post('rg'),
'url_foto' => $url_foto,
'data_nascimento' => $this->input->post('data_nascimento'),
                         'rua' => $this->input->post('rua'),
                         'numero' => $this->input->post('numero'),
'complemento' => $this->input->post('complemento'),
                         'bairro' => $this->input->post('bairro'),
                         'cep' => $this->input->post('cep'),
                         'estado' => $this->input->post('estado'),
                         'cidade' => $this->input->post('cidade'),
'telefone' => $this->input->post('telefone'),
                         'celular' => $this->input->post('celular'),
                         'email' => $this->input->post('email'),
'ctps'=> $this->input->post('ctps'),
'serie' => $this->input->post('serie'),
'uf' => $this->input->post('uf'),
'pis' => $this->input->post('pis'),
'salario' => $this->input->post('salario'),
'banco' => $this->input->post('banco'),
'agencia' => $this->input->post('agencia'),
'conta' => $this->input->post('conta'),
'jornada_trabalho'=> $this->input->post('jornada_trabalho'),
'horario_trabalho' => $this->input->post('horario_trabalho'),
'data_admissao' => $this->input->post('data_admissao'),
'departamento' => $this->input->post('departamento'),
'cargo' => $this->input->post('cargo'),
'situacao' => $this->input->post('situacao'),
'data_demissao' => $this->input->post('data_demissao'),
'tipo_demissao' => $this->input->post('tipo_demissao'),
'motivo_demissao' => $this->input->post('motivo_demissao'),
'data_inicio_aviso' => $this->input->post('data_inicio_aviso'),
'data_fim_aviso' => $this->input->post('data_fim_aviso'),
'data_inicio_ferias' => $this->input->post('data_inicio_ferias'),
'data_fim_ferias' => $this->input->post('data_fim_ferias'),
'data_abandono1' => $this->input->post('data_abandono1'),
'data_abandono15' => $this->input->post('data_abandono15'),
'data_abandono28' => $this->input->post('data_abandono28'),
'data_inicio_previdencia' => $this->input->post('data_inicio_previdencia'),
'data_fim_previdencia' => $this->input->post('data_fim_previdencia'),
'data_inicio_justica_a' => $this->input->post('data_inicio_justica_a'),
'data_fim_justica_a' => $this->input->post('data_fim_justica_a'),
'data_inicio_justica_i' => $this->input->post('data_inicio_justica_i'),
'data_inicio_licasamento' => $this->input->post('data_inicio_licasamento'),
'data_fim_licasamento' => $this->input->post('data_fim_licasamento'),
'data_inicio_limaternidade' => $this->input->post('data_inicio_limaternidade'),
'data_fim_limaternidade' => $this->input->post('data_fim_limaternidade'),
'data_inicio_suspensao' => $this->input->post('data_inicio_suspensao'),
'data_fim_suspensao' => $this->input->post('data_fim_suspensao'),
'observacao' => $this->input->post('observacao'),
'usuario_alteracao' => $this->input->post('usuario_alteracao'),
'data_alteracao' => date('Y-m-d')
                 );
                 if ($this->colaboradores_model->edit('colaboradores', $data, 'idColaboradores', $this->input->post('idColaboradores')) == TRUE) {
                         $this->session->set_flashdata('success','Colaborador editado com sucesso!');
                         redirect(base_url() . 'index.php/colaboradores/editar/'.$this->input->post('idColaboradores'));
                 } else {
                         $this->data['custom_error'] = '<div class="form_error"><p>An Error Occured</p></div>';
                 }
         }

$this->load->model('departamentos_model');
         $this->data['departamentos'] = $this->departamentos_model->getActive('departamentos','departamentos.idDepartamentos,departamentos.departamento');
$this->load->model('cargos_model');
         $this->data['cargos'] = $this->departamentos_model->getActive('cargos','cargos.idCargos,cargos.cargo');

$this->data['result'] = $this->colaboradores_model->getById($this->uri->segment(3));
         $this->data['view'] = 'colaboradores/editarColaborador';
         $this->load->view('tema/topo', $this->data);
        
}


FUNÇÃO UPLOAD NO CONTROLLER(CODEIGNITER)
public function do_upload(){
         if(!$this->permission->checkPermission($this->session->userdata('permissao'),'vColaborador')){
                 $this->session->set_flashdata('error','Você não tem permissão para adicionar colaboradores.');
                 redirect(base_url());
         }

         $date = date('d-m-Y');
$config['upload_path'] = './assets/fotos/'.$date;
         $config['allowed_types'] = 'txt|jpg|jpeg|gif|png|pdf|PDF|JPG|JPEG|GIF|PNG';
         $config['max_size']     = 0;
         $config['max_width'] = '3000';
         $config['max_height'] = '2000';
         $config['encrypt_name'] = true;

if (!is_dir('./assets/fotos/'.$date)) {
mkdir('./assets/fotos/' . $date, 0777, TRUE);
}
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->session->set_flashdata('error','Erro ao fazer upload do arquivo, verifique se a extensão do arquivo é permitida.');
                 redirect(base_url() . 'index.php/colaboradores/adicionar/');
}
else
{
//$data = array('upload_data' => $this->upload->data());
return $this->upload->data();
}
}

Wagner Fillio

Melhor resposta

28/04/2016

Tente algo assim no controller:

if (!empty($_FILES['avatar']['tmp_name'])):
    $foto = $this->do_upload();
    $file = $foto['file_name'];
    $url_foto = base_url().'assets/fotos/'.date('d-m-Y').'/'.$file;
    $data['url_foto'] = $url_foto;
endif;

William (devwilliam)

Responder Citar

Outras Respostas

28/04/2016

Wagner Fillio

William,
Obrigado pela resposta.

Este código eu incluiria ele na função editar ou preciso criar uma nova função?

Em qual parte do código devo incluí-lo?

Perguntou, pois já tentei uma nova função #editarFoto e não deu.
Tambem tentei incluir um if $url_foto != null, passa o valor do input file para o array, else Não passa o valor para o array; mas tambem não deu.
Responder Citar

28/04/2016

William (devwilliam)

Antes do bloco try..catch .. na função editar().
Responder Citar

28/04/2016

Wagner Fillio

Não funcionou,

Tentei da seguinte forma...

  function editar() {

        if(!$this->permission->checkPermission($this->session->userdata('permissao'),'eColaborador')){
           $this->session->set_flashdata('error','Você não tem permissão para editar colaboradores.');
           redirect(base_url());
        }
        $this->load->library('form_validation');
        $this->data['custom_error'] = '';

        if ($this->form_validation->run('colaboradores') == false) {
            $this->data['custom_error'] = (validation_errors() ? '<div class="form_error">' . validation_errors() . '</div>' : false);
        } else {
            $data_admissao = $this->input->post('data_admissao');
			$data_demissao = $this->input->post('data_demissao');
			
	
			if (!empty($_FILES['avatar']['tmp_name'])):
			$foto = $this->do_upload();
			$file = $foto['file_name'];
			$url_foto = base_url().'assets/fotos/'.date('d-m-Y').'/'.$file;
			$data['url_foto'] = $url_foto;
			endif;

            try {

            }catch (Exception $e) {
               $data_admissao = date('Y/m/d');
			   $data_demissao = date('Y/m/d');
			   $data_inicio_aviso = date('Y/m/d');
			   $data_fim_aviso = date('Y/m/d');
			   $data_inicio_ferias = date('Y/m/d');
			   $data_fim_ferias = date('Y/m/d');
			   $data_abandono1 = date('Y/m/d');
			   $data_abandono15 = date('Y/m/d');
			   $data_abandono28 = date('Y/m/d');
			   $data_inicio_previdencia = date('Y/m/d');
			   $data_fim_previdencia = date('Y/m/d');
			   $data_inicio_justica_a = date('Y/m/d');
			   $data_fim_justica_a = date('Y/m/d');
			   $data_inicio_justica_i = date('Y/m/d');
			   $data_fim_justica_i = date('Y/m/d');
			   $data_inicio_licasamento = date('Y/m/d');
			   $data_fim_licasamento = date('Y/m/d');
			   $data_inicio_suspensao = date('Y/m/d');
			   $data_fim_suspensao = date('Y/m/d');
            }
		
            $data = array(...


Devo fazer alguma outra alteração no código view?
Responder Citar

28/04/2016

William (devwilliam)

Wagner não sei se você observou, mas o "name" tem que ser o mesmo do input file do seu form "$_FILES['userfile']"!

Tente assim:
if(isset($_FILES['userfile']) && $_FILES['userfile']['size'] > 0):
   $foto = $this->do_upload();
   $file = $foto['file_name'];
   $url_foto = base_url().'assets/fotos/'.date('d-m-Y').'/'.$file;
   $data['url_foto'] = $url_foto;
endif;
Responder Citar

28/04/2016

Wagner Fillio

Willian,

Está passando como NULL e salvando NULL no BD.

Este é o mesmo problema que enfrentei ao usar outros códigos.
Responder Citar

28/04/2016

Wagner Fillio

Tem razão, ajustei aqui.

Agora salva os dados que eu editar sem atualizar a imagem e não retorna erro.

Mas se eu quiser editar somente imagem e trocar por outra, a nova imagem não é gravada no banco.
Responder Citar

28/04/2016

William (devwilliam)

Com certeza não está entrando na condição IF.
Responder Citar

28/04/2016

Wagner Fillio

Willian,

Me desculpe, a imagem está passando sim para o banco.

O que acontecendo, é que a nova imagem não está sendo exibida no formulário, ficando visível a imagem anterior a alteração.
Responder Citar

28/04/2016

Wagner Fillio

Melhor, não está gravando..

Uma nova imagem está sendo criada na pasta assets/fotos/28-04-2016/"Nova Imagem Criada".

Mas a url não está sendo gravada no banco.
Responder Citar

28/04/2016

William (devwilliam)

O ideal é renomear a imagem e excluir a antiga, geralmente os navegadores fazem cache da imagem.
Responder Citar

28/04/2016

Wagner Fillio

Na verdade, a função Upload envia para o servidor a nova imagem com outro nome.
Exemplo:
Nome da imagem antes do submit: "Qualquer Nome.jpg"

Nome da mesma imagem que é gravada no servidor: "3cef2263d0aef25ce282da770e5e6f58.jpg"

Lembrando que o nome é alterado a cada envio de imagem e nunca se repetirá, mesmo se for a mesma imagem carregada.

Observação: Eu fiz uma comparação da url gravada no banco de dados, antes e depois da alteração e o resultado não mudou.

O que o script fez, foi enviar uma nova imagem para o servidor, sem que seu caminho fosse gravado no bd.
Responder Citar

29/04/2016

Wagner Fillio

Willian,

Bom dia!

Desculpe ser chato, tentei outras opções e não deu certo, o código que você criou foi o que chegou mais perto, pois a imagem é transferida para o servidor, com um novo nome e tudo mais.

O único problema, é que o path não está sendo gravado no banco de dados.

Baseado no seu código, existiria alguma opção e alteração a ser aplicada?

Obrigado

Att,
Responder Citar

29/04/2016

William (devwilliam)

Cara eu nunca gravo o path das imagens no banco, somente o nome das imagens, pq se muda a estrutura por algum motivo tem que sair "pinçando" caminhos.
Responder Citar

29/04/2016

Wagner Fillio

É,

Tem razão, mas não está gravando nem o nome das imagens.

E para isso eu teria que alterar uma série de código.

Acontece que tô meio agarrado com umas coisas e meio sem tempo, por hora, o caminho resolveria e caso o seu código funcione, basearia nele um novo insert somente com o nome da imagem.
Responder Citar

29/04/2016

William (devwilliam)

Blz quando tiver disponibilidade novamente vai postando, vou deixar o tópico aberto!
Responder Citar