Lançado Adianti Framework 8.1!
Clique aqui para saber mais
TDBCombo + TCombo Boa tarde! Venho encontrando dificuldades para ao utilizar a função TDBCombo + TCombo O TDBCombo está carregando as categorias de uma tabela e o TCombo carrega as subcategorias através de um reload. O problema é que não está salvando as informações do formulário no banco, apesar de mostrar a mensagem de que foi salvo e não apresentar nenhum warning (Já fiz debug, utilizei var_d...
EB
TDBCombo + TCombo  
Boa tarde!

Venho encontrando dificuldades para ao utilizar a função TDBCombo + TCombo
O TDBCombo está carregando as categorias de uma tabela e o TCombo carrega as subcategorias através de um reload.

O problema é que não está salvando as informações do formulário no banco, apesar de mostrar a mensagem de que foi salvo e não apresentar nenhum warning (Já fiz debug, utilizei var_dump e nada). Ao salvar, eu preciso que o formulário venha preenchido com as informações e ao editar tbém (para isso estou utilizando a função onChangeCombo).

Segue minha classe e a declaração da tabela se puderem me ajudar:
  1. <?php
  2. class ProdutoFormView extends TPage
  3. {
  4.     protected $form
  5.     
  6.     function __construct()
  7.     {
  8.         parent::__construct();
  9.                 
  10.         $this->form = new TForm('form_Produto');
  11.         $this->form->class 'tform'// CSS class
  12.         $this->form->style 'width: 500px';
  13.                 
  14.         $table = new TTable;
  15.         $table-> width '100%';
  16.         $this->form->add($table);
  17.                 
  18.         $row $table->addRow();
  19.         $row->class 'tformtitle'
  20.         $row->addCell( new TLabel('Produto') )->colspan 2;
  21.         
  22.         $id               = new TEntry('id');
  23.         $categoria_id     = new TDBCombo('categoria_id','permission','Categoria','id','categoria','categoria');
  24.         $subcategoria_id  = new TCombo('subcategoria_id');
  25.         $unidade_id       = new TDBCombo('unidade_id','permission','UnidadeProduto','id','descricao','descricao');
  26.         $descricao        = new TEntry('descricao');
  27.         $especificacoes   = new TText('especificacoes');
  28.         $valor_entrada    = new TEntry('valor_entrada');
  29.         $valor_saida      = new TEntry('valor_saida');
  30.         $observacoes      = new TText('observacoes');
  31.         
  32.         $id->setSize(60);
  33.         $categoria_id->setSize(200);
  34.         $subcategoria_id->setSize(200);
  35.         $unidade_id->setSize(200);
  36.         $descricao->setSize(200);
  37.         $especificacoes->setSize(20040);
  38.         $valor_entrada->setSize(200);
  39.         $valor_saida->setSize(200);
  40.         $observacoes->setSize(20040);
  41.         $id->setEditable(FALSE);
  42.         $valor_entrada->setNumericMask(2',''.');
  43.         $valor_saida->setNumericMask(2',''.');   
  44.         $categoria_id->setChangeAction(new TAction(array($this'onChangeCombo')));
  45.         
  46.         // validations
  47.         $categoria_id->addValidation('Categoria', new TRequiredValidator);
  48.         $subcategoria_id->addValidation('Subcategoria', new TRequiredValidator);
  49.         $unidade_id->addValidation('Unidade', new TRequiredValidator);
  50.         // add one row for each form field
  51.         $table->addRowSet( new TLabel('ID:'), $id );
  52.         $table->addRowSet$label_categoria_id = new TLabel('Categoria:'), $categoria_id );
  53.         $label_categoria_id->setFontColor('#FF0000');
  54.         $table->addRowSet$label_subcategoria_id = new TLabel('Subcategoria:'), $subcategoria_id );
  55.         $label_subcategoria_id->setFontColor('#FF0000');
  56.         $table->addRowSet$label_unidade_id = new TLabel('Unidade:'), $unidade_id );
  57.         $label_unidade_id->setFontColor('#FF0000');
  58.         $table->addRowSet( new TLabel('Descrição:'), $descricao );
  59.         $table->addRowSet( new TLabel('Especificações:'), $especificacoes );
  60.         $table->addRowSet( new TLabel('Valor entrada:'), $valor_entrada );
  61.         $table->addRowSet( new TLabel('Valor saída:'), $valor_saida );
  62.         $table->addRowSet( new TLabel('Observações:'), $observacoes );
  63.         $this->form->setFields(array($id,$categoria_id,$subcategoria_id,$unidade_id,$descricao,$especificacoes,$valor_entrada,$valor_saida,$observacoes));
  64.         
  65.         $save_button TButton::create('save', array($this'onSave'), _t('Save'), 'ico_save.png');
  66.         $new_button  TButton::create('new',  array($this'onEdit'), _t('New'),  'ico_new.png');
  67.         
  68.         $this->form->addField($save_button);
  69.         $this->form->addField($new_button);
  70.         
  71.         $buttons_box = new THBox;
  72.         $buttons_box->add($save_button);
  73.         $buttons_box->add($new_button);
  74.                 
  75.         $row $table->addRow();
  76.         $row->class 'tformaction'
  77.         $row->addCell($buttons_box)->colspan 2;
  78.         
  79.         parent::add($this->form);
  80.     }
  81.  
  82.     function onSave($param)
  83.     {
  84.         try
  85.         {
  86.             TTransaction::open('permission'); 
  87.                         
  88.             $object $this->form->getData('Produto');
  89.             $this->form->validate(); 
  90.             //var_dump($object); die();
  91.             $object->store(); 
  92.             
  93.             $this->onChangeCombo($param);
  94.             $sub = new StdClass;
  95.             $sub->subcategoria_id $object->subcategoria_id;
  96.             TForm::sendData('form_Produto',$sub);
  97.             
  98.             $this->form->setData($object);  
  99.             TTransaction::close();  
  100.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  101.         }
  102.         catch (Exception $e
  103.         {
  104.             new TMessage('error''<b>Error</b> ' $e->getMessage()); // shows the exception error message
  105.             $this->form->setData$this->form->getData() ); 
  106.             TTransaction::rollback(); 
  107.         }
  108.     }
  109.     
  110.     function onEdit($param)
  111.     {
  112.         try
  113.         {
  114.             if (isset($param['key']))
  115.             {
  116.                 $key=$param['key']; 
  117.                 TTransaction::open('permission'); 
  118.                 $object = new Produto($key); 
  119.                 $this->form->setData($object);
  120.                 TTransaction::close(); 
  121.             }
  122.             else
  123.             {
  124.                 $this->form->clear();
  125.             }
  126.         }
  127.         catch (Exception $e
  128.         {
  129.             new TMessage('error''<b>Error</b> ' $e->getMessage()); 
  130.             TTransaction::rollback(); 
  131.         }
  132.     }
  133.     
  134.     static function onChangeCombo($param)
  135.     {
  136.         $categoria $param['categoria_id'];
  137.         TTransaction::open('permission');
  138.         $repository = new TRepository('Subcategoria');
  139.         $criteria = new TCriteria;
  140.         $criteria->add( new TFilter('categoria_id','=',$categoria));
  141.         $criteria->setProperty('order''name');
  142.         $object $repository->load($criteria,FALSE);
  143.         $itens = array();       
  144.         foreach ($object as $obj)
  145.         {
  146.             $itens[$obj->id] = $obj->name;
  147.         }
  148.         TCombo::reload('form_Produto','subcategoria_id'$itens);
  149.     }
  150. }
  151. ?>


CREATE TABLE produto ( id INTEGER PRIMARY KEY NOT NULL, categoria_id INT REFERENCES categoria (id) NOT NULL, subcategoria_id INT REFERENCES subcategoria (id), unidade_id INT REFERENCES unidade (id) NOT NULL, descricao VARCHAR (255) NOT NULL, especificacoes TEXT, valor_entrada REAL, valor_saida REAL, observacoes TEXT );

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 (12)


EB

Pessoal.

Mexendo aqui descobri que se eu retirar o parâmetro $param do método onSave e comentar as linhas abaixo, o formulário é salvo no banco, no entanto preenche todos os campos do formulário, menos a subcategoria.
  1. <?php
  2.     function onSave()
  3.     {
  4.         try
  5.         {
  6.             TTransaction::open('permission'); // open a transaction
  7.                         
  8.             $object $this->form->getData('Produto');
  9.             $this->form->validate(); 
  10.             $object->store(); 
  11.             
  12. //            $this->onChangeCombo($param);
  13. //            $sub = new StdClass;
  14. //            $sub->subcategoria_id = $object->subcategoria_id;
  15. //            TForm::sendData('form_Produto',$sub);
  16.             
  17.             $this->form->setData($object); 
  18.             TTransaction::close(); 
  19.                        
  20.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  21.         }
  22.         catch (Exception $e
  23.         {
  24.             new TMessage('error''<b>Error</b> ' $e->getMessage()); 
  25.             $this->form->setData$this->form->getData() ); 
  26.             TTransaction::rollback(); 
  27.         }
  28.     }
  29. ?>


Como proceder nesse caso, para depois de salvar carregar a subcategoria no formulário e também na edição, que não está vindo preenchido?
FC

Posta seu model produtos.

De um var_dump($object) antes do store, e poste também.
EB

Olá Felipe,

Segue o meu model Produto:
  1. <?php
  2. class Produto extends TRecord {
  3.     const TABLENAME 'produto';
  4.     const PRIMARYKEY 'id';
  5.     const IDPOLICY 'max'
  6.     public function __construct($id NULL) {
  7.         parent::__construct($id);
  8.         parent::addAttribute('categoria_id');
  9.         parent::addAttribute('subcategoria_id');
  10.         parent::addAttribute('unidade_id');
  11.         parent::addAttribute('descricao');
  12.         parent::addAttribute('especificacoes');
  13.         parent::addAttribute('valor_entrada');
  14.         parent::addAttribute('valor_saida');        
  15.         parent::addAttribute('observacoes');
  16.     }
  17. }
  18. ?>


E aqui resultado do var_dump($object):
object(Produto)[109] protected 'data' => array (size=9) 'id' => string '1' (length=1) 'categoria_id' => string '1' (length=1) 'subcategoria_id' => string '3' (length=1) 'unidade_id' => string '3' (length=1) 'descricao' => string 'Roteador TP-LINK' (length=16) 'especificacoes' => string ' Nenhuma' (length=8) 'valor_entrada' => string '179,90' (length=6) 'valor_saida' => string '200,00' (length=6) 'observacoes' => string 'Roteador para usar em casa' (length=26) protected 'attributes' => array (size=8) 0 => string 'categoria_id' (length=12) 1 => string 'subcategoria_id' (length=15) 2 => string 'unidade_id' (length=10) 3 => string 'descricao' (length=9) 4 => string 'especificacoes' (length=14) 5 => string 'valor_entrada' (length=13) 6 => string 'valor_saida' (length=11) 7 => string 'observacoes' (length=11)
FC

Então aparentemente tudo certo veja se seu banco de dados está restringindo o campo subcategorias com o relacionamento ou se existe a subcategoria 3
EB

Então Felipe. Como falei anteriormente, no momento que eu comentei essa parte do código no método onSave
<php
// $this->onChangeCombo($param);
// $sub = new StdClass;
// $sub->subcategoria_id = $object->subcategoria_id;
// TForm::sendData('form_Produto',$sub);
?>

salva normalmente no banco! O que acontece é que quando salva, não está carregando no formulário o nome da subcategoria. E na hora de editar também não traz a subcategoria.

Não estou sabendo como fazer para salvar e dar um reload no TCombo!
FC

Entendia, ira precisar dar um reload na sua combo antes de devolver para o form.

Antes do sendform experimente esse código. Tanto no onSave quanto no onEdit

TTransaction::open('permission');
$repository = new TRepository('Subcategoria');
$criteria = new TCriteria;
$criteria->add( new TFilter('categoria_id','=',$object->categoria));
$criteria->setProperty('order', 'name');
$object = $repository->load($criteria,FALSE);
$itens = array();
foreach ($object as $obj)
{
$itens[$obj->id] = $obj->name;
}
TCombo::reload('form_Produto','subcategoria_id', $itens);
FC

TTransaction::close();

Faltou essa linha :)

EB

Olá Felipe.

Segui essa tua lógica e o negócio começou a fluir viu!
Só tem um pequeno porém, veja se consegue me explicar o que ainda falta?

Veja como fiz:
  1. <?php
  2.     function onSave($param) {
  3.         try {
  4.             TTransaction::open('permission');
  5.             $object $this->form->getData('Produto');
  6.             $this->form->validate();
  7.             $object->store();
  8.            
  9.             $repository = new TRepository('Subcategoria');
  10.             $criteria = new TCriteria;
  11.             $criteria->add(new TFilter('categoria_id''='$object->categoria_id));
  12.             $criteria->setProperty('order''name');
  13.             $object $repository->load($criteriaFALSE);
  14.             
  15.             $itens = array();
  16.             foreach ($object as $obj)
  17.             {
  18.             $itens[$obj->id] = $obj->name;
  19.             }
  20.             
  21.             TCombo::reload('form_Produto','subcategoria_id'$itens);         
  22.             $this->form->setData($object);
  23.             TTransaction::close();
  24.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  25.         } catch (Exception $e) {
  26.             new TMessage('error''<b>Error</b> ' $e->getMessage()); 
  27.             $this->form->setData($this->form->getData());
  28.             TTransaction::rollback();
  29.         }
  30.     }
  31. ?>


O porém é o seguinte: está salvando bonitinho e carregando o objeto no formulário, só que quando traz as subcategorias no TCombo, a que foi salva no banco não está vindo selecionada. Está vindo é a primeira da lista

Peço desculpa pelo incômodo :-)
FC

Oi Edilaine

Usamos o mesmo nome de variavel para o getData e depois no load do repositorio mudei para $objects no repositorio testa ai !!!


  1. <?php
  2.     function onSave($param) {
  3.         try {
  4.             TTransaction::open('permission');
  5.             $object $this->form->getData('Produto');
  6.             $this->form->validate();
  7.             $object->store();
  8.            
  9.             $repository = new TRepository('Subcategoria');
  10.             $criteria = new TCriteria;
  11.             $criteria->add(new TFilter('categoria_id''='$object->categoria_id));
  12.             $criteria->setProperty('order''name');
  13.             $objects $repository->load($criteriaFALSE);
  14.             
  15.             $itens = array();
  16.             foreach ($objects as $obj)
  17.             {
  18.             $itens[$obj->id] = $obj->name;
  19.             }
  20.             
  21.             TCombo::reload('form_Produto','subcategoria_id'$itens);         
  22.             $this->form->setData($object);
  23.             TTransaction::close();
  24.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  25.         } catch (Exception $e) {
  26.             new TMessage('error''<b>Error</b> ' $e->getMessage()); 
  27.             $this->form->setData($this->form->getData());
  28.             TTransaction::rollback();
  29.         }
  30.     }
  31. ?>



EB

Oi Felipe

Eu agradeço imensamente pela sua força de vontade em querer ajudar.

Ainda assim não está vindo selecionada a subcategoria salva no banco! Sinceramente não entendo porque não vem, pois aparentemente está tudo ok...

Não quero mais lhe incomodar com isto, bem que você tentou ajudar.

Obrigada tá
EB

Pessoal

Tem alguma outra forma de setar informações no TCombo que não seja através de:
  1. <?php
  2.  TCombo::reload('form_Produto','subcategoria_id'$itens); 
  3. ?>


É muito estranho, carrega as subcategorias de acordo com a categoria informada, mas não vem selecionada a subcategoria salva!

:-)
AB

Boa tarde, hoje me deparei exatamente com este problema, estou a mais de 3 horas tentando resolver e não consigo, to usando um TDBCombo para atualizar outro,e carrega normal, isso numa lista(DataGrid), mas ao dar o BUSCAR ou navegar nos registro a segunda TDBCombo sempre volta a seta a primeira opção, e nunca a selecionada se ela é da segunda opção em dainte. Alguem ja se deparou com isso e sabe como resolver.

Agradeço