Master/detail não editando os registros do detail Boa noite galera!!! Estou com um problema aqui (até pensei que tinha feito algo errado mas criei o projeto duas vezes e o erro persiste), os meus formulários (mestre/detalhe) não edita os objetos detalhe, na hora de buscar o objeto pelo ID, fala que não foi encontrado dados, para gravar novos funciona, o erro é somente no update. Uso banco de dados SQLServer 2008 express. Alguém já passo...
BI
Master/detail não editando os registros do detail  
Fechado
Boa noite galera!!!

Estou com um problema aqui (até pensei que tinha feito algo errado mas criei o projeto duas vezes e o erro persiste), os meus formulários (mestre/detalhe) não edita os objetos detalhe, na hora de buscar o objeto pelo ID, fala que não foi encontrado dados, para gravar novos funciona, o erro é somente no update. Uso banco de dados SQLServer 2008 express. Alguém já passou por esse problema? pode me ajudar?

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

O erro ocorre quando seleciona o item pra edição ou na hora de salvar a edição?
Poste o código
BI

O erro é ao selecionar o item para salvar a edição, ele apaga o objeto antes de buscar.
erro (Object 1 not found in limites_op).

o código foi criado pelo adianti profissional.

 
  1. <?php
  2. public function onSave()
  3. {
  4. try
  5. {
  6. // open a transaction with database
  7. TTransaction::open('CIO');
  8. $data = $this->form->getData();
  9. $master = new EmpreendimentoCio;
  10. $master->fromArray( (array) $data);
  11. $this->form->validate(); // form validation
  12. $master->store(); // save master object
  13. // delete details
  14. $old_items = LimitesOp::where('empreendimento_id', '=', $master->id)->load();
  15. $keep_items = array();
  16. // get session items
  17. $items = TSession::getValue(__CLASS__.'_items');
  18. TTransaction::close();
  19. if( $items )
  20. {
  21. foreach( $items as $item )
  22. {
  23. TTransaction::open('CIO');
  24. if (substr($item['id'],0,1) == 'X' ) // new record
  25. {
  26. $detail = new LimitesOp;
  27. }
  28. else
  29. {
  30. //onde ocorre o erro
  31. $detail = new LimitesOp($item['id']);
  32. }
  33. $detail->parametro = $item['parametro'];
  34. $detail->valorMin = $item['valorMin'];
  35. $detail->valorMax = $item['valorMax'];
  36. $detail->valorIdeal = $item['valorIdeal'];
  37. $detail->outros = $item['outros'];
  38. $detail->empreendimento_id = $master->id;
  39. $detail->store();
  40. $keep_items[] = $detail->id;
  41. TTransaction::close();
  42. }
  43. }
  44. if ($old_items)
  45. {
  46. foreach ($old_items as $old_item)
  47. {
  48. if (!in_array( $old_item->id, $keep_items))
  49. {
  50. $old_item->delete();
  51. }
  52. }
  53. }
  54. TTransaction::close(); // close the transaction
  55. // reload form and session items
  56. $this->onEdit(array('key'=>$master->id));
  57. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  58. }
  59. catch (Exception $e) // in case of exception
  60. {
  61. new TMessage('error', $e->getMessage());
  62. $this->form->setData( $this->form->getData() ); // keep form data
  63. TTransaction::rollback();
  64. }
  65. }
  66. ?>
NR

Tente o seguinte:
 
  1. <?php
  2. if (substr($item['id'],0,1) == 'X' ) // new record
  3. {
  4. $detail = new LimitesOp;
  5. }
  6. else
  7. {
  8. //onde ocorre o erro
  9. $detail = new LimitesOp;
  10. $detail->fromArray($item);
  11. }
  12. /* fromArray ja faz isso
  13. $detail->parametro = $item['parametro'];
  14. $detail->valorMin = $item['valorMin'];
  15. $detail->valorMax = $item['valorMax'];
  16. $detail->valorIdeal = $item['valorIdeal'];
  17. $detail->outros = $item['outros'];
  18. */
  19. $detail->empreendimento_id = $master->id;
  20. $detail->store();
  21. ?>
BI

Boa noite!
Deu certo o código, obrigado!
NC

Olá, estava com este mesmo problema.
Após criar o formulário mestre/detalhe com o Studio, resolvi utilizando as informações que o Nataniel informou.
Entretanto só consigo adicionar até o terceiro registro, aparece a mensagem que o "registro foi salvo ".
Mas no banco de dados da tabela referente ao registro de detalhe, todos os campos ficam gravados com NULL.

Segue meu código

 
  1. <?php
  2. class ClienteForm extends TPage
  3. {
  4. protected $form; // form
  5. protected $formFields;
  6. protected $detail_list;
  7. /**
  8. * Page constructor
  9. */
  10. public function __construct()
  11. {
  12. parent::__construct();
  13. // creates the form
  14. $this->form = new TForm('form_Cliente');
  15. $this->form->class = 'tform'; // CSS class
  16. $this->form->style = 'max-width:1000px'; // style
  17. parent::include_css('app/resources/custom-frame.css');
  18. $table_master = new TTable;
  19. $table_master->width = '120%';
  20. $table_master->addRowSet( new TLabel('Tomador - Serviço'), '', '')->class = 'tformtitle';
  21. // add a table inside form
  22. $table_general = new TTable;
  23. $table_detail = new TTable;
  24. $table_financeiro = new TTable;
  25. $table_general-> width = '100%';
  26. $table_detail-> width = '100%';
  27. $table_financeiro-> width = '100%';
  28. $frame_general = new TFrame;
  29. $frame_general->setLegend('Informações Básicas');
  30. $frame_general->style = 'background:whiteSmoke';
  31. $frame_general->add($table_general);
  32. $frame_general->add($table_financeiro);
  33. $table_master->addRow()->addCell( $frame_general )->colspan=2;
  34. $row = $table_master->addRow();
  35. $row->addCell( $table_detail );
  36. /*
  37. $row = $this->form->addRow();
  38. $row->class = 'tformsection';
  39. $cell = $row->addCell( new TLabel('Division'));
  40. $cell->colspan = 2;
  41. $cell->style = 'height:30px; border-top: 1px solid gray;';
  42. */
  43. $this->form->add($table_master);
  44. // master fields
  45. $id = new TEntry('id');
  46. $advogado_id = new TSeekButton('advogado_id');
  47. $advogado_adv_nome = new TEntry('advogado_adv_nome');
  48. $indicacao_id = new TSeekButton('indicacao_id');
  49. $indicacao_ind_nome = new TEntry('indicacao_ind_nome');
  50. $cidade_id = new TDBCombo('cidade_id', 'systemlaudo', 'Cidade', 'id', 'cidade');
  51. $cli_nome = new TEntry('cli_nome');
  52. $cli_cnpj = new TEntry('cli_cnpj');
  53. $cli_logradouro = new TEntry('cli_logradouro');
  54. $cli_bairro = new TEntry('cli_bairro');
  55. $cli_complemento = new TEntry('cli_complemento');
  56. $cli_cep = new TEntry('cli_cep');
  57. $cli_envio_nf = new TCombo('cli_envio_nf');
  58. $cli_dia_nf = new TEntry('cli_dia_nf');
  59. $cli_envio_boleto = new TCombo('cli_envio_boleto');
  60. $cli_dia_boleto = new TEntry('cli_dia_boleto');
  61. $cli_valor = new TEntry('cli_valor');
  62. $cli_obs = new TText('cli_obs');
  63. $cli_indice = new TEntry('cli_indice');
  64. $cli_contrato_inicio = new TDate('cli_contrato_inicio');
  65. $cli_contrato_final = new TDate('cli_contrato_final');
  66. $indicacao_id->setAction(new TAction(array('IndicacaoSeek', 'onReload')));
  67. $advogado_id->setAction(new TAction(array('AdvogadoSeek', 'onReload')));
  68. // set TCombo
  69. $cli_envio_nf->addItems( [ 'Não' => 'Não Enviar NF', 'Sim' => 'Enviar NF' ] );
  70. $cli_envio_boleto->addItems( [ 'Não' => 'Não Enviar Boleto', 'Sim' => 'Enviar Boleto' ] );
  71. // set fields
  72. $advogado_adv_nome->setEditable(FALSE);
  73. $indicacao_ind_nome->setEditable(FALSE);
  74. $cli_nome->placeholder = 'Razão Social - Obrigatório';
  75. $cli_cnpj->setMask('99.999.999/9999-99');
  76. $cli_cnpj->placeholder = 'Somente Números';
  77. $cli_cep->setMask('99999-999');
  78. $cli_cep->placeholder = 'Somente Números';
  79. $cli_contrato_inicio->setMask('dd/mm/yyyy');
  80. $cli_contrato_inicio->setDatabaseMask('yyyy-mm-dd');
  81. $cli_contrato_final->setMask('dd/mm/yyyy');
  82. $cli_contrato_final->setDatabaseMask('yyyy-mm-dd');
  83. $cli_valor->setNumericMask(2, ',', '.', true);
  84. $advogado_adv_nome->setSize(250);
  85. $cli_cnpj->setSize(250);
  86. $indicacao_ind_nome->setSize(250);
  87. $cli_nome->setSize(300);
  88. $cli_logradouro->setSize(250);
  89. $cli_complemento->setSize(250);
  90. $cli_envio_nf->setSize(250);
  91. $cli_envio_boleto->setSize(250);
  92. $cli_obs->setSize(500, 200);
  93. if (!empty($id))
  94. {
  95. $id->setEditable(FALSE);
  96. }
  97. // detail fields
  98. $detail_id = new THidden('detail_id');
  99. $detail_cidade_id = new TDBCombo('detail_cidade_id', 'systemlaudo', 'Cidade', 'id', 'cidade');
  100. $detail_rec_nome = new TEntry('detail_rec_nome');
  101. $detail_rec_email = new TEntry('detail_rec_email');
  102. $detail_rec_contato = new TEntry('detail_rec_contato');
  103. $detail_rec_funcao = new TEntry('detail_rec_funcao');
  104. $detail_rec_logradouro = new TEntry('detail_rec_logradouro');
  105. $detail_rec_complemento = new TEntry('detail_rec_complemento');
  106. $detail_rec_bairro = new TEntry('detail_rec_bairro');
  107. /** samples
  108. $this->form->addQuickFields('Date', array($date1, new TLabel('to'), $date2)); // side by side fields
  109. $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
  110. $fieldX->setSize( 100, 40 ); // set size
  111. **/
  112. // set fields
  113. $lab_nome = new TLabel('Razão Social');
  114. $lab_cnpj = new TLabel('CNPJ');
  115. $lab_advogado = new TLabel('Advogado');
  116. $lab_adv_nome = new TLabel('Nome - Advogado');
  117. $lab_indicacao = new TLabel('Indicação');
  118. $lab_ind_nome = new TLabel('Nome - Indicação');;
  119. $cidade_id = new TDBCombo('cidade_id', 'systemlaudo', 'Cidade', 'id', 'cidade');
  120. $lab_cidade = new TLabel('Cidade');
  121. $lab_logradouro = new TLabel('Logradouro');
  122. $lab_bairro = new TLabel('Bairro');
  123. $lab_complemento = new TLabel('Complemento');
  124. $lab_cli_envio_nf = new TLabel('Enviar NF');
  125. $lab_cli_dia_nf = new TLabel('Dia NF');
  126. $lab_cli_envio_boleto = new TLabel('Enviar Boleto');
  127. $lab_cli_dia_boleto = new TLabel('Dia Boleto');
  128. $lab_cli_valor = new TLabel('Valor - Contrato');
  129. $lab_cli_indice = new TLabel('Índice - Reajuste');
  130. $lab_cli_contrato_inicio = new TLabel('Contrato - Início');
  131. $lab_cli_contrato_final = new TLabel('Contrato - Final');
  132. // master
  133. $table_general->addRowSet( new TLabel('Id'), $id );
  134. $table_general->addRowSet($lab_nome, $cli_nome, $lab_cnpj, $cli_cnpj );
  135. $table_general->addRowSet($lab_advogado, $advogado_id, $lab_adv_nome, $advogado_adv_nome );
  136. $table_general->addRowSet($lab_indicacao, $indicacao_id, $lab_ind_nome, $indicacao_ind_nome );
  137. $table_general->addRowSet($lab_cidade, $cidade_id, $lab_logradouro, $cli_logradouro );
  138. $table_general->addRowSet( $lab_bairro, $cli_bairro, $lab_complemento, $cli_complemento );
  139. $table_general->addRowSet( new TLabel('Cep'), $cli_cep );
  140. // master / financeiro
  141. $frame_financeiro = new TFrame();
  142. $frame_financeiro->setLegend('Dados Financeiros');
  143. $row = $table_financeiro->addRow();
  144. $row->addCell($frame_financeiro);
  145. $table_financeiro = new TTable;
  146. $frame_financeiro->add($table_financeiro);
  147. $table_financeiro->addRowSet( $lab_cli_envio_nf, $cli_envio_nf, $lab_cli_dia_nf, $cli_dia_nf );
  148. $table_financeiro->addRowSet( $lab_cli_envio_boleto, $cli_envio_boleto, $lab_cli_dia_boleto, $cli_dia_boleto);
  149. $table_financeiro->addRowSet( $lab_cli_valor, $cli_valor, $lab_cli_indice, $cli_indice );
  150. $table_financeiro->addRowSet( $lab_cli_contrato_inicio, $cli_contrato_inicio, $lab_cli_contrato_final, $cli_contrato_final);
  151. $table_financeiro->addRowSet( new TLabel('Observações'), $cli_obs );;
  152. // detail
  153. $frame_details = new TFrame();
  154. $frame_details->setLegend('Reclamada - Parceiros');
  155. $row = $table_detail->addRow();
  156. $row->addCell($frame_details);
  157. $btn_save_detail = new TButton('btn_save_detail');
  158. $btn_save_detail->setAction(new TAction(array($this, 'onSaveDetail')), 'Register');
  159. $btn_save_detail->setImage('fa:save');
  160. $table_details = new TTable;
  161. $frame_details->add($table_details);
  162. $rec_lab_razao = new TLabel('Razão Social');
  163. $rec_lab_contato = new TLabel('Contato');
  164. $rec_lab_email = new TLabel('E-mail');
  165. $rec_lab_funcao = new TLabel('Função');
  166. $rec_lab_logradouro = new TLabel('Logradouro');
  167. $rec_lab_complemento = new TLabel('Complemento');
  168. $rec_lab_bairro = new TLabel('Bairro');
  169. $rec_lab_cidade = new TLabel('Cidade');
  170. $table_details->addRowSet( '', $detail_id );
  171. $table_details->addRowSet($rec_lab_razao, $detail_rec_nome );
  172. $table_details->addRowSet($rec_lab_contato, $detail_rec_contato , $rec_lab_email, $detail_rec_email );
  173. $table_details->addRowSet( $rec_lab_funcao, $detail_rec_funcao );
  174. $table_details->addRowSet( $rec_lab_logradouro, $detail_rec_logradouro, $rec_lab_cidade, $detail_cidade_id );
  175. $table_details->addRowSet( $rec_lab_complemento, $detail_rec_complemento, $rec_lab_bairro, $detail_rec_bairro);
  176. $table_details->addRowSet( $btn_save_detail );
  177. $this->detail_list = new TQuickGrid;
  178. $this->detail_list->setHeight( 175 );
  179. $this->detail_list->makeScrollable();
  180. $this->detail_list->disableDefaultClick();
  181. $this->detail_list->addQuickColumn('', 'edit', 'left', 50);
  182. $this->detail_list->addQuickColumn('', 'delete', 'left', 50);
  183. // items
  184. $this->detail_list->addQuickColumn('Cidade', 'cidade_id', 'left', 150);
  185. $this->detail_list->addQuickColumn('Nome', 'rec_nome', 'left', 200);
  186. $this->detail_list->addQuickColumn('Contato', 'rec_contato', 'left', 200);
  187. $this->detail_list->addQuickColumn('E-mail', 'rec_email', 'left', 200);
  188. $this->detail_list->addQuickColumn('Função', 'rec_funcao', 'left', 200);
  189. $this->detail_list->addQuickColumn('Logradouro', 'rec_logradouro', 'left', 200);
  190. $this->detail_list->addQuickColumn('Complemento', 'rec_complemento', 'left', 200);
  191. $this->detail_list->addQuickColumn('Bairro', 'rec_bairro', 'left', 200);
  192. $this->detail_list->createModel();
  193. $row = $table_detail->addRow();
  194. $row->addCell($this->detail_list);
  195. // create an action button (save)
  196. $save_button=new TButton('save');
  197. $save_button->setAction(new TAction(array($this, 'onSave')), _t('Save'));
  198. $save_button->setImage('ico_save.png');
  199. // create an new button (edit with no parameters)
  200. $new_button=new TButton('new');
  201. $new_button->setAction(new TAction(array($this, 'onClear')), _t('New'));
  202. $new_button->setImage('ico_new.png');
  203. // define form fields
  204. $this->formFields = array($id,$advogado_id,$indicacao_id,$cidade_id,$cli_nome,$cli_cnpj,$cli_logradouro,$cli_bairro,$cli_complemento,$cli_cep,$cli_envio_nf,$cli_dia_nf,$cli_envio_boleto,$cli_dia_boleto,$cli_valor,$cli_obs,$cli_indice,$cli_contrato_inicio,$cli_contrato_final,$detail_cidade_id,$detail_rec_nome,$detail_rec_email,$detail_rec_contato,$detail_rec_funcao,$detail_rec_logradouro,$detail_rec_complemento,$detail_rec_bairro);
  205. $this->formFields[] = $btn_save_detail;
  206. $this->formFields[] = $save_button;
  207. $this->formFields[] = $new_button;
  208. $this->formFields[] = $detail_id;
  209. $this->form->setFields( $this->formFields );
  210. $table_master->addRowSet( array($save_button, $new_button), '', '')->class = 'tformaction'; // CSS class
  211. // create the page container
  212. $container = new TVBox;
  213. $container->style = 'width: 90%';
  214. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  215. $container->add($this->form);
  216. parent::add($container);
  217. }
  218. /**
  219. * Clear form
  220. * @param $param URL parameters
  221. */
  222. public function onClear($param)
  223. {
  224. $this->form->clear(TRUE);
  225. TSession::setValue(__CLASS__.'_items', array());
  226. $this->onReload( $param );
  227. }
  228. /**
  229. * Save an item from form to session list
  230. * @param $param URL parameters
  231. */
  232. public function onSaveDetail( $param )
  233. {
  234. try
  235. {
  236. TTransaction::open('systemlaudo');
  237. $data = $this->form->getData();
  238. /** validation sample
  239. if (! $data->fieldX)
  240. throw new Exception('The field fieldX is required');
  241. **/
  242. $items = TSession::getValue(__CLASS__.'_items');
  243. $key = empty($data->detail_id) ? 'X'.mt_rand(1000000000, 1999999999) : $data->detail_id;
  244. $items[ $key ] = array();
  245. $items[ $key ]['id'] = $key;
  246. $items[ $key ]['cidade_id'] = $data->detail_cidade_id;
  247. $items[ $key ]['rec_nome'] = $data->detail_rec_nome;
  248. $items[ $key ]['rec_email'] = $data->detail_rec_email;
  249. $items[ $key ]['rec_contato'] = $data->detail_rec_contato;
  250. $items[ $key ]['rec_funcao'] = $data->detail_rec_funcao;
  251. $items[ $key ]['rec_logradouro'] = $data->detail_rec_logradouro;
  252. $items[ $key ]['rec_complemento'] = $data->detail_rec_complemento;
  253. $items[ $key ]['rec_bairro'] = $data->detail_rec_bairro;
  254. TSession::setValue(__CLASS__.'_items', $items);
  255. // clear detail form fields
  256. $data->detail_id = '';
  257. $data->detail_cidade_id = '';
  258. $data->detail_rec_nome = '';
  259. $data->detail_rec_email = '';
  260. $data->detail_rec_contato = '';
  261. $data->detail_rec_funcao = '';
  262. $data->detail_rec_logradouro = '';
  263. $data->detail_rec_complemento = '';
  264. $data->detail_rec_bairro = '';
  265. TTransaction::close();
  266. $this->form->setData($data);
  267. $this->onReload( $param ); // reload the items
  268. }
  269. catch (Exception $e)
  270. {
  271. $this->form->setData( $this->form->getData());
  272. new TMessage('error', $e->getMessage());
  273. }
  274. }
  275. /**
  276. * Load an item from session list to detail form
  277. * @param $param URL parameters
  278. */
  279. public function onEditDetail( $param )
  280. {
  281. $data = $this->form->getData();
  282. // read session items
  283. $items = TSession::getValue(__CLASS__.'_items');
  284. // get the session item
  285. $item = $items[ $param['item_key'] ];
  286. $data->detail_id = $item['id'];
  287. $data->detail_cidade_id = $item['cidade_id'];
  288. $data->detail_rec_nome = $item['rec_nome'];
  289. $data->detail_rec_email = $item['rec_email'];
  290. $data->detail_rec_contato = $item['rec_contato'];
  291. $data->detail_rec_funcao = $item['rec_funcao'];
  292. $data->detail_rec_logradouro = $item['rec_logradouro'];
  293. $data->detail_rec_complemento = $item['rec_complemento'];
  294. $data->detail_rec_bairro = $item['rec_bairro'];
  295. // fill detail fields
  296. $this->form->setData( $data );
  297. $this->onReload( $param );
  298. }
  299. /**
  300. * Delete an item from session list
  301. * @param $param URL parameters
  302. */
  303. public function onDeleteDetail( $param )
  304. {
  305. $data = $this->form->getData();
  306. // reset items
  307. $data->detail_cidade_id = '';
  308. $data->detail_rec_nome = '';
  309. $data->detail_rec_email = '';
  310. $data->detail_rec_contato = '';
  311. $data->detail_rec_funcao = '';
  312. $data->detail_rec_logradouro = '';
  313. $data->detail_rec_complemento = '';
  314. $data->detail_rec_bairro = '';
  315. // clear form data
  316. $this->form->setData( $data );
  317. // read session items
  318. $items = TSession::getValue(__CLASS__.'_items');
  319. // delete the item from session
  320. unset($items[ $param['item_key'] ] );
  321. TSession::setValue(__CLASS__.'_items', $items);
  322. // reload items
  323. $this->onReload( $param );
  324. }
  325. /**
  326. * Load the items list from session
  327. * @param $param URL parameters
  328. */
  329. public function onReload($param)
  330. {
  331. // read session items
  332. $items = TSession::getValue(__CLASS__.'_items');
  333. $this->detail_list->clear(); // clear detail list
  334. $data = $this->form->getData();
  335. if ($items)
  336. {
  337. $cont = 1;
  338. foreach ($items as $list_item_key => $list_item)
  339. {
  340. $item_name = 'prod_' . $cont++;
  341. $item = new StdClass;
  342. // create action buttons
  343. $action_del = new TAction(array($this, 'onDeleteDetail'));
  344. $action_del->setParameter('item_key', $list_item_key);
  345. $action_edi = new TAction(array($this, 'onEditDetail'));
  346. $action_edi->setParameter('item_key', $list_item_key);
  347. $button_del = new TButton('delete_detail'.$cont);
  348. $button_del->class = 'btn btn-default btn-sm';
  349. $button_del->setAction( $action_del, '' );
  350. $button_del->setImage('fa:trash-o red fa-lg');
  351. $button_edi = new TButton('edit_detail'.$cont);
  352. $button_edi->class = 'btn btn-default btn-sm';
  353. $button_edi->setAction( $action_edi, '' );
  354. $button_edi->setImage('fa:edit blue fa-lg');
  355. $item->edit = $button_edi;
  356. $item->delete = $button_del;
  357. $this->formFields[ $item_name.'_edit' ] = $item->edit;
  358. $this->formFields[ $item_name.'_delete' ] = $item->delete;
  359. // items
  360. $item->id = $list_item['id'];
  361. $item->cidade_id = $list_item['cidade_id'];
  362. $item->rec_nome = $list_item['rec_nome'];
  363. $item->rec_email = $list_item['rec_email'];
  364. $item->rec_contato = $list_item['rec_contato'];
  365. $item->rec_funcao = $list_item['rec_funcao'];
  366. $item->rec_logradouro = $list_item['rec_logradouro'];
  367. $item->rec_complemento = $list_item['rec_complemento'];
  368. $item->rec_bairro = $list_item['rec_bairro'];
  369. $row = $this->detail_list->addItem( $item );
  370. $row->onmouseover='';
  371. $row->onmouseout='';
  372. }
  373. $this->form->setFields( $this->formFields );
  374. }
  375. $this->loaded = TRUE;
  376. }
  377. /**
  378. * Load Master/Detail data from database to form/session
  379. */
  380. public function onEdit($param)
  381. {
  382. try
  383. {
  384. TTransaction::open('systemlaudo');
  385. if (isset($param['key']))
  386. {
  387. $key = $param['key'];
  388. $object = new Cliente($key);
  389. $items = Reclamada::where('cliente_id', '=', $key)->load();
  390. $session_items = array();
  391. foreach( $items as $item )
  392. {
  393. $item_key = $item->id;
  394. $session_items[$item_key] = $item->toArray();
  395. $session_items[$item_key]['id'] = $item->id;
  396. $session_items[$item_key]['cidade_id'] = $item->cidade_id;
  397. $session_items[$item_key]['rec_nome'] = $item->rec_nome;
  398. $session_items[$item_key]['rec_email'] = $item->rec_email;
  399. $session_items[$item_key]['rec_contato'] = $item->rec_contato;
  400. $session_items[$item_key]['rec_funcao'] = $item->rec_funcao;
  401. $session_items[$item_key]['rec_logradouro'] = $item->rec_logradouro;
  402. $session_items[$item_key]['rec_complemento'] = $item->rec_complemento;
  403. $session_items[$item_key]['rec_bairro'] = $item->rec_bairro;
  404. }
  405. TSession::setValue(__CLASS__.'_items', $session_items);
  406. $this->form->setData($object); // fill the form with the active record data
  407. $this->onReload( $param ); // reload items list
  408. TTransaction::close(); // close transaction
  409. }
  410. else
  411. {
  412. $this->form->clear(TRUE);
  413. TSession::setValue(__CLASS__.'_items', null);
  414. $this->onReload( $param );
  415. }
  416. }
  417. catch (Exception $e) // in case of exception
  418. {
  419. new TMessage('error', $e->getMessage());
  420. TTransaction::rollback();
  421. }
  422. }
  423. /**
  424. * Save the Master/Detail data from form/session to database
  425. */
  426. public function onSave()
  427. {
  428. try
  429. {
  430. // open a transaction with database
  431. TTransaction::open('systemlaudo');
  432. $data = $this->form->getData();
  433. $master = new Cliente;
  434. $master->fromArray( (array) $data);
  435. $this->form->validate(); // form validation
  436. $master->store(); // save master object
  437. // delete details
  438. $old_items = Reclamada::where('cliente_id', '=', $master->id)->load();
  439. $keep_items = array();
  440. // get session items
  441. $items = TSession::getValue(__CLASS__.'_items');
  442. if( $items )
  443. {
  444. foreach( $items as $item )
  445. {
  446. if (substr($item['id'],0,1) == 'X' ) // new record
  447. {
  448. $detail = new Reclamada;
  449. }
  450. else
  451. {
  452. //$detail = Reclamada::find($item['id']);
  453. $detail = new Reclamada;
  454. $detail->fromArray($item);
  455. }
  456. /*
  457. Com erros, formulário Mestre/Detalhe criando pelo Sdianti Studio
  458. $detail->cidade_id = $item['cidade_id'];
  459. $detail->rec_nome = $item['rec_nome'];
  460. $detail->rec_email = $item['rec_email'];
  461. $detail->rec_contato = $item['rec_contato'];
  462. $detail->rec_funcao = $item['rec_funcao'];
  463. $detail->rec_logradouro = $item['rec_logradouro'];
  464. $detail->rec_complemento = $item['rec_complemento'];
  465. $detail->rec_bairro = $item['rec_bairro'];
  466. */
  467. $detail->cliente_id = $master->id;
  468. $detail->store();
  469. $keep_items[] = $detail->id;
  470. }
  471. }
  472. if ($old_items)
  473. {
  474. foreach ($old_items as $old_item)
  475. {
  476. if (!in_array( $old_item->id, $keep_items))
  477. {
  478. $old_item->delete();
  479. }
  480. }
  481. }
  482. TTransaction::close(); // close the transaction
  483. // reload form and session items
  484. $this->onEdit(array('key'=>$master->id));
  485. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  486. }
  487. catch (Exception $e) // in case of exception
  488. {
  489. new TMessage('error', $e->getMessage());
  490. $this->form->setData( $this->form->getData() ); // keep form data
  491. TTransaction::rollback();
  492. }
  493. }
  494. /**
  495. * Show the page
  496. */
  497. public function show()
  498. {
  499. // check if the datagrid is already loaded
  500. if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
  501. {
  502. $this->onReload( func_get_arg(0) );
  503. }
  504. parent::show();
  505. }
  506. }
  507. ?>