Problema com TMultiField Boa tarde, estou utilizando o TMultiField porém não estou conseguindo trazer os dados na hora de editar! Os mesmos são salvos normalmente no banco de dados, porém na hora de editar não estão sendo retornados. Vou enviar o print da tela de cadastro e da edição! E abaixo segue o código fonte da classe control e do model... Classe control: CategoriaFormView ...
RC
Problema com TMultiField  
Fechado
Boa tarde, estou utilizando o TMultiField porém não estou conseguindo trazer os dados na hora de editar! Os mesmos são salvos normalmente no banco de dados, porém na hora de editar não estão sendo retornados.

Vou enviar o print da tela de cadastro e da edição! E abaixo segue o código fonte da classe control e do model...

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. 1584 = 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. 1584->setSize(100);
  31. $categoria->setSize(200);
  32. $multifield_programs->setHeight(140);
  33. // outros
  34. 1584->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:'), 1584);
  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(1584, $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', 'CategoriaFormView'));
  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. ?>


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


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(1584 = NULL)
  12. {
  13. parent::__construct(1584);
  14. parent::addAttribute('estoque_categoria_id');
  15. parent::addAttribute('estoque_subcategoria_id');
  16. }
  17. }
  18. ?>

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


FC

no onEdit de um var_dump($object->programs) abaixo dessa linha e veja se está vindo o resultado, senão vier os dados confira a função getEstoqueCategoriaSubcategorias o erro deve estar por ai.

$object->programs = $object->getEstoqueCategoriaSubcategorias();
RC

Testei com o var_dump mas só vem estas informações:
array (size=2) 0 => object(Subcategoria)[133] protected 'data' => null protected 'attributes' => array (size=5) 0 => string 'subcategoria' (length=12) 1 => string 'respcadastro' (length=12) 2 => string 'datacadastro' (length=12) 3 => string 'respalteracao' (length=13) 4 => string 'dataalteracao' (length=13) 1 => object(Subcategoria)[123] protected 'data' => null protected 'attributes' => array (size=5) 0 => string 'subcategoria' (length=12) 1 => string 'respcadastro' (length=12) 2 => string 'datacadastro' (length=12) 3 => string 'respalteracao' (length=13) 4 => string 'dataalteracao' (length=13)
PD

Os nomes dos campos da multifield (program_id, program_name) são diferentes no momento da criação dos objetos e no momento de adicionar eles na multifield. Além disso, não batem com os nomes dos atributos que vem do banco (subcategoria, respcadastro)...

Att,
RC

Olá Pablo, não consegui pegar bem sua idéia... De tanto bater aqui e não sair nada vou postar o meu projeto pra se puderem rodar o mesmo e tentar me ajudar a solucionar esse problema que já bato a 1 semana, rsrs...

Obs: estou usando o banco sqlite e o usuario: ricelli e a senha: ricelli

Link do projeto: https://drive.google.com/folderview?id=0B0fuS6eGJnDwb3VrbXpnclJPX1U&usp=sharing

RC

Socorro gente!!! Alguém me ajuda por favor resolver essa bronca! Ainda estou engatinhando no framework. Não estou conseguindo ver aonde está o erro. Já testei a função getEstoqueCategoriaSubcategorias mas ainda assim não carrega os dados!
FC

Oi Ricelli

Os nomes dos objetos estão diferente por isso está com erro.

Esses objetos estão retornando
0 => string 'subcategoria' (length=12)
1 => string 'respcadastro' (length=12)
2 => string 'datacadastro' (length=12)
3 => string 'respalteracao' (length=13)
4 => string 'dataalteracao' (length=13)

e vc tem os nomes dos campos do multifield diferentes
Ex:

$program_name = new TEntry('program_name');

Altere para
$program_name = new TEntry('respcadastro');


RC

Olá Felipe Cortez e Pablo, muito obrigado pelas informações que vocês passaram, pois consegui fazer com que os dados fossem carregados na datagrid do TMultiField na hora da edição!!!

Só que surgiu um outro probleminha que antes funcionava: Quando eu clico no TDBSeekButton pra trazer a subcategoria o mesmo só preenche o campo ID, o campo subcategoria não preenche...

Como seria a forma correta de utilização dele? Os parâmetros corretos.