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:
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:
- <?php
- class ProdutoFormView extends TPage
- {
- protected $form;
- function __construct()
- {
- parent::__construct();
- $this->form = new TForm('form_Produto');
- $this->form->class = 'tform'; // CSS class
- $this->form->style = 'width: 500px';
- $table = new TTable;
- $table-> width = '100%';
- $this->form->add($table);
- $row = $table->addRow();
- $row->class = 'tformtitle';
- $row->addCell( new TLabel('Produto') )->colspan = 2;
- $id = new TEntry('id');
- $categoria_id = new TDBCombo('categoria_id','permission','Categoria','id','categoria','categoria');
- $subcategoria_id = new TCombo('subcategoria_id');
- $unidade_id = new TDBCombo('unidade_id','permission','UnidadeProduto','id','descricao','descricao');
- $descricao = new TEntry('descricao');
- $especificacoes = new TText('especificacoes');
- $valor_entrada = new TEntry('valor_entrada');
- $valor_saida = new TEntry('valor_saida');
- $observacoes = new TText('observacoes');
- $id->setSize(60);
- $categoria_id->setSize(200);
- $subcategoria_id->setSize(200);
- $unidade_id->setSize(200);
- $descricao->setSize(200);
- $especificacoes->setSize(200, 40);
- $valor_entrada->setSize(200);
- $valor_saida->setSize(200);
- $observacoes->setSize(200, 40);
- $id->setEditable(FALSE);
- $valor_entrada->setNumericMask(2, ',', '.');
- $valor_saida->setNumericMask(2, ',', '.');
- $categoria_id->setChangeAction(new TAction(array($this, 'onChangeCombo')));
- // validations
- $categoria_id->addValidation('Categoria', new TRequiredValidator);
- $subcategoria_id->addValidation('Subcategoria', new TRequiredValidator);
- $unidade_id->addValidation('Unidade', new TRequiredValidator);
- // add one row for each form field
- $table->addRowSet( new TLabel('ID:'), $id );
- $table->addRowSet( $label_categoria_id = new TLabel('Categoria:'), $categoria_id );
- $label_categoria_id->setFontColor('#FF0000');
- $table->addRowSet( $label_subcategoria_id = new TLabel('Subcategoria:'), $subcategoria_id );
- $label_subcategoria_id->setFontColor('#FF0000');
- $table->addRowSet( $label_unidade_id = new TLabel('Unidade:'), $unidade_id );
- $label_unidade_id->setFontColor('#FF0000');
- $table->addRowSet( new TLabel('Descrição:'), $descricao );
- $table->addRowSet( new TLabel('Especificações:'), $especificacoes );
- $table->addRowSet( new TLabel('Valor entrada:'), $valor_entrada );
- $table->addRowSet( new TLabel('Valor saída:'), $valor_saida );
- $table->addRowSet( new TLabel('Observações:'), $observacoes );
- $this->form->setFields(array($id,$categoria_id,$subcategoria_id,$unidade_id,$descricao,$especificacoes,$valor_entrada,$valor_saida,$observacoes));
- $save_button = TButton::create('save', array($this, 'onSave'), _t('Save'), 'ico_save.png');
- $new_button = TButton::create('new', array($this, 'onEdit'), _t('New'), 'ico_new.png');
- $this->form->addField($save_button);
- $this->form->addField($new_button);
- $buttons_box = new THBox;
- $buttons_box->add($save_button);
- $buttons_box->add($new_button);
- $row = $table->addRow();
- $row->class = 'tformaction';
- $row->addCell($buttons_box)->colspan = 2;
- parent::add($this->form);
- }
- function onSave($param)
- {
- try
- {
- TTransaction::open('permission');
- $object = $this->form->getData('Produto');
- $this->form->validate();
- //var_dump($object); die();
- $object->store();
- $this->onChangeCombo($param);
- $sub = new StdClass;
- $sub->subcategoria_id = $object->subcategoria_id;
- TForm::sendData('form_Produto',$sub);
- $this->form->setData($object);
- TTransaction::close();
- new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
- }
- catch (Exception $e)
- {
- new TMessage('error', '<b>Error</b> ' . $e->getMessage()); // shows the exception error message
- $this->form->setData( $this->form->getData() );
- TTransaction::rollback();
- }
- }
- function onEdit($param)
- {
- try
- {
- if (isset($param['key']))
- {
- $key=$param['key'];
- TTransaction::open('permission');
- $object = new Produto($key);
- $this->form->setData($object);
- TTransaction::close();
- }
- else
- {
- $this->form->clear();
- }
- }
- catch (Exception $e)
- {
- new TMessage('error', '<b>Error</b> ' . $e->getMessage());
- TTransaction::rollback();
- }
- }
- static function onChangeCombo($param)
- {
- $categoria = $param['categoria_id'];
- TTransaction::open('permission');
- $repository = new TRepository('Subcategoria');
- $criteria = new TCriteria;
- $criteria->add( new TFilter('categoria_id','=',$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);
- }
- }
- ?>
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
);
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.
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?
Posta seu model produtos.
De um var_dump($object) antes do store, e poste também.
Olá Felipe,
Segue o meu model Produto:
E aqui resultado do var_dump($object):
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
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!
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);
TTransaction::close();
Faltou essa linha :)
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:
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 :-)
Oi Edilaine
Usamos o mesmo nome de variavel para o getData e depois no load do repositorio mudei para $objects no repositorio testa ai !!!
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á
Pessoal
Tem alguma outra forma de setar informações no TCombo que não seja através de:
É muito estranho, carrega as subcategorias de acordo com a categoria informada, mas não vem selecionada a subcategoria salva!
:-)
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