Jump to content

Archived

This topic is now archived and is closed to further replies.

Marcio Vinicius Silva

Validação de dados

Recommended Posts

Pessoal, boa noite!

 

Minha dúvida seria a melhor maneira (ou a mais cabível) para resolver meu problema de validação. Pois bem...

 

Tenho uma classe Acao (Entity\Acao) e um "Storage" (Table\Acao), onde o último faz a lógica com Banco. Minha validação hoje se encontra na Entity da seguinte maneira:

 

 

<?php
namespace Emkt\API\Model\Entity;


use ArrayObject;
use Emkt\API\Model\Filter\Acao as AcaoFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
use Zend\Stdlib\Hydrator\ObjectProperty;


class Acao implements InputFilterAwareInterface
{


    /**
     * Filtro
     * @var \Zend\InputFilter\InputFilterInterface
     */
    private $filter;


    public $emcam_codigo;
    public $emcam_tipo_acao;
    public $emcam_titulo;


    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        $this->filter = $inputFilter;
    }


    public function getInputFilter()
    {
        if (null === $this->filter) {
            $this->filter = new AcaoFilter();
        }
        return $this->filter;
    }


    public function getMessagesError()
    {
        $filter     = $this->getInputFilter();
        $inputError = $filter->getInvalidInput();
        $messages   = array();


        foreach ($inputError as $error) {
            $messages[$error->getName()] = $error->getMessages();
        }


        return $messages;
    }


    public function isValid()
    {
        $filter = $this->getInputFilter();
        $filter->setData($this->getArrayCopy());


        $valid = $filter->isValid();
        if ($valid) {
            $this->getArrayCopy($filter->getValues());
        }


        return $valid;
    }


    public function exchangeArray(array $data)
    {
        $hydrator = new ObjectProperty();
        $hydrator->hydrate($data, $this);
    }


    public function getArrayCopy()
    {
        $toArray = array();
        $toArray['emcam_codigo']    = $this->emcam_codigo;
        $toArray['emcam_tipo_acao'] = $this->emcam_tipo_acao;
        $toArray['emcam_titulo']    = $this->emcam_titulo;


        return $toArray;
    }
}

O problema aqui é quando faço o método UPDATE, porque eu preciso que no POST ele valide todos os campos (tipo e título) da minha Entity Ação e no UPDATE não, ele só deve validar o que for passado.

 

Esse é o trecho de código presente hoje no Storage que faz a validação:

 

 

...

$acaoEntity = new AcaoEntity();
$acaoEntity->exchangeArray($data);
$valid = $acaoEntity->isValid();

if ( ! $valid) {
    $errors = $acaoEntity->getMessagesError();
    return ['erros' => $errors];
}

O método exchangeArray() passa para a Entity os valores de $data, o problema é que mesmo quando esses valores não são passados (No caso do UPDATE) eu preciso que ele valide apenas os dados de $data. Deu pra entender?rs

 

Eu estou pensando em tirar a validação de dentro da Entity e jogar para o Storage, mas não sei se é uma boa opção. O que acham? Alguma ideia diferente?

 

Valeu!

Share this post


Link to post
Share on other sites

  • Similar Content

    • By clovis.sardinha
      Pessoal,
      Estou fazendo um relatório no codeigniter, mas não consigo recuperar o retorno da model para a view.  Dou o foreach para utilizar um conjunto de id's que preciso achar em uma tabela, mas o array só recupera o último.
      Controller:
      $destinoterc=$this->triangulomodel->getDestinoterc($origemuser);         $dados['destinoterc']=$destinoterc;         foreach ($destinoterc as &$i){             $origemterc = $i['id'];             $origemtercfinal=$this->triangulomodel->getOrigemterc($origemterc);                                   }         $dados['origterc']= $origemtercfinal;        Model
      public function getOrigemterc($origemterc){ $query =$this->db->query("SELECT * FROM cadastro join tb_cidades on tb_cidades.cid_id=cadastro.cidade_origem where id =$origemterc"); foreach ($query->result_array() as $row) { } return $query->result_array(); }  
      Resultado , só está pegando o último ponteiro da array de origem. Teria que aparecer uns 30 registros.!
      [origterc] => Array ( [0] => Array ( [id_] => 21302 [cidade] => 3233 [cid_nome] => Januaria )  
    • By fideles
      Fala pessoal, tudo na paz? Como anda a quarentena ? Todos se cuidando....
       
      Seguinte, uma dúvida ou navalhada minha,
       
      Tenho um form simples, básico mesmo onde trampo, só para fazermos levantamento quando alguém chega.
       
      Nome da pessoa
      Um regime de contratação (CLT ou PJ) (input do tipo radio) (Nos value dos input radio tem CLT e PJ)
      Nome da empresa (campo oculto) (aqui funciona na boa)
       
      Preciso fazer com que se a pessoa clicar em PJ fazer ela preencher obrigatoriamente o campo "Nome da empresa" se ela for CLT não faz nada.
       
      Já tentei da seguinte forma e não da certo, talvez esteja errando por bobeira.
       
      if(empty($tipo_contratacao == "PJ")) { echo "<meta http-equiv='refresh' content='0; pesquisa_retorno_2.php'><script>alert('O campo nome da empresa não foi preenchido')</script>" ; return false; }  
      Alguém tem uma luz ?
       
      Obrigado.
    • By szLeonardo
      Olá a todos,
      Estou com um problema no meu cadastro de usuário.
      A parte de cadastrar está sendo realizada corretamente e meu login também, o meu problema está é que tenho que cadastrar em uma tela, depois entrar em outra para validar e acessar.
      Gostaria que quando eu realizasse o cadastro já valida-se e entrasse direto, sem precisar ter que entrar na outra pagina e rodar o login.
       
      Segue meu cadastro que está funcionando:  
      //--Insere Registro   if(isset($_POST['cadastrar'])){     @$usuario      = trim(strip_tags($_POST['usuario']));     @$senha        = trim(strip_tags($_POST['senha']));     @$nivel_acesso = trim(strip_tags($_POST['nivel_acesso']));     $insert = "INSERT INTO cad_usuario (usuario, senha, nivel_acesso)                 VALUES (:usuario, :senha, :nivel_acesso)";   try{     $result = $conexao->prepare($insert);     $result->bindParam(':usuario',      $usuario, PDO::PARAM_STR);     $result->bindParam(':senha',        $senha, PDO::PARAM_STR);     $result->bindParam(':nivel_acesso', $nivel_acesso, PDO::PARAM_STR);     $result->execute();     $contar = $result->rowCount();   if($contar>0){     echo '<div class="alert alert-success">           <button type="button" class="close" data-dismiss="alert">×</button>           <strong>Sucesso!</strong> O Usuario foi Cadastrado!</div>';          $_SESSION['autenticado'] = true;   }else{     echo '<div class="alert alert-danger">           <button type="button" class="close" data-dismiss="alert">×</button>           <strong>Erro ao cadastrar!</strong> Não foi possível cadastrar o Usuario.</div>';   }}catch(PDOException $e){     echo $e;   }}   } }  
      Segue meu validador do usuário cadastrado que está funcionando: 
      <?php session_start(); include_once "connection/conecta.php"; $usuario = new Usuario(); try {   if($usuario->confere($_POST['usuario'],$_POST['senha'])) {     $_SESSION['autenticado'] = true;     $_SESSION['usuario'] = $_POST['usuario'];     header('location: principal.php');   } else {     $_SESSION['autenticado'] = false;     include_once "index.php";     exit("<div class='alert alert-danger col-sm-12'>Usuário ou senha incorretos. Verifique</div>");   } } catch(PDOException $p){   echo "Ocorreu um erro inesperado: ". $p->getMessage(); } ?>  
      Segue minha pagina principal aonde valida a $_SESSION['autenticado'] = false; 
      Mas só valida se passar na pagina index e passar pela validação a cima.
       <?php require_once("connection/conecta.php"); ob_start(); session_start();  if (@!$_SESSION['autenticado']){    include_once "index.php";    exit("<div class='alert alert-danger col-sm-12'>Para acessar o sistema você deve efetuar login</div>");  }     $logado = $_SESSION['usuario'];     $sql = "SELECT * from cad_usuario WHERE usuario = '$logado' and situacao = 'A'";     try{       $result = $conexao->prepare($sql);         $result->execute();       $contar = $result->rowCount();                if($contar =1){         $loop = $result->fetchAll();         foreach ($loop as $show){           $userLogado  = $show['usuario'];           $senhaLogado = $show['senha'];           $nivelLogado = $show['nivel_acesso'];         }       }       }catch (PDOWException $erro){ echo $erro;} ?>  
    • By Rogerio Pancini
      Bom dia pessoal.
       
      Fui ajustando um script para enviar e-mails com Ajax e Php.
      Está funcionando muito bem o envio e uma coleta de informações que faço após o envio.
      Para ficar 99% certo, falta um detalhe no Validate, que uso no formulário de contato.
       
      Parece que ele funciona em conjunto com o script de envio e não após fazer a validação.
       
      Se eu usar " submitHandler " (como no exemplo da documentação)
      $("#myform").validate({ submitHandler: function(form) { // some other code // maybe disabling submit button // then: $(form).submit(); } }); Parece que o formulário dá problema no focus, para de clicar, sei lá.
       
      Vou colocar o que fiz aqui.
      Se alguém tiver alguma sugestão desse detalhe, eu agradeço.
       
      <!-- Formulário de contato --> <form name="form_contato" id="form_contato" method="post" action=""> <div class="row"> <div class="col-md-12"> <div class="form-field"> <input type="text" placeholder="Nome" id="nome" name="nome"> </div> </div> <div class="col-md-12"> <div class="form-field"> <input type="tel" placeholder="Telefone" id="telefone" name="telefone"> </div> </div> <div class="col-md-12"> <div class="form-field"> <input type="email" placeholder="E-mail" id="email" name="email"> </div> </div> <div class="col-md-12"> <div class="form-field"> <input type="text" placeholder="Assunto" id="assunto" name="assunto"> </div> </div> </div> <div class="form-field"> <textarea placeholder="Mensagem" rows="4" id="mensagem" name="mensagem"></textarea> </div> <div class="row"> <div class="col-md-6"> <div class="form-button text-left"> <div class="form-tip"> <div class="g-recaptcha" data-sitekey="<?php echo $chave_de_site_sel; ?>"></div> </div> </div> </div> <div class="col-md-6"> <div class="form-button text-right text-center-mobile"> <button type="submit" class="readon">Enviar</button> <input type="hidden" name="enviar" value="ok" /> </div> </div> </div> <div class="text-center" id="post_email" style="display: none; "> <div class="alert alert-warning mt-30" role='alert'>Aguarde, enviando o e-mail...</div> </div> </form> /****** Validate ******/ $().ready(function() { $("#form_contato").validate({ rules: { nome: "required", email: {required: true, email: true}, telefone: "required", assunto: "required", mensagem: "required", }, messages: { nome: "Informe seu nome", email: {required: "Informe o e-mail", email: "Informe um e-mail válido"}, telefone: "Informe o telefone", assunto: "Informe o assunto", mensagem: "Envie uma mensagem" } }); }); /****** Validate ******/ /****** Ajax ******/ $('#form_contato').on('submit', function (e) { e.preventDefault(); const nome = $('input[name="nome"]').val(); const telefone = $('input[name="telefone"]').val(); const email = $('input[name="email"]').val(); const assunto = $('input[name="assunto"]').val(); const mensagem = $('textarea[name="mensagem"]').val(); const g_recaptcha_response = $('#g-recaptcha-response').val(); $('#post_email').css({ 'display': "block" } ); $.ajax({ type: 'post', url: '<?php echo $dir_base; ?>php/post/contato.php', data: {nome: nome, telefone: telefone, email: email, assunto: assunto, mensagem: mensagem, g_recaptcha_response: g_recaptcha_response}, success: function(response) { var data = $.parseJSON(response); if (data.status == 10) { swal({ title: "Enviado", text: "Agradecemos seu contato!", confirmButtonColor: "#007ca8", type: "success" }); $("#form_contato")[0].reset(); grecaptcha.reset(); $('#post_email').css({ 'display': "none" } ); }else if (data.status == 20) { swal({ title: "Oopss...", text: "Ocorreu um problema ao concluir o envio do e-mail", confirmButtonColor: "#e74c3c", type: "error" }); grecaptcha.reset(); $('#post_email').css({ 'display': "none" } ); }else if (data.status == 30) { swal({ title: "Oopss...", text: "O reCAPTCHA não foi habilitado", confirmButtonColor: "#e74c3c", type: "error" }); grecaptcha.reset(); $('#post_email').css({ 'display': "none" } ); }else if (data.status == 40) { swal({ title: "Oopss...", text: "Ocorreu um problema ao acessar o banco de dados", confirmButtonColor: "#e74c3c", type: "error" }); grecaptcha.reset(); $('#post_email').css({ 'display': "none" } ); }else { swal({ title: "Oopss...", text: "Ocorreu um erro ao enviar a mensagem", confirmButtonColor: "#e74c3c", type: "error" }); grecaptcha.reset(); $('#post_email').css({ 'display': "none" } ); } } }); }); /****** Ajax ******/ O post do PHP é meio grande, se for necessário eu coloco ele também.
       
      Muito obrigado
    • By juniormatrix
      Bom dia!
       
      Tenho este código:
       
      $("#formulario").validate({ ignore: [], rules: { nome:{required: true}, contato:{required: true}, telefone:{required: true}, cidade:{required: true}, email:{required: true, email: true}, mensagem:{required: true}, }, });  
      Funciona perfeitamente.
       
      Mas pretendo adicionar um campo oculto no meu formulário nomeado "url" e preciso que o código acima faça a seguinte lógica:
       
      Se o campo "url" estiver preenchido, não faz nada, ou seja, não envia a mensagem; Se estiver vazio, executa o script e envia a mensagem.
       
      Minha intenção é evitar o envio de Spam. Se alguém pude me ajudar, fico grato. E se eu estiver fazendo da forma errada, por favor me avisem.
       
      PS.: vou ser sincero, gostaria do código pronto. Sei que tem bastante conteúdo na internet, mas não tenho interesse em aprender a fazer, pois meu trabalho principal é mais na parte de design. Estou tendo que fazer o serviço de outra pessoa.
       
      Agradeço desde já!
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.