Utilização de requisições AJAX Olá, tenho o seguinte cenário: Cadastro de motorista, cliente, proprietário e etc.. Todas essas classes estendem da classe pessoa. Dessa forma criei uma trait para ser utilizada na view desses cadastros, dessa forma quando adicionar um novo campo ou remover um campo em comum faço isso somente em um arquivo segue parte do código: ...
BB
Utilização de requisições AJAX  
Olá,

tenho o seguinte cenário: Cadastro de motorista, cliente, proprietário e etc.. Todas essas classes estendem da classe pessoa. Dessa forma criei uma trait para ser utilizada na view desses cadastros, dessa forma quando adicionar um novo campo ou remover um campo em comum faço isso somente em um arquivo segue parte do código:

<?phptrait PessoaCadastroTrait{    public function insereCamposPessoa($contribui_icms = FALSE, $form)    {        TPage::include_js('app/view/traits/requisicoes.js');                $idpes         = new TEntry('pes_codigo');         $pes_tipo      = new TRadioGroup('pes_tipo');        $nome          = new TEntry('pes_nomerazaosocial');        $cpf_cnpj      = new TEntry('pes_cpfcnpj');        $cidade        = new TDBUniqueSearch('cdd_codigo', 'conecta', 'Cidade', 'cdd_codigo', 'cdd_nome', 'cdd_nome');        $cdd_novo      = new TButton('bt_novoCidade');        $telefone      = new TEntry('pes_telefone');        $endereco      = new TEntry('pes_endereco');        $numero        = new TEntry('pes_nroender');        $complemento   = new TEntry('pes_complementoender');        $bairro        = new TEntry('pes_bairro');        $cep           = new TEntry('pes_cep');        $rg_ie         = new TEntry('pes_rgie');        $emi_rg        = new TDate('pes_dtemirg');        $email         = new TEntry('pes_email');        $nome_fantasia = new TEntry('pes_nomefantasia');        $nasc          = new TDate('pes_datanascimento');                $cpf_cnpj->setProperty("onBlur", "buscarCPFAjax()");       .       .       .       .        parent::addFields( [$labelDB] );        parent::addFields([new TLabel('ID')], [$idpes]);        parent::addFields([new TLabel('Tipo')], [$pes_tipo]);        if($contribui_icms)        {            parent::addFields([new TLabel('Contribuinte ICMS')], [$contrIcms]);        }        parent::addFields([new TLabel('CPF/CNPJ')], [$cpf_cnpj]);        parent::addFields([new TLabel('Nome/Razão Social')], [$nome],                          [$labelFantasia], [$nome_fantasia]);        parent::addFields([new TLabel('CEP')], [$cep]);        parent::addFields([new TLabel('Endereço')], [$endereco, new TLabel('Nro'), $numero, new TLabel('Complemento'), $complemento]);        parent::addFields([new TLabel('Bairro')], [$bairro],                          [new TLabel('Cidade')], [$cidade, $cdd_novo]);        parent::addFields([new TLabel('Telefone')], [$telefone],                          [$labelNasc], [$nasc]);        parent::addFields([new TLabel('RG/IE')], [$rg_ie],                          [$labelEmiRg], [$emi_rg]);        parent::addFields([new TLabel('E-mail')], [$email]);            }?>


Essa trait eu utilizo dessa forma no cadastro de motorista:
<?phpclass MotoristaCadastroView extends BootstrapFormBuilder{    use PessoaCadastroTrait;            public function __construct()    {        parent::__construct();                $this->insereCamposPessoa(FALSE, 'form_mtr'); //método da trait que insere os campos comuns das pessoas                .        .        .    }?>


Está tudo funcionando perfeitamente. Porém existe a necessidade de quando sair do input de CPF/CNPJ da pessoa buscar na base de dados se já existe este CPF/CNPJ.
Tentei utilizar : $cpf->setExitAction(new TAction($this, 'procura_cpf_cnpj')); Mas dá o seguinte erro: permissão negada.
Então pensei em utilizar ajax. Dessa forma, criei um arquivo js que inclui na trait , onde esse arquivo tem o método buscarCPFAjax() que é chamado no evento onBlur do input de CPF/CNPJ.
Porém está me retornando o seguinte erro no console do depurador do browser.:
500 (Internal Server Error)

Segue os arquivos para o ajax:
requisicoes.js
<?phpfunction buscarCPFAjax(){    var cpf = $("input[name=pes_cpfcnpj]").val();    $.ajax({            url: 'app/view/traits/ajax.php',            type: 'post',            dataType: "json",            data: {'acao': 'buscaCPF', 'cpf': cpf},            success: function (data) {                alert(data);            },            error: function (xhr, desc, err) {                console.log(xhr);                console.log("Details: " + desc + "\nError:" + err);            }        });}?>


ajax.php
<?phpinclude_once("app/lib/util/Functions.php");$acao = $_POST['acao'];switch ($acao) {    case "buscaCPF":        $cpf = preg_replace("/[^0-9]/", "", $_POST['cpf']);        $pessoas = Functions::formataCPFCNPJ($cpf, 'J');        echo json_encode($cpf);        break;}?>


Functions.php
<?phpuse Adianti\Widget\Base\TElement;use Adianti\Database\TTransaction;use Adianti\Database\TCriteria;use Adianti\Database\TFilter;use Adianti\Database\TRepository;use Adianti\Validator\TCNPJValidator;use Adianti\Validator\TCPFValidator;class Functions{public static function procuraCPFCNPJ($cpf_cnpj)    {        try         {             TTransaction::open('conecta');             $criteria = new TCriteria;             $criteria->add(new TFilter('pes_cpfcnpj', '=', $cpf_cnpj));                         $repository = new TRepository('Pessoa');             $pessoas = $repository->load($criteria);                         TTransaction::close();                         return $pessoas;        }         catch (Exception $e)         {             new TMessage('error', $e->getMessage());         }    }    }?>


Alguém sabe uma maneira mais fácil ou uma forma de conseguir utilizar o AJAX?

Obrigada

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (6)


BB

Mais um detalhe talvez importante: O problema está em utilizar a classe Functions, pois quando o arquivo ajax.php retorna um array qualquer, o javascript recebe com sucesso...
Já tentei fazer a pesquisa no Banco de Dados no arquivo ajax.php, mas tmb dá erro..
BB

Tentei utilizar uma classe estendendo de BootstrapFormBuilder para pessoa, e então o formulário de motorista estendendo do formulário de pessoa. Porém também da o erro de permissão negada no ExitAction. Acredito que teria que ser no control esta função para buscar o CPF... Mas do jeito que está eu teria que adicionar essa função em todos os control dos cadastro, mas está não é a ideia :/
NR

A TAction deve receber um array:
<?php//$cpf->setExitAction(new TAction($this, 'procura_cpf_cnpj')); $cpf->setExitAction(new TAction([$this, 'procura_cpf_cnpj'])); ?>
BB

Sim, exatamente Nataniel. Desculpa, errei no momento de copiar para o post.
Se faço isso ele exibe um erro: Permissão negada. Acredito que seja pelo fato do $this apontar para uma view e não uma controller...
NR

Sim, como a view não está cadastrada como um programa ou não foram dadas as permissões necessárias, seu acesso é bloqueado. A solução mais simples(e não a mais bonita/ideal) seria fazer esse cadastro e conceder as devidas permissões. Mas também é possível usar outros recursos da OO pra vincular a ação ao control no lugar da view(herdar control com a função, passar control como parâmetro pra view, etc...)
BB

Obrigada Nataniel,
acabei por utilizar uma trait.