Lançado Adianti Framework 7.6!
Clique aqui para saber mais
TDBCombo hierarquia Boa tarde, estou com dificuldades em fazer esse TDBCombo hierarquia funcionar, atê segui um exemplo no tutor, mas deu certo. ...
F
TDBCombo hierarquia  
Boa tarde, estou com dificuldades em fazer esse TDBCombo hierarquia funcionar, atê segui um exemplo no tutor, mas deu certo.

  1. <?php>
  2. $ar_item_ar_cod_fil = new TDBCombo('ar_item_ar_cod_fil', $this->database, 'TFilial', 'cod_fil', '{sigla_fil} - {nome_fil}', 'nome_fil asc');
  3.         $ar_item_ar_cod_fil->enableSearch();
  4.         $filter = new TCriteria;
  5.         $filter->add(new TFilter('cod_area', '<', '0'));
  6.         $ar_item_ar_cod_area = new TDBCombo('ar_item_ar_cod_area', $this->database, 'TArea', 'cod_area', 'area', 'area', $filter);
  7.         $ar_item_ar_cod_area->enableSearch();
  8. ?>

  1. <?php>
  2. public function fireEvents( $object )
  3.     {
  4.         $obj = new stdClass;
  5.         $obj->ar_item_ar_cod_fil      = $object->ar_item_ar_cod_fil;
  6.         $obj->ar_item_ar_cod_area     = $object->ar_item_ar_cod_area;
  7.         TForm::sendData(self::$formName, $obj);
  8.     }
  9.     
  10.     public static function onAreaChange($param)
  11.     {
  12.         try
  13.         {
  14.             TTransaction::open(TSession::getValue('pConfig'));
  15.             if (!empty($param['ar_item_ar_cod_fil']))
  16.             {
  17.                 $criteria = TCriteria::create( ['cod_fil' => $param['ar_item_ar_cod_fil'] ] );
  18.                 
  19.                 // formname, field, database, model, key, value, ordercolumn = NULL, criteria = NULL, startEmpty = FALSE
  20.                 TDBCombo::reloadFromModel(self::$formName, 'ar_item_ar_cod_area', TSession::getValue('pConfig'), 'TArea', 'cod_area', '{cod_area} - {area}', 'area', $criteria);
  21.             }
  22.             else
  23.             {
  24.                 TCombo::clearField(self::$formName, 'ar_item_ar_cod_area');
  25.             }
  26.             
  27.             TTransaction::close();
  28.         }
  29.         catch (Exception $e)
  30.         {
  31.             new TMessage('error', $e->getMessage());
  32.         }
  33.     }
  34. public function onSave($param = null)
  35.     {
  36.         try
  37.         {
  38.             TTransaction::open($this->database);
  39.             $messageAction = null;
  40.             $this->form->validate();
  41.             $object = new TCCusto();
  42.             $data = $this->form->getData();
  43.             $object->fromArray( (array) $data);
  44.             $object->store();
  45.             $ar_item_ar_items = $this->storeItems('TCCustoArea', 'cod_ccusto', $object, 'ar_item_ar',
  46.                 function($masterObject, $detailObject){}
  47.             );
  48.             $data->cod_ccusto = $object->cod_ccusto;
  49.             $this->form->setData($data);
  50.             $this->fireEvents( $object );
  51.             TTransaction::close();
  52.             new TMessage('info', AdiantiCoreTranslator::translate('Record saved'), $messageAction);
  53.         }
  54.         catch (Exception $e)
  55.         {
  56.             new TMessage('error', $e->getMessage());
  57.             $this->form->setData( $this->form->getData() );
  58.             TTransaction::rollback();
  59.         }
  60.     }
  61.     public function onEdit( $param )
  62.     {
  63.         try
  64.         {
  65.             if (isset($param['key']))
  66.             {
  67.                 $key = $param['key'];
  68.                 TTransaction::open(TSession::getValue('pConfig'));
  69.                 $object = new TCCusto($key);
  70.                 $ar_item_ar_items = $this->loadItems('TCCustoArea', 'cod_ccusto', $object, 'ar_item_ar',
  71.                 function($masterObject, $detailObject){}
  72.                 );
  73.                 
  74.                 $this->form->setData($object); 
  75.                 $this->onReload();
  76.                 TTransaction::close();
  77.                 $this->fireEvents( $object );
  78.             }
  79.             else
  80.             {
  81.                 $this->form->clear();
  82.             }
  83.         }
  84.         catch (Exception $e)
  85.         {
  86.             new TMessage('error', $e->getMessage()); 
  87.             TTransaction::rollback(); 
  88.         }
  89.     }
  90. ?>


Ele está dando erro de ficar dando reload tipo de 2 em 2 segundos, e então não dá para selecionar a área. Pois ai, somente após ser selecionado uma filial, listará o combo das áreas, e após selecionar as áreas liberará o campo de sub-área, porém isso é posterior para ser feito.
Imagino eu que seja alguma besteira que esqueci de fazer, mas não estou conseguindo encontrar, se alguém puder tentar ajudar ficarei grato.

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (5)


NR

Não entendi, o programa fica em loop? Poste o resto do código do construtor
F

Deixa ver se consigo explicar, se eu fizer o mesmo código para atributos da tabela principal, dá tudo certinho, porém se eu eu tentar fazer o mesmo em aba detalhe, ele não deixa eu mudar no tdbcombo, fica em loop sim, ai por isso não estou entendendo, pois fiz em 3 class diferente na aba principal, e esse da aba de detalhe não está funcionando...

eu uso esse código no construtor também para chamar a função que faz o tdb funcionar somente se a filial estiver selecionada:
  1. <?php>$ar_item_ar_cod_area->setChangeAction( new TAction( array($this, 'onAreaChange' )) ); ?>
F

Dei uma resumida no codigo, está tudo aqui agora:
  1. <?php>class TPluvLocalForm extends TPage
  2. {
  3.     protected $form;
  4.     private $formFields = [];
  5.     private $database;
  6.     private static $activeRecord = 'TPluvLocal';
  7.     private static $primaryKey = 'cod_pluv_local';
  8.     private static $formName = 'form_TPluvLocal';
  9.     
  10.     use Adianti\Base\AdiantiMasterDetailTrait;
  11.     function __construct()
  12.     {
  13.         parent::__construct();
  14.         
  15.         $this->database = TSession::getValue('pConfig');
  16.         $this->form = new BootstrapFormBuilder(self::$formName);
  17.         $this->form->setFormTitle('AGR - Formulário de Pluviômetro');
  18.         $cod_pluv_local = new TEntry('cod_pluv_local');
  19.         $cod_prop  = new TDBCombo('cod_prop', $this->database, 'TProp', 'cod_prop', '{cod_prop} - {nome_prop}', 'nome_prop asc');
  20.         $cod_prop->enableSearch();
  21.         $filter = new TCriteria;
  22.         $filter->add(new TFilter('cod_fil', '<', '0'));
  23.         $cod_fil  = new TDBCombo('cod_fil', $this->database, 'TFilial', 'cod_fil', '{cod_fil} - {nome_fil}', 'nome_fil asc',$filter);
  24.         $cod_fil->enableSearch();
  25.        filter = new TCriteria;
  26.         $filter->add(new TFilter('cod_fil', '<', '0'));
  27.         $cod_fil  = new TDBCombo('cod_fil', $this->database, 'TFilial', 'cod_fil', '{cod_fil} - {nome_fil}', 'nome_fil asc',$filter);
  28.         $filter = new TCriteria;
  29.         $filter->add(new TFilter('cod_area', '<', '0'));
  30.         $cod_area  = new TDBCombo('cod_area', $this->database, 'TArea', 'cod_area', '{cod_area} - {area}', 'area asc');
  31.         $cod_sub_area  = new TDBCombo('cod_sub_area', $this->database, 'TAreaSub', 'cod_sub_area', '{cod_sub_area} - {sub_area}', 'sub_area asc');
  32.         $this->form->addFields( [ new TLabel('ID') ], [ $cod_pluv_local ]);
  33.         $this->form->addFields( [ new TLabel('Prop.') ], [ $cod_prop ], [ new TLabel('Filial') ], [ $cod_fil ] );
  34.         $this->form->addFields( [ new TLabel('Área') ], [ $cod_area ], [ new TLabel('Sub-Área') ], [ $cod_sub_area ] );
  35.         $cod_pluv_local->setEditable(FALSE);
  36.         
  37.         $cod_prop->setChangeAction( new TAction( array($this, 'onProprietarioChange' )) );
  38.         $cod_area->setChangeAction( new TAction( array($this, 'onAreaChange' )) );
  39.         $cod_sub_area->setChangeAction( new TAction( array($this, 'onAreaSubChange' )) );
  40.         $btn = $this->form->addAction(_t('Save'), new TAction([$this, 'onSave']), 'fa:floppy-o');
  41.         $btn->class = 'btn btn-sm btn-primary';
  42.         $this->form->addAction(_t('New'),  new TAction([$this, 'onEdit']), 'fa:eraser red');
  43.         $this->form->addAction( _t('List'), new TAction(array('TPluvLocalList','onReload')),  'fa:table blue' );
  44.         $container = new TVBox;
  45.         $container->style = 'width: 100%';
  46.         $container->class = 'form-container';
  47.         $container->add($this->form);
  48.         
  49.         parent::add($container);
  50.     }
  51.     public function fireEvents( $object )
  52.     {
  53.         $obj = new stdClass;
  54.         $obj->cod_prop     = $object->cod_prop;
  55.         $obj->cod_fil      = $object->cod_fil;
  56.         $obj->cod_area     = $object->cod_area;
  57.         $obj->cod_sub_area = $object->cod_sub_area;
  58.         TForm::sendData(self::$formName, $obj);
  59.     }
  60.     public static function onProprietarioChange($param)
  61.     {
  62.         try
  63.         {
  64.             TTransaction::open(TSession::getValue('pConfig'));
  65.             if (!empty($param['cod_prop']))
  66.             {
  67.                 $criteria = TCriteria::create( ['cod_prop' => $param['cod_prop'] ] );
  68.                 TDBCombo::reloadFromModel(self::$formName, 'cod_fil', TSession::getValue('pConfig'), 'TFilial', 'cod_fil', '{cod_fil} - {nome_fil}', 'nome_fil', $criteria);
  69.             }
  70.             else
  71.             {
  72.                 TCombo::clearField(self::$formName, 'cod_fil');
  73.             }
  74.             
  75.             TTransaction::close();
  76.         }
  77.         catch (Exception $e)
  78.         {
  79.             new TMessage('error', $e->getMessage());
  80.         }
  81.     }
  82.     public static function onAreaChange($param)
  83.     {
  84.         try
  85.         {
  86.             TTransaction::open(TSession::getValue('pConfig'));
  87.             if (!empty($param['cod_fil']))
  88.             {
  89.                 $criteria = TCriteria::create( ['cod_fil' => $param['cod_fil'] ] );
  90.                 TDBCombo::reloadFromModel(self::$formName, 'cod_area', TSession::getValue('pConfig'), 'TArea', 'cod_area', '{cod_area} - {area}', 'area', $criteria);
  91.             }
  92.             else
  93.             {
  94.                 TCombo::clearField(self::$formName, 'cod_area');
  95.             }
  96.             
  97.             TTransaction::close();
  98.         }
  99.         catch (Exception $e)
  100.         {
  101.             new TMessage('error', $e->getMessage());
  102.         }
  103.     }
  104.     public static function onAreaSubChange($param)
  105.     {
  106.         try
  107.         {
  108.             TTransaction::open(TSession::getValue('pConfig'));
  109.             if (!empty($param['cod_area']))
  110.             {
  111.                 $criteria = TCriteria::create( ['cod_area' => $param['cod_area'] ] );
  112.                 TDBCombo::reloadFromModel(self::$formName, 'cod_sub_area', TSession::getValue('pConfig'), 'TAreaSub', 'cod_sub_area', '{cod_sub_area} - {sub_area}', 'sub_area', $criteria);
  113.             }
  114.             else
  115.             {
  116.                 TCombo::clearField(self::$formName, 'cod_sub_area');
  117.             }
  118.             
  119.             TTransaction::close();
  120.         }
  121.         catch (Exception $e)
  122.         {
  123.             new TMessage('error', $e->getMessage());
  124.         }
  125.     }
  126.     public function onSave( $param )
  127.     {
  128.         try
  129.         {
  130.             TTransaction::open($this->database);
  131.             $data = $this->form->getData();
  132.             $this->form->validate();
  133.             
  134.             $object = new TPluvLocal;
  135.             $object->fromArray( (array) $data);
  136.             $object->store();
  137.             
  138.             $data->cod_pluv_local = $object->cod_pluv_local;
  139.             
  140.             $this->form->setData($data);
  141.             
  142.             $this->fireEvents( $object );
  143.             
  144.             TTransaction::close();
  145.             
  146.             new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  147.         }
  148.         catch (Exception $e)
  149.         {
  150.             new TMessage('error', $e->getMessage());
  151.             $this->form->setData( $this->form->getData() );
  152.             TTransaction::rollback();
  153.         }
  154.     }
  155.     public function onEdit( $param )
  156.     {
  157.         try
  158.         {   
  159.             if(isset($param['cod_pluv_local']))
  160.             {
  161.                 TTransaction::open(TSession::getValue('pConfig'));
  162.                 $tpluvlocal = new TPluvLocal($param['cod_pluv_local']);
  163.                 TTransaction::close();
  164.                 unset($tpluvlocal->cod_pluv_local);
  165.                 $this->form->setData($tpluvlocal);
  166.             }
  167.             if (isset($param['key']))
  168.             {
  169.                 $key = $param['key'];
  170.                 TTransaction::open($this->database);
  171.                 $object = new TPluvLocal($key);
  172.                 $this->form->setData($object); 
  173.                 TTransaction::close();
  174.                 
  175.                 $this->fireEvents( $object );
  176.             }
  177.             else
  178.             {
  179.                 $this->form->clear();
  180.             }
  181.         }
  182.         catch (Exception $e)
  183.         {
  184.             new TMessage('error', $e->getMessage());
  185.             TTransaction::rollback();
  186.         }
  187.     }
  188. }?>
NR

Testei seu código e rodou normal aqui. Só fiz um pequeno ajuste nas chamadas das exitAction:
  1. <?php
  2. //$cod_prop->setChangeAction( new TAction( array($this, 'onProprietarioChange' )) );
  3. //$cod_area->setChangeAction( new TAction( array($this, 'onAreaChange' )) );
  4. //$cod_sub_area->setChangeAction( new TAction( array($this, 'onAreaSubChange' )) );
  5. $cod_prop->setChangeAction( new TAction( array($this'onProprietarioChange' )) );
  6. $cod_fil->setChangeAction( new TAction( array($this'onAreaChange' )) );
  7. $cod_area->setChangeAction( new TAction( array($this'onAreaSubChange' )) );
  8. ?>

Você estava vinculando uma ação de saída(onAreaChange) ao campo $cod_area, e dentro da função onAreaChange estava verificando pelo campo cod_fil para preencher o próprio campo $cod_area. Imagino que o vínculo com onAreaChange deva ser com o campo $cod_fil, assim ao escolher uma filial o campo área será recarregado filtrando pela filial escolhida.
F

Nossa, verdade... Obrigado Nataniel, ajudou muito!
Resolvido.
Abraço.