Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Traduzir exceções para registros repetidos Boa tarde pessoal, Alguém pode me dar uma dica de como tratar a mensagem para a exceção de quando identificar dados repetidos num cadastro? Por exemplo, eu tenho o campo "Matrícula" no meu formulário de cadastro. No banco de dados mysql eu já defini o campo como Unique. A regra está funcionando perfeitamente, o que eu quero fazer é personalizar a mensagem de erro e deixá-la como as mensa...
FS
Traduzir exceções para registros repetidos  
Fechado
Boa tarde pessoal,
Alguém pode me dar uma dica de como tratar a mensagem para a exceção de quando identificar dados repetidos num cadastro? Por exemplo, eu tenho o campo "Matrícula" no meu formulário de cadastro. No banco de dados mysql eu já defini o campo como Unique. A regra está funcionando perfeitamente, o que eu quero fazer é personalizar a mensagem de erro e deixá-la como as mensagens das demais validações do Adianti. (Estou utilizando o layout ERP II). Então, eu preciso saber em qual exceção eu preciso trabalhar e como adicionar a mensagem correta.

A mensagem atual está apresentando desta maneira:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2222' for key 'matricula'

Gostaria que aparecesse assim:

Registro Duplicado!
ou
Matrícula 'XXXX' já cadastrada!

Obrigado.

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (15)


LC

.
FS

Bom dia Leandro, tudo certo?

Não entendi sua mensagem. Você sabe como devo fazer para alterar a mensagem desta exceção?

Abraço.
FC

Não testei mas acho que é por ai...

catch (Exception $e) // in case of exception
{

if($e->getCode() ==1062){
new TMessage('error', 'Error ' . 'Registro já existe');
}else{
new TMessage('error', 'Error ' . $e->getMessage()); // shows the exception error message
}
TTransaction::rollback(); // undo all pending operations
}
FS

Felipe,
É na função onSave que devo fazer este tratamento?

Obrigado.
FC

existe essa contribuição na epoca não entendi muito bem pois acredito que somente precisamos tratar o erro igual fazia nos tempo de visual basic.

adianti.com.br/forum/pt/view_1103?tuniquevalidator

no onSave da sua classe la no final deve haver esse tratamento de erro é só alterar essa parte do código que postei depois me diga o resultado pois não testei hj é segunda rsrs
FS

Eu testei, mas apresentou a mesma mensagem, a padrão.

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2222' for key 'matricula'

FC

posta seu codigo onSave ae.
FS

Este é o que eu tinha feito, onde está tratando apenas as validações (campos obrigatórios).
  1. <?php
  2. function onSave()
  3.     {
  4.         try
  5.         {
  6.             // open a transaction with database 'una'
  7.             TTransaction::open('una');
  8.             
  9.             // get the form data into an active record Alunos
  10.             $object $this->form->getData('Alunos');
  11.             
  12.             // form validation
  13.             $this->form->validate();
  14.             
  15.             // stores the object
  16.             $object->dt_nascimento TDate::date2us($object->dt_nascimento);
  17.             $object->store();
  18.             
  19.             // set the data back to the form
  20.             //$this->form->setData($object);
  21.             
  22.             // close the transaction
  23.             TTransaction::close();
  24.             
  25.             // shows the success message
  26.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  27.             $this->form->clear();
  28.             // reload the listing
  29.         }
  30.         catch (Exception $e// in case of exception
  31.         {
  32.             // shows the exception error message
  33.             new TMessage('error''<b>Por favor verifique os campos abaixo:</b></br> ' $e->getMessage());
  34.             // undo all pending operations
  35.             TTransaction::rollback();
  36.         }
  37.     }
  38. ?>
FC

  1. <?php
  2. function onSave()
  3.     {
  4.         try
  5.         {
  6.             // open a transaction with database 'una'
  7.             TTransaction::open('una');
  8.             
  9.             // get the form data into an active record Alunos
  10.             $object $this->form->getData('Alunos');
  11.             
  12.             // form validation
  13.             $this->form->validate();
  14.             
  15.             // stores the object
  16.             $object->dt_nascimento TDate::date2us($object->dt_nascimento);
  17.             $object->store();
  18.             
  19.             // set the data back to the form
  20.             //$this->form->setData($object);
  21.             
  22.             // close the transaction
  23.             TTransaction::close();
  24.             
  25.             // shows the success message
  26.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  27.             $this->form->clear();
  28.             // reload the listing
  29.         }
  30.         catch (Exception $e// in case of exception
  31.         {
  32.             if($e->getCode() ==1062){ 
  33.             new TMessage('error''Error ' 'Registro já existe'); 
  34.            }else{ 
  35.            new TMessage('error''Error ' .$e->getCode(). '-' $e->getMessage()); // shows the exception error message 
  36.            
  37.           TTransaction::rollback(); // undo all pending operations 
  38.         }
  39.     }
  40. ?>
FC

Corrige ai onde é if($e->getCode() ==1062) na verdade é if($e->getCode() ==23000) testei aqui funciona direitinho.
FS

Eu tinha testado assim Felipe, mas testei novamente para ter certeza. A mensagem continua a mesma.

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2222' for key 'matricula'

Eu já tentei de várias formas, mas sem sucesso. Vou te passar o código inteiro desta minha classe, talvez vc identifique algo que eu não tenha visto.

Obrigado.

  1. <?php
  2. /**
  3.  * FormAlunos Registration
  4.  * @author  <Fabiano dos Santos>
  5.  */
  6. class FormAlunos extends TPage
  7. {
  8.     private $form;
  9.     private $datagrid;
  10.     private $pageNavigation;
  11.     private $loaded;
  12.     
  13.     /**
  14.      * Class constructor
  15.      * Creates the page and the registration form
  16.      */
  17.     function __construct()
  18.     {
  19.         parent::__construct();
  20.         
  21.         // creates the form
  22.         $this->form = new TForm('form_Alunos');
  23.         
  24.         try
  25.         {
  26.             // TUIBuilder object
  27.             $ui = new TUIBuilder(500,500);
  28.             $ui->setController($this);
  29.             $ui->setForm($this->form);
  30.             
  31.             
  32.             // reads the xml form
  33.             $ui->parseFile('app/forms/Aluno.form.xml');
  34.             
  35.             // get the interface widgets
  36.             $fields $ui->getWidgets();
  37.             // look for the TDataGrid object
  38.             foreach ($fields as $name => $field)
  39.             {
  40.                 if ($field instanceof TDataGrid)
  41.                 {
  42.                     $this->datagrid $field;
  43.                     $this->pageNavigation $this->datagrid->getPageNavigation();
  44.                 }
  45.             }
  46.             
  47.             // add the TUIBuilder panel inside the TForm object
  48.             $this->form->add($ui);
  49.             // set form fields from interface fields
  50.             $this->form->setFields($ui->getFields());
  51.             
  52.             //Validações
  53.             $nome $ui->getWidget('nome'); 
  54.             $nome->addValidation('Nome', new TRequiredValidator);
  55.             $matricula $ui->getWidget('matricula'); 
  56.             $matricula->addValidation('Matricula', new TRequiredValidator);
  57.             $linguas $ui->getWidget('linguas'); 
  58.             $linguas->addValidation('Idioma', new TRequiredValidator);
  59.             $dt_nascimento $ui->getWidget('dt_nascimento'); 
  60.             $dt_nascimento->addValidation('Data de Nascimento', new TRequiredValidator);
  61.             $endereco_res $ui->getWidget('endereco_res'); 
  62.             $endereco_res->addValidation('Endereço Residencial', new TRequiredValidator);
  63.             $celular $ui->getWidget('celular'); 
  64.             $celular->addValidation('Telefone Celular', new TRequiredValidator);
  65.             $bairro $ui->getWidget('bairro'); 
  66.             $bairro->addValidation('Bairro', new TRequiredValidator);   
  67.             $cidade $ui->getWidget('cidade'); 
  68.             $cidade->addValidation('Cidade', new TRequiredValidator);    
  69.             $email $ui->getWidget('email'); 
  70.             $email->addValidation('Email', new TEmailValidator); 
  71.             $rg $ui->getWidget('rg');
  72.             $rg->addValidation('RG', new TNumericValidator); 
  73.             $cpf $ui->getWidget('cpf'); 
  74.             $cpf->addValidation('CPF', new TCPFValidator); 
  75.             $cep $ui->getWidget('cep'); 
  76.             $cep->addValidation('CEP', new TMaxLengthValidator, array(8));
  77.             
  78.             
  79.             // wrap the page content using vertical box
  80.             $vbox = new TVBox;
  81.             $vbox->add(new TXMLBreadCrumb('menu.xml'__CLASS__));
  82.                
  83.             parent::add($vbox);
  84.             
  85.             
  86.         }
  87.         catch (Exception $e)
  88.         {
  89.             new TMessage('error'$e->getMessage());
  90.         }
  91.         
  92.         // add the form to the page
  93.         parent::add($this->form);
  94.     }
  95.     
  96.     /**
  97.      * method onSave()
  98.      * Executed whenever the user clicks at the save button
  99.      */
  100.     function onSave()
  101.     {
  102.         try
  103.         {
  104.             // open a transaction with database 'una'
  105.             TTransaction::open('una');
  106.             
  107.             // get the form data into an active record Alunos
  108.             $object $this->form->getData('Alunos');
  109.             
  110.             // form validation
  111.             $this->form->validate();
  112.             
  113.             // stores the object
  114.             $object->dt_nascimento TDate::date2us($object->dt_nascimento);
  115.             $object->store();
  116.             
  117.             // set the data back to the form
  118.             //$this->form->setData($object);
  119.             
  120.             // close the transaction
  121.             TTransaction::close();
  122.             
  123.             // shows the success message
  124.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  125.             $this->form->clear();
  126.             // reload the listing
  127.         }
  128.         catch (Exception $e// in case of exception
  129.         {
  130.             // shows the exception error message
  131.             new TMessage('error''<b>Por favor verifique os campos abaixo:</b></br> ' $e->getMessage());
  132.             // undo all pending operations
  133.             TTransaction::rollback();
  134.         }
  135.     }
  136. function onEdit($param)
  137.     {
  138.         try
  139.         {
  140.             if (isset($param['key']))
  141.             {
  142.                 
  143.                 $key=$param['key']; // get the parameter $key
  144.                 TTransaction::open('una'); // open a transaction with the database
  145.                 $object = new Alunos($key); // instantiates the Active Record
  146.                 $object->dt_nascimento TDate::date2br($object->dt_nascimento);
  147.                 $object->store();
  148.                 $this->form->setData($object); // fill the form with the active record data 
  149.                 TTransaction::close(); // close the transaction
  150.             }
  151.             else
  152.             {
  153.                 $this->form->clear();
  154.             }
  155.         }
  156.         
  157.         
  158.         catch (Exception $e// in case of exception
  159.         {
  160.             new TMessage('error''<b>Error</b> ' $e->getMessage()); // shows the exception error message
  161.             TTransaction::rollback(); // undo all pending operations
  162.         }
  163.  }
  164. }
  165. ?>
LC

Fabiano, eu coloquei a mensagem com o ponto, só para acompanhar o topico, para ver as dicas.
Abraço.
FS

Ok Leandro,
Ainda não tive sucesso, estou pesquisando.

Abraço.
PD

People,

Prefiro usar essa outra solução:
https://soprogramando.wordpress.com/2011/09/29/traduzir-as-mensagens-do-mysql-para-o-portugues/

Simplesmente para evitar muitos IFs específicos no código-fonte que provavelmente deixarão de funcionar se trocar de banco de dados...

Abs!
FS

Bom dia,
Pablo, ficou melhor desta forma que você nos orientou. Só estou com dificuldades em achar no meu servidor web, onde encontro o arquivo my.ini, no meu computador foi tranquilo. Mas valeu, vou garimpar pra encontrar.

Abraços.