Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Pegar ID do registro em uma DBCombo e gravar em seção Pessoal, tenho um form apenas com uma DBCombo e um botão Salvar. Ao selecionar o registro na DbCombo, preciso pegar o ID do objeto selecionado e gravar na Session ao salvar, mas não estou conseguindo pegar o ID. Tenho que fazer através do Onchange da DBCombo? Ou consigo apenas através de um atributo do objeto? Já tentei pegar pelos atributos, mas não aparece atributo ID e o objeto parece...
VA
Pegar ID do registro em uma DBCombo e gravar em seção  
Fechado
Pessoal, tenho um form apenas com uma DBCombo e um botão Salvar.
Ao selecionar o registro na DbCombo, preciso pegar o ID do objeto selecionado e gravar na Session ao salvar, mas não estou conseguindo pegar o ID.

Tenho que fazer através do Onchange da DBCombo? Ou consigo apenas através de um atributo do objeto? Já tentei pegar pelos atributos, mas não aparece atributo ID e o objeto parece que chega vazio no método OnSave.

1154periodo = new TDBCombo('combo','dbcollegio','Periodo','idperiodo','descricao');

Agradeço se me derem alguma luz.

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


MG

Vanilson

O mais indicado é no onChange, onde é passado "$param" e você conseguirá capturar o conteúdo selecionado do TDBCombo.
Eu sempre faço desta maneira e dá certo.

Algum colega tem outra sugestão?

Abraços
Marcelo
ES

Coloque o código pra gente avaliar porque pode ter vários motivos por não estar conseguindo, uma vez que essa ação é bem corriqueira no framework. Veja se não esqueceu de colocar o o objeto no form adequadamente, pois apenas o fato de aparecer na tela não significa que está funcional.
VA

Segue o código.. nem coloquei em sessão ainda, pois quando tentei ver o resultado do objeto, os atributos não exibem nada.

Devo estar fazendo algo errado.

  1. <?php
  2. /**
  3.  * PeriodoForm Registration
  4.  * @author  <your name here>
  5.  */
  6. class PeriodoSelect extends TPage
  7. {
  8.     protected $form// form
  9.     
  10.     /**
  11.      * Class constructor
  12.      * Creates the page and the registration form
  13.      */
  14.     function __construct()
  15.     {
  16.         parent::__construct();
  17.         
  18.         // creates the form
  19.         $this->form = new TForm('form_Periodo');
  20.         $this->form->class 'tform'// CSS class
  21.         $this->form->style 'width: 500px';
  22.         
  23.         // add a table inside form
  24.         $table = new TTable;
  25.         $table-> width '100%';
  26.         $this->form->add($table);
  27.         
  28.         // add a row for the form title
  29.         $row $table->addRow();
  30.         $row->class 'tformtitle'// CSS class
  31.         $row->addCell( new TLabel('Periodo') )->colspan 2;
  32.         
  33.         // create the form fields
  34.         //$idperiodo                      = new TCombo('idperiodo');
  35.         $idperiodo = new TDBCombo('combo','dbcollegio','Periodo','idperiodo','descricao');
  36.         // define the sizes
  37.         $idperiodo->setSize(100);
  38.         // add one row for each form field
  39.         $table->addRowSet( new TLabel('idperiodo:'), $idperiodo );
  40.         $this->form->setFields(array($idperiodo));
  41.         // create the form actions
  42.         $save_button TButton::create('save', array($this'onSave'), _t('Save'), 'ico_save.png');
  43.         
  44.         $this->form->addField($save_button);
  45.         
  46.         $buttons_box = new THBox;
  47.         $buttons_box->add($save_button);
  48.         
  49.         // add a row for the form action
  50.         $row $table->addRow();
  51.         $row->class 'tformaction'// CSS class
  52.         $row->addCell($buttons_box)->colspan 2;
  53.         
  54.         parent::add($this->form);
  55.     }
  56.     /**
  57.      * method onSave()
  58.      * Executed whenever the user clicks at the save button
  59.      */
  60.     function onSave()
  61.     {
  62.         try
  63.         {
  64.             //TTransaction::open('dbcollegio'); // open a transaction        
  65.                 
  66.             // get the form data into an active record Periodo
  67.             $object $this->form->getData('Periodo');
  68.             $this->form->setData($object); // keep form data
  69.             
  70.             echo 'Salvar';
  71.             echo $object->abreviacaoperiodo;
  72.             //echo $object->id; <==== NÃO EXISTE 
  73.             //echo $object->idperiodo; <==== NÃO FUNCIONA 
  74.         
  75.             //TTransaction::close(); // close the transaction        
  76.         }
  77.         catch (Exception $e// in case of exception
  78.         {
  79.             new TMessage('error''<b>Error</b> ' $e->getMessage()); // shows the exception error message
  80.             $this->form->setData$this->form->getData() ); // keep form data
  81.             //TTransaction::rollback(); // undo all pending operations
  82.         }
  83.     }
  84.     
  85. }
  86. </your>
ES

Você está com alguns problemas. Vou colocar o código alterado e onde estiver negrito foi minha alteração. Depois teste e poste o resultado:
  1. <?php 
  2. /**
  3.  * PeriodoForm Registration
  4.  * @author  <your name here>
  5.  */
  6. class PeriodoSelect extends TPage
  7. {
  8.     protected $form// form
  9.     
  10.     /**
  11.      * Class constructor
  12.      * Creates the page and the registration form
  13.      */
  14.     function __construct()
  15.     {
  16.         parent::__construct();
  17.         
  18.         // creates the form
  19.         $this->form = new TForm('form_Periodo');
  20.         $this->form->class 'tform'// CSS class
  21.         $this->form->style 'width: 500px';
  22.         
  23.         // add a table inside form
  24.         $table = new TTable;
  25.         $table-> width '100%';
  26.         $this->form->add($table);
  27.         
  28.         // add a row for the form title
  29.         $row $table->addRow();
  30.         $row->class 'tformtitle'// CSS class
  31.         $row->addCell( new TLabel('Periodo') )->colspan 2;
  32.         
  33.         // create the form fields
  34.         //$idperiodo                      = new TCombo('idperiodo');
  35.         $idperiodo = new TDBCombo('combo','dbcollegio','Periodo','idperiodo','descricao');
  36.         // define the sizes
  37.         $idperiodo->setSize(100);
  38.         // add one row for each form field
  39.         $table->addRowSet( new TLabel('idperiodo:'), $idperiodo );
  40.         
  41.         // create the form actions
  42.         $save_button TButton::create('save', array($this'onSave'), _t('Save'), 'ico_save.png');
  43.         
  44.         <b>$this->form->setFields(array($idperiodo$save_button));</b>
  45.         //$this->form->addField($save_button);
  46.         
  47.         $buttons_box = new THBox;
  48.         $buttons_box->add($save_button);
  49.         
  50.         // add a row for the form action
  51.         $row $table->addRow();
  52.         $row->class 'tformaction'// CSS class
  53.         $row->addCell($buttons_box)->colspan 2;
  54.         
  55.         parent::add($this->form);
  56.     }
  57.     /**
  58.      * method onSave()
  59.      * Executed whenever the user clicks at the save button
  60.      */
  61.     function onSave()
  62.     {
  63.         try
  64.         {
  65.             //TTransaction::open('dbcollegio'); // open a transaction        
  66.                 
  67.             // get the form data into an active record Periodo
  68.             $object $this->form->getData('Periodo');
  69.             $this->form->setData($object); // keep form data
  70.             
  71.             echo 'Salvar';
  72.             <b>echo $object->combo;</b>
  73.             //echo $object->id; <==== NÃO EXISTE 
  74.             //echo $object->idperiodo; <==== NÃO FUNCIONA 
  75.         
  76.             //TTransaction::close(); // close the transaction        
  77.         }
  78.         catch (Exception $e// in case of exception
  79.         {
  80.             new TMessage('error''<b>Error</b> ' $e->getMessage()); // shows the exception error message
  81.             $this->form->setData$this->form->getData() ); // keep form data
  82.             //TTransaction::rollback(); // undo all pending operations
  83.         }
  84.     }
  85.     
  86. ?>
</your>
VA

Olá Eliezer,
Agradeço pela contribuição, mas:

O addfield que você comentou no código foi gerado pelo Studio, fiz a alteração que você sugeriu mas o resultado é o mesmo.

O código $object->combo exibe a posição selecionada na combo (1,2,3...). Já tinha testado com isso mas não me atende. Teria que ser o Id do objeto na tabela (10, 21, 124..).

Se não tiver como eu pegar o $object->id, vou tentar fazer pelo OnChange.

Valeu.
ES

Bom ele está trazendo como resultado o campo 'idperiodo' que vc colocou no TDBCombo, se o campo do referido id tem outro nome na tabela então vc precisa substituir o 'idperiodo' por ele.

Como eu não conheço a estrutura de sua tabela não tem como eu te ajudar nesse sentido, apenas que o raciocínio está correto.

abs
PD

Vanilson,

Acho que estamos com um problema de comunicação somente.
Cada campo colocado no formulário gera uma posição no objeto do onSave(),
então o comportamento está conforme o esperado, não existem erros.
Não poderia haver uma posição ->id pois não existe um campo no formulário
com esse nome. A ideia do TDBCombo é passar o ID do objeto selecionado,
o que é representado pelo quarto parâmetro, conforme você pode ver.

No seu caso, está montando uma combo de períodos a partir da tabela
de períodos. Deveria haver somente um campo de ID, por que tem mais
de um? id e idperiodo? Qual desses é a chave primária? A partir da
chave primária identificada, passe ela no quarto parâmetro:

  1. <?php
  2. $idperiodo = new TDBCombo('combo','dbcollegio','Periodo','idperiodo','descricao');
  3. ?>


Se isso não puder ser feito dessa maneira, então talvez você tenha
um erro conceitual de modelagem em seu banco de dados.

Att,
Pablo
VB

Olá Pablo,

Não é questão de modelagem.
Deixa eu contextualizar para você entender.

Tenho uma aplicação que rodando em desktop que estou convertendo para web.
Estou gerando os modelos de classe a partir do Studio (assistente de modelos).

Na tabela de períodos, minha chave primária é IdPeriodo.
Criei um form com a combo e o botão Save.
No método OnSave quero apenas pegar o IdPeriodo da seleção da combo e gravar na session.

Segue a classe gerada no Studio.
Obrigado.

  1. <?php
  2. /**
  3.  * Periodo Active Record
  4.  * @author  <your-name-here>
  5.  */
  6. class Periodo extends TRecord
  7. {
  8.     const TABLENAME 'public.periodo';
  9.     const PRIMARYKEY'idperiodo';
  10.     const IDPOLICY =  'max'// {max, serial}
  11.     
  12.     
  13.     /**
  14.      * Constructor method
  15.      */
  16.     public function __construct($id NULL$callObjectLoad TRUE)
  17.     {
  18.         parent::__construct($id$callObjectLoad);
  19.         parent::addAttribute('descricao');
  20.         parent::addAttribute('datainicial');
  21.         parent::addAttribute('datafinal');
  22.         parent::addAttribute('periodos');
  23.         parent::addAttribute('terminologia');
  24.         parent::addAttribute('nomeperiodo');
  25.         parent::addAttribute('abreviacaoperiodo');
  26.         parent::addAttribute('letraperiodo');
  27.         parent::addAttribute('idperiodoanterior');
  28.         parent::addAttribute('idperiodoposterior');
  29.         parent::addAttribute('reprovacaomin');
  30.         parent::addAttribute('reprovacaomax');
  31.         parent::addAttribute('recuperacaomin');
  32.         parent::addAttribute('recuperacaomax');
  33.         parent::addAttribute('aprovacaomin');
  34.         parent::addAttribute('aprovacaomax');
  35.         parent::addAttribute('frequenciaminima');
  36.         parent::addAttribute('recuperacaobimestral');
  37.         parent::addAttribute('recuperacaosemestral');
  38.         parent::addAttribute('mediaaposrecuperacao');
  39.         parent::addAttribute('formulaquantoprecisa');
  40.         parent::addAttribute('periodoexibirqtoprecisa');
  41.         parent::addAttribute('layoutboletim');
  42.         parent::addAttribute('mensagemboletim');
  43.         parent::addAttribute('formulamediaanual');
  44.         parent::addAttribute('formulamediafinal');
  45.     }
  46. }
PD

Então Vanilson é mais simples do que pensamos :-)

Os valores são obtidos no post pelos seus nomes.
Veja que você criou o objeto com o nome "combo" (primeiro parâmetro):

  1. <?php
  2.     new TDBCombo('combo', ...
  3. ?>


Agora, para obtê-lo, basta usar o getData() e logo em seguida acessar a posição $object->combo. Neste caso não é necessário passar nada como parâmetro para a getData(), você estava passando "Periodo", mas nesse caso você estaria forçando o retorno a ser da classe "Periodo", mas a classe "Periodo" nem ao menos tem um atributo chamado "combo" como o que você criou no form ;-)

  1. <?php
  2.     $object $this->form->getData();
  3.     var_dump($object->combo);
  4. ?>


Se você quiser que o atributo tenha outro nome que não $object->combo, basta alterar o primeiro parâmetro do construtor do objeto.

Att,
Pablo
VB

Pablo e demais amigos,

Consegui fazer funcionar da forma abaixo.
Talvez tenha rodeado demais para fazer a mesma coisa, mas deu certo.
Tentei fazer mais simplificado, sem o evento onChangeAction da combo, mas não consegui.

Obrigado a todos.
Abraço!

  1. <?php
  2. /**
  3.  * PeriodoForm Registration
  4.  * @author  <your name here>
  5.  */
  6. class PeriodoSelect extends TPage
  7. {
  8.     protected $form// form
  9.     
  10.     /**
  11.      * Class constructor
  12.      * Creates the page and the registration form
  13.      */
  14.     function __construct()
  15.     {
  16.         parent::__construct();
  17.         
  18.         // creates the form
  19.         $this->form = new TForm('form_Periodo');
  20.         $this->form->class 'tform'// CSS class
  21.         $this->form->style 'width: 500px';
  22.         
  23.         // add a table inside form
  24.         $table = new TTable;
  25.         $table-> width '100%';
  26.         $this->form->add($table);
  27.         
  28.         
  29.         // add a row for the form title
  30.         $row $table->addRow();
  31.         $row->class 'tformtitle'// CSS class
  32.         $row->addCell( new TLabel('Periodo') )->colspan 2;
  33.         
  34.         // create the form fields
  35.         
  36.         $idperiodo = new THidden('idperiodo');
  37.         $combo_periodo = new TDBCombo('combo_periodo','dbcollegio','Periodo','idperiodo','descricao');
  38.         $combo_periodo->setChangeAction( new TAction( array($this'onChangeAction' )) );
  39.         // define the sizes
  40.         $combo_periodo->setSize(100);
  41.         // add one row for each form field
  42.         $table->addRowSet( new TLabel('Período:'), $combo_periodo );
  43.         $table->addRowSet$idperiodo );        
  44.         $this->form->setFields(array($combo_periodo));
  45.         // create the form actions
  46.         $save_button TButton::create('save', array($this'onSave'), _t('Save'), 'ico_save.png');
  47.         
  48.         //$this->form->addField($save_button);
  49.         $this->form->setFields(array($idperiodo,$combo_periodo,$save_button ));
  50.         
  51.         $buttons_box = new THBox;
  52.         $buttons_box->add($save_button);
  53.         
  54.         // add a row for the form action
  55.         $row $table->addRow();
  56.         $row->class 'tformaction'// CSS class
  57.         $row->addCell($buttons_box)->colspan 2;
  58.         
  59.         parent::add($this->form);
  60.     }
  61.     /**
  62.      * method onSave()
  63.      * Executed whenever the user clicks at the save button
  64.      */
  65.     function onSave()
  66.     {
  67.         try
  68.         {
  69.             //TTransaction::open('dbcollegio'); // open a transaction
  70.             
  71.             // get the form data into an active record Periodo
  72.             $object $this->form->getData('Periodo');
  73.             $this->form->setData($object); // keep form data
  74.             
  75.             TSession::setValue('var_idperiodo',$object->idperiodo); 
  76.             TApplication::gotoPage('CommonPage');
  77.             
  78.             
  79.             //TTransaction::close(); // close the transaction
  80.     
  81.         }
  82.         catch (Exception $e// in case of exception
  83.         {
  84.             new TMessage('error''<b>Error</b> ' $e->getMessage()); // shows the exception error message
  85.             $this->form->setData$this->form->getData() ); // keep form data
  86.             //TTransaction::rollback(); // undo all pending operations
  87.         }
  88.     }
  89.     
  90.     
  91.     
  92.     static function onChangeAction ($param
  93.     { 
  94.     
  95.         $obj = new StdClass
  96.         $obj->idperiodo  $param['combo_periodo']; 
  97.         
  98.         TForm::sendData('form_Periodo'$obj); 
  99.     }     
  100.         
  101. }
  102. </your>
PD

Vanilson,

Você não precisa do changeAction. É um evento javascript desnecessário neste cenário.
Você só precisa trocar o nome do campo.

De:
new TDBCombo('combo_periodo', ...
para:
new TDBCombo('idperiodo', ...

Att,
Pablo
VB

Valeu, Pablo.

Segue a versão simplificada.

  1. <?php
  2. /**
  3.  * PeriodoForm Registration
  4.  * @author  <your name here>
  5.  */
  6. class PeriodoSelect extends TPage
  7. {
  8.     protected $form// form
  9.     
  10.     /**
  11.      * Class constructor
  12.      * Creates the page and the registration form
  13.      */
  14.     function __construct()
  15.     {
  16.         parent::__construct();
  17.         
  18.         // creates the form
  19.         $this->form = new TForm('form_Periodo');
  20.         $this->form->class 'tform'// CSS class
  21.         $this->form->style 'width: 500px';
  22.         
  23.         // add a table inside form
  24.         $table = new TTable;
  25.         $table-> width '100%';
  26.         $this->form->add($table);
  27.         
  28.         // add a row for the form title
  29.         $row $table->addRow();
  30.         $row->class 'tformtitle'// CSS class
  31.         $row->addCell( new TLabel('Periodo') )->colspan 2;
  32.         
  33.         // create the form fields
  34.         $combo_periodo = new TDBCombo('idperiodo','dbcollegio','Periodo','idperiodo','descricao');
  35.         // define the sizes
  36.         $combo_periodo->setSize(100);
  37.         // add one row for each form field
  38.         $table->addRowSet( new TLabel('Período:'), $combo_periodo );
  39.         $this->form->setFields(array($combo_periodo));
  40.         // create the form actions
  41.         $save_button TButton::create('save', array($this'onSave'), _t('Save'), 'ico_save.png');
  42.         
  43.         //$this->form->addField($save_button);
  44.         $this->form->setFields(array($combo_periodo,$save_button ));
  45.         
  46.         $buttons_box = new THBox;
  47.         $buttons_box->add($save_button);
  48.         
  49.         // add a row for the form action
  50.         $row $table->addRow();
  51.         $row->class 'tformaction'// CSS class
  52.         $row->addCell($buttons_box)->colspan 2;
  53.         
  54.         parent::add($this->form);
  55.     }
  56.     /**
  57.      * method onSave()
  58.      * Executed whenever the user clicks at the save button
  59.      */
  60.     function onSave()
  61.     {
  62.         try
  63.         {
  64.             // get the form data into an active record Periodo
  65.             $object $this->form->getData('Periodo');
  66.             $this->form->setData($object); // keep form data
  67.             
  68.             TSession::setValue('var_idperiodo',$object->idperiodo); 
  69.             TApplication::gotoPage('CommonPage');
  70.         }
  71.         catch (Exception $e// in case of exception
  72.         {
  73.             new TMessage('error''<b>Error</b> ' $e->getMessage()); // shows the exception error message
  74.             $this->form->setData$this->form->getData() ); // keep form data
  75.         }
  76.     }
  77.     
  78. }
  79. </your>