Datagrid não está sendo populada quando vou editar um registro Pessoal preciso de um help. Criei um formulário onde no mesmo eu cadastro uma categoria e suas respectivas subcategorias em uma datagrid. Quando eu clico em salvar, salva com sucesso no banco e seta as informações no formulário. O problema está quando vou editar um registro! O campo ID e Categoria vem preenchidos, mas as subcategorias não traz... Vou enviar um print da tela e o códi...
RC
Datagrid não está sendo populada quando vou editar um registro  
Fechado
Pessoal preciso de um help.

Criei um formulário onde no mesmo eu cadastro uma categoria e suas respectivas subcategorias em uma datagrid.
Quando eu clico em salvar, salva com sucesso no banco e seta as informações no formulário. O problema está quando vou editar um registro! O campo ID e Categoria vem preenchidos, mas as subcategorias não traz...

Vou enviar um print da tela e o código fonte do método onEdit do formulário e o seu respectivo model.

Obs: Peguei este exemplo do controller SystemUserForm do template ERPII...

 
  1. <?php
  2. function onEdit($param) {
  3. try {
  4. if (isset($param['key'])) {
  5. // get the parameter $key
  6. $key = $param['key'];
  7. TTransaction::open('permission');
  8. $object = new Categoria($key);
  9. $object->programs = $object->getEstoqueCategoriaSubcategorias();
  10. //var_dump($object); die();
  11. $this->form->setData($object);
  12. // close the transaction
  13. TTransaction::close();
  14. } else {
  15. $this->form->clear();
  16. }
  17. } catch (Exception $e) {
  18. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  19. TTransaction::rollback();
  20. }
  21. }
  22. ?>


Model Categoria:
 
  1. <?php
  2. /**
  3. * Categoria Active Record
  4. * @author <Ricelli Carvalho>
  5. */
  6. class Categoria extends TRecord
  7. {
  8. const TABLENAME = 'estoque_categoria';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'max'; // {max, serial}
  11. private $estoque_categoria_subcategorias = array();
  12. public function __construct(1566 = NULL)
  13. {
  14. parent::__construct(1566);
  15. parent::addAttribute('respcadastro');
  16. parent::addAttribute('datacadastro');
  17. parent::addAttribute('respalteracao');
  18. parent::addAttribute('dataalteracao');
  19. parent::addAttribute('categoria');
  20. }
  21. public function addEstoqueCategoriaSubcategoria(Subcategoria $object)
  22. {
  23. //var_dump($object); die();
  24. $this->estoque_categoria_subcategorias[] = $object;
  25. }
  26. public function getEstoqueCategoriaSubcategorias()
  27. {
  28. return $this->estoque_categoria_subcategorias;
  29. }
  30. /**
  31. * Reset aggregates
  32. */
  33. public function clearParts()
  34. {
  35. $this->estoque_categoria_subcategorias = array();
  36. }
  37. /**
  38. * Load the object and its aggregates
  39. * @param 1566 object ID
  40. */
  41. public function load(1566)
  42. {
  43. // load the related System_user_program objects
  44. $repository = new TRepository('CategoriaSubcategoria');
  45. $criteria = new TCriteria;
  46. $criteria->add(new TFilter('estoque_categoria_id', '=', 1566));
  47. //$system_user_system_user_programs = $repository->load($criteria);
  48. $estoque_categoria_estoque_categoria_subcategorias = $repository->load($criteria);
  49. if ($estoque_categoria_estoque_categoria_subcategorias)
  50. {
  51. foreach ($estoque_categoria_estoque_categoria_subcategorias as $estoque_categoria_estoque_categoria_subcategoria)
  52. {
  53. $estoque_categoria_subcategoria = new Subcategoria( $estoque_categoria_estoque_categoria_subcategoria->system_program_id );
  54. $this->addEstoqueCategoriaSubcategoria($estoque_categoria_subcategoria);
  55. }
  56. }
  57. // load the object itself
  58. return parent::load(1566);
  59. }
  60. /**
  61. * Store the object and its aggregates
  62. */
  63. public function store()
  64. {
  65. // store the object itself
  66. parent::store();
  67. $criteria = new TCriteria;
  68. $criteria->add(new TFilter('estoque_categoria_id', '=', $this->id));
  69. $repository = new TRepository('CategoriaSubcategoria');
  70. $repository->delete($criteria);
  71. // store the related System_userSystem_user_program objects
  72. if ($this->estoque_categoria_subcategorias)
  73. {
  74. foreach ($this->estoque_categoria_subcategorias as $estoque_categoria_subcategoria)
  75. {
  76. $estoque_categoria_estoque_categoria_subcategoria = new CategoriaSubcategoria;
  77. $estoque_categoria_estoque_categoria_subcategoria->estoque_subcategoria_id = $estoque_categoria_subcategoria->id;
  78. $estoque_categoria_estoque_categoria_subcategoria->estoque_categoria_id = $this->id;
  79. $estoque_categoria_estoque_categoria_subcategoria->store();
  80. }
  81. }
  82. }
  83. /**
  84. * Delete the object and its aggregates
  85. * @param 1566 object ID
  86. */
  87. public function delete(1566 = NULL)
  88. {
  89. // delete the related System_userSystem_user_program objects
  90. 1566 = isset(1566) ? 1566 : $this->id;
  91. $repository = new TRepository('CategoriaSubcategoria');
  92. $criteria = new TCriteria;
  93. $criteria->add(new TFilter('estoque_categoria_id', '=', 1566));
  94. $repository->delete($criteria);
  95. // delete the object itself
  96. parent::delete(1566);
  97. }
  98. /**
  99. * Return the programs the user has permission to run
  100. */
  101. public function getPrograms()
  102. {
  103. $subcategorias = array();
  104. foreach( $this->getEstoqueCategoriaSubcategorias() as $subc )
  105. {
  106. $subcategorias[$subc->subcategoria] = true;
  107. }
  108. return $subcategorias;
  109. }
  110. }
  111. ?>

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


FC

Oi Ricelli

Não é datagrid é multifield poste o código de sua classe control, no model falta o private $subcategorias = array();
RC

Obrigado Felipe Cortez, pela disposição em querer ajudar-me a solucionar esse problema.

Vou postar logo abaixo o código da minha classe control.

Você falou que no meu model Categoria falta o
private $subcategorias = array();
. Em que lugar do model devo colocar esse código. E onde o mesmo será utilizado, não entendi?

Classe control: CategoriaFormView

 
  1. <?php
  2. /**
  3. * CategoriaFormView Control
  4. * @author <Ricelli M. Carvalho>
  5. */
  6. class CategoriaFormView extends TPage {
  7. protected $form;
  8. function __construct() {
  9. parent::__construct();
  10. $this->form = new TForm('form_Categoria');
  11. $this->form->class = 'tform';
  12. $table = new TTable;
  13. $table->style = 'width: 100%';
  14. $table->addRowSet(new TLabel('Categorias'), '', '', '')->class = 'tformtitle';
  15. $this->form->add($table);
  16. $frame_programs = new TFrame(NULL, 280);
  17. $frame_programs->setLegend('Subcategorias');
  18. $frame_programs->style .= ';margin: 15px';
  19. // create the form fields
  20. $id = new TEntry('id');
  21. $categoria = new TEntry('categoria');
  22. $multifield_programs = new TMultiField('programs');
  23. $program_id = new ">TDBSeekButton('program_id', 'permission', 'form_Categoria', 'Subcategoria', 'subcategoria', 'programs_id', 'programs_name');
  24. $program_name = new TEntry('program_name');
  25. $scroll = new TScroll;
  26. $scroll->setSize(290, 230);
  27. //$scroll->add( $groups );
  28. $frame_programs->add($multifield_programs);
  29. // define the sizes
  30. $id->setSize(100);
  31. $categoria->setSize(200);
  32. $multifield_programs->setHeight(140);
  33. // outros
  34. $id->setEditable(false);
  35. $program_name->setEditable(false);
  36. // validations
  37. $categoria->addValidation('categoria', new TRequiredValidator);
  38. $program_id->setSize(50);
  39. $program_name->setSize(300);
  40. // configuracoes multifield
  41. $multifield_programs->setClass('Subcategoria');
  42. $multifield_programs->addField('id', 'ID', $program_id, 60);
  43. $multifield_programs->addField('name', 'Subcategoria', $program_name, 380);
  44. $multifield_programs->setOrientation('horizontal');
  45. // add a row for the field id
  46. $table->addRowSet(new TLabel('ID:'), $id);
  47. $table->addRowSet(new TLabel('Categoria' . ': '), $categoria);
  48. $row = $table->addRow();
  49. $cell = $row->addCell($frame_programs);
  50. $cell->colspan = 2;
  51. // create an action button (save)
  52. $save_button = new TButton('save');
  53. $save_button->setAction(new TAction(array($this, 'onSave')), _t('Save'));
  54. $save_button->setImage('ico_save.png');
  55. // create an new button (edit with no parameters)
  56. $new_button = new TButton('new');
  57. $new_button->setAction(new TAction(array($this, 'onEdit')), _t('New'));
  58. $new_button->setImage('ico_new.png');
  59. $list_button = new TButton('list');
  60. $list_button->setAction(new TAction(array('CategoriaDataGrid', 'onReload')), _t('Back to the listing'));
  61. $list_button->setImage('ico_datagrid.png');
  62. // define the form fields
  63. $this->form->setFields(array($id, $categoria, $multifield_programs, $save_button, $new_button, $list_button));
  64. $buttons = new THBox;
  65. $buttons->add($save_button);
  66. $buttons->add($new_button);
  67. $buttons->add($list_button);
  68. $row = $table->addRow();
  69. $row->class = 'tformaction';
  70. $cell = $row->addCell($buttons);
  71. $cell->colspan = 4;
  72. $container = new TTable;
  73. $container->style = 'width: 80%';
  74. $container->addRow()->addCell(new TXMLBreadCrumb('menu.xml', 'CategoriaDataGrid'));
  75. $container->addRow()->addCell($this->form);
  76. // add the form to the page
  77. parent::add($container);
  78. }
  79. function onSave() {
  80. try {
  81. TTransaction::open('permission');
  82. $object = $this->form->getData('Categoria');
  83. $this->form->validate();
  84. if ($object->id) {
  85. $object->respalteracao = TSession::getValue('username');
  86. $object->dataalteracao = date("Y-m-d");
  87. } else {
  88. $object->datacadastro = date("Y-m-d");
  89. $object->respcadastro = TSession::getValue('username');
  90. $object->respalteracao = TSession::getValue('username');
  91. $object->dataalteracao = date("Y-m-d");
  92. }
  93. if ($object->programs) {
  94. foreach ($object->programs as $program) {
  95. //var_dump($program); die();
  96. $object->addEstoqueCategoriaSubcategoria($program);
  97. }
  98. } else {
  99. var_dump("Não entrou!");
  100. die();
  101. }
  102. $object->store();
  103. $this->form->setData($object);
  104. TTransaction::close();
  105. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  106. } catch (Exception $e) {
  107. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  108. TTransaction::rollback();
  109. }
  110. }
  111. function onEdit($param) {
  112. try {
  113. if (isset($param['key'])) {
  114. $key = $param['key'];
  115. TTransaction::open('permission');
  116. $object = new Categoria($key);
  117. $object->programs = $object->getEstoqueCategoriaSubcategorias();
  118. $this->form->setData($object);
  119. TTransaction::close();
  120. } else {
  121. $this->form->clear();
  122. }
  123. } catch (Exception $e) {
  124. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  125. TTransaction::rollback();
  126. }
  127. }
  128. }
  129. ?>


Vou postar também o model CategoriaSubcategoria, que faz a relação entre a tabela Categoria e subcategoria:
 
  1. <?php
  2. /**
  3. * CategoriaSubcategoria Active Record
  4. * @author <Ricelli Carvalho>
  5. */
  6. class CategoriaSubcategoria extends TRecord
  7. {
  8. const TABLENAME = 'estoque_categoria_subcategoria';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'max'; // {max, serial}
  11. public function __construct($id = NULL)
  12. {
  13. parent::__construct($id);
  14. parent::addAttribute('estoque_categoria_id');
  15. parent::addAttribute('estoque_subcategoria_id');
  16. }
  17. }
  18. ?>
</Ricelli></Ricelli>
RC

Já reescrevi tudo novamente, bati de todo lado e não encontrei o que está faltando para carregar os dados no multifield! Me ajudem ai pessoal, a solucionar este problema...
PD

Deve ser o nome dos atributos que não batem, veja esse exemplo:
www.adianti.com.br/framework_files/tutor/index.php?class=CustomerFor