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


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.

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