CJ
Combos dinamicamente em formulário
Boa tarde,
Tenho um formulário com 3 TDCombo, onde cada um depende do outro dinamicamente. Ao selecionar um fornecedor, será exibido no combo 2 a lista de contratos desse fornecedor. E ao selecionar um contrato, será mostrado os produtos desse contrato.
A questão é que o primeiro passo já consegui, mas ao selecionar o contrato no segundo combo não tem nenhuma ação com o setChangeAction
Tenho um formulário com 3 TDCombo, onde cada um depende do outro dinamicamente. Ao selecionar um fornecedor, será exibido no combo 2 a lista de contratos desse fornecedor. E ao selecionar um contrato, será mostrado os produtos desse contrato.
A questão é que o primeiro passo já consegui, mas ao selecionar o contrato no segundo combo não tem nenhuma ação com o setChangeAction
function __construct($param)
{
parent::__construct();
// creates the form
$this->form = new TForm('form_EntradaCereais');
$panel_master = new TPanelGroup( 'Entrada - Cereais' );
$vbox = new TVBox;
$vbox->style = 'width: 100%';
$this->form->add($panel_master);
$panel_master->add($vbox);
$frame_general = new TFrame;
$frame_general->class = 'tframe tframe-custom';
$frame_general->setLegend('Dados da Nota Fiscal');
$frame_general->style = 'background:whiteSmoke';
$table_general = new TTable;
$table_general->width = '100%';
$frame_general->add($table_general);
// products
$frame_product = new TFrame;
$frame_product->class = 'tframe tframe-custom';
$frame_product->setLegend('Produtos');
$table_product = new TTable;
$frame_product->add($table_product);
$vbox->add( $frame_general );
$vbox->add( $frame_product );
$criterio = new TCriteria;
$criterio->add( new TFilter('grupo_id', '=', 1));
// master fields
$id = new TEntry('id');
$fornecedor_id = new TDBCombo('fornecedor_id', 'nutricao', 'Fornecedor', 'id', 'nome', 'nome', $criterio);
$contrato_id = new TCombo('contrato_id');
// detail fields
$produto_id = new TDBCombo('produto_id', 'nutricao', 'Produto', 'id', 'nome', 'nome', $criterio);
$und = new TEntry('und');
$valor_unit = new TEntry('valor_unit');
$quantidade = new TEntry('quantidade');
$saldo = new TEntry('saldo');
$numero = new TEntry('numero');
$numero = $contrato_id->getValue();
$valor_unit->setNumericMask(2, ',', '.', true);
$quantidade->setNumericMask(2, ',', '.', true);
$saldo->setNumericMask(2, ',', '.', true);
$id->setSize('10%');
$produto_id->setSize('100%');
$und->setSize('100%');
$fornecedor_id->setSize('100%');
$produto_id->enableSearch();
$fornecedor_id->enableSearch();
$id->setEditable(false);
$und->setEditable(false);
$valor_unit->setEditable(false);
$saldo->setEditable(false);
$fornecedor_id->addValidation('Fornecedor', new TRequiredValidator);
$contrato_id->addValidation('Contrato', new TRequiredValidator);
$table_general->addRowSet( new TLabel('Id'), $id );
$table_general->addRowSet( new TLabel('Fornecedor', 'red'), $fornecedor_id );
$table_general->addRowSet( new TLabel('Contrato/Ano', 'red'), [$contrato_id] );
$table_general->addRowSet( new TLabel('Contrato/Ano', 'red'), [$numero] );
$add_product = new TButton('add_product');
$action_product = new TAction(array($this, 'onProductAdd'));
$add_product->setAction($action_product, 'Adicionar');
$add_product->setImage('bs:plus-sign green');
$table_product->add( new TLabel('Produto', 'red'));
$table_product->add( $produto_id);
$change_action1 = new TAction(array($this, 'onChangeForn'));
$fornecedor_id->setChangeAction($change_action1);
$contrato_id->setChangeAction(new TAction(array($this, 'onChangeContrato')));
$produto_id->setChangeAction(new TAction(array($this,'onProductChange')));
$row = $table_product->addRow();
$row->addCell(new TLabel('Unidade'));
$row->addMultiCell( $und, new TLabel('Preço'), $valor_unit, new TLabel('Saldo'),$saldo);
$row->addCell(new TLabel('Quantidade', 'red'));
$row->addCell($quantidade);
$table_product->addRowSet( $add_product );
$this->product_list = new TQuickGrid;
$this->product_list->style = "margin-bottom: 10px; width: 100%";
$this->product_list->disableDefaultClick();
$this->product_list->addQuickColumn('', 'edit', 'center', 10);
$this->product_list->addQuickColumn('', 'delete', 'center', 10);
$this->product_list->addQuickColumn('Id', 'produto_id', 'right', 40);
$this->product_list->addQuickColumn('Produto', 'nome', 'left', 200);
$this->product_list->addQuickColumn('Unidade', 'und', 'left', 20);
$qt = $this->product_list->addQuickColumn('Quantidade', 'quantidade', 'right', 30);
$pr = $this->product_list->addQuickColumn('Preço','valor_unit', 'right', 70);
$st = $this->product_list->addQuickColumn('Subtotal','={quantidade} * {valor_unit}', 'right', 80);
$this->product_list->createModel();
$vbox->add( $this->product_list );
$format_numero = function($value) {
if (is_numeric($value)) {
return number_format($value, 2, ',', '.');
}
return $value;
};
$format_value = function($value) {
if (is_numeric($value)) {
return 'R$ '.number_format($value, 2, ',', '.');
}
return $value;
};
$qt->setTransformer( $format_numero );
$pr->setTransformer( $format_value );
$st->setTransformer( $format_value );
$st->setTotalFunction( function($values) {
return array_sum((array) $values);
});
$list_button=new TButton('Lista');
//$list_button->setAction(new TAction(array('ContratoCereaisList', 'onReload')), 'Listagem de Contratos');
$list_button->setImage('fa:table blue');
$save_button = TButton::create('save', array($this, 'onSave'), 'Salvar', 'fa:save green');
$new_button = TButton::create('new', array($this, 'onClear'), 'Limpar', 'fa:eraser red');
$this->formFields = array($id, $fornecedor_id, $contrato_id, $produto_id, $und, $valor_unit, $quantidade, $add_product, $save_button, $new_button, $list_button);
$this->form->setFields( $this->formFields );
$panel_master->addFooter( THBox::pack($save_button, $new_button, $list_button) );
$container = new TVBox;
$container->style = 'width: 100%';
$container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
$container->add($this->form);
parent::add($container);
}
static function onChangeContrato( $param )
{
echo "teste";
var_dump($param);
}
static function onChangeForn( $param )
{
if( isset($param['fornecedor_id']) && $param['fornecedor_id'] )
{
try
{
TTransaction::open('nutricao');
$criteria = new TCriteria;
$criteria->add(new TFilter('fornecedor_id', '=', $param['fornecedor_id']));
$criteria->add(new TFilter('ano', '=', TSession::getValue('ano')));
$repository = new TRepository('Contrato');
$objects = $repository->load( $criteria );
$contratos = array();
foreach ($objects as $object)
{
$contratos[ $object->fornecedor_id ] = $object->fornecedor_id;
}
$resultado = array();
if (!empty($contratos))
{
$criterio = new TCriteria;
$criterio->add(new TFilter('id', 'IN', $contratos));
$repo = new TRepository('Contrato');
$obj = $repo->load( $criterio );
foreach ($obj as $object)
{
$resultado[ $object->id ] = $object->contrato .'/' . $object->ano;
}
}
TCombo::reload('form_EntradaCereais', 'contrato_id', $resultado);
TTransaction::close();
}
catch (Exception $e) // in case of exception
{
new TMessage('error', '<b>Error</b> ' . $e->getMessage());
TTransaction::rollback();
}
}
}
static function onProductChange( $params )
{
if( isset($params['produto_id']) && $params['produto_id'] )
{
try
{
TTransaction::open('nutricao');
$product = new Produto($params['produto_id']);
$criteria = new TCriteria( new TFilter('produto_id', '=', ''));
$dados_produto = new TRepository('ContratoItem');
$dados_produto->load($criteria);
$fill_data = new StdClass;
$fill_data->und = $product->und;
TForm::sendData('form_EntradaCereais', $fill_data);
TTransaction::close();
}
catch (Exception $e) // in case of exception
{
new TMessage('error', '<b>Error</b> ' . $e->getMessage());
TTransaction::rollback();
}
}
}
Ao selecionar o combo de contrato, não executa a função onChangeContrato. No caso acima, nõa mostra "teste" na tela e nem o var_dump;
Fiz um teste rápido aqui e funcionou. Chegou a verificar no console se aparece algum erro?
Outra coisa que achei estranha, o filtro para preencher a combo de contratos está correto na função onChangeForn?
Nataniel,
Realmente estava estranho, é o que dá copiar e colar, kkkk. Não sei o que era, mas modifiquei as outras funções e funcionou.
Obrigado
Ficou assim esse método:
Mas agora estou com problemas ao adicionar um novo produto, pois os dados do contrato_id (combo 2) estão desaparecendo. Acredito que seja no onReload(). Como manter esses dados?
https://www.adianti.com.br/forum/pt/view_1514?manter-combos-dependentes-preenchi