Erro ao salvar Estou tentando criar um form Mestre/Detalhe com dois detalhes. Na hora de cadastrar grava corretamente. Na hora de editar dá um erro de conexão. Se, ao editar, excluo os campos detalhe a gravação ocorre normalmente. Alguém consegue me dar um help? ...
CS
Erro ao salvar  
Estou tentando criar um form Mestre/Detalhe com dois detalhes. Na hora de cadastrar grava corretamente. Na hora de editar dá um erro de conexão. Se, ao editar, excluo os campos detalhe a gravação ocorre normalmente. Alguém consegue me dar um help?


 
  1. <?php
  2. /**
  3. * CursoForm Master/Detail
  4. * @author <your name here>
  5. */
  6. class CursoForm extends TPage
  7. {
  8. protected $form; // form
  9. protected $detail_list;
  10. protected $detail_Inscritos_list;
  11. /**
  12. * Page constructor
  13. */
  14. public function __construct()
  15. {
  16. parent::__construct();
  17. // creates the form
  18. $this->form = new BootstrapFormBuilder('form_Curso');
  19. $this->form->setFormTitle('Cadastro de Curso');
  20. // master fields
  21. $this->form->appendPage('Curso');
  22. $id = new TEntry('id');
  23. $nome = new TEntry('nome');
  24. $data_inicial = new TDate('data_inicial');
  25. $data_final = new TDate('data_final');
  26. $numero_horas = new TEntry('numero_horas');
  27. $data_cadastro = new TDate('data_cadastro');
  28. $conteudos = new TText('conteudos');
  29. $numero_vagas = new TEntry('numero_vagas');
  30. $data_inicial_inscricao = new TDate('data_inicial_inscricao');
  31. $data_final_inscricao = new TDate('data_final_inscricao');
  32. $local_realizacao = new TEntry('local_realizacao');
  33. $turno = new TEntry('turno');
  34. $assinatura_id = new TDBUniqueSearch('assinatura_id', 'permission', 'Assinatura', 'id', 'caminho_assinatura');
  35. $system_unit_id = new TDBUniqueSearch('system_unit_id', 'permission', 'SystemUnit', 'id', 'name');
  36. // detail Palestrantes fields
  37. $detail_id = new THidden('detail_id');
  38. $detail_data_cadastro = new TDate('detail_data_cadastro');
  39. $detail_numero_horas = new TEntry('detail_numero_horas');
  40. $detail_codigo_certificado = new TEntry('detail_codigo_certificado');
  41. $detail_palestrante_id = new TDBUniqueSearch('detail_palestrante_id', 'permission', 'Palestrante', 'id', 'nome');
  42. // detail_Inscritos fields
  43. $detail_Inscritos_id = new THidden('detail_Inscritos_id');
  44. $detail_Inscritos_data_cadastro = new TDate('detail_Inscritos_data_cadastro');
  45. $detail_Inscritos_codigo_certificado = new TEntry('detail_Inscritos_codigo_certificado');
  46. $detail_Inscritos_frequencia = new TEntry('detail_Inscritos_frequencia');
  47. $detail_Inscritos_segunda_via = new TEntry('detail_Inscritos_segunda_via');
  48. $detail_Inscritos_system_user_id = new TDBUniqueSearch('detail_Inscritos_system_user_id', 'permission', 'SystemUser', 'id', 'name');
  49. $detail_Inscritos_system_user_unit_id = new TDBUniqueSearch('detail_Inscritos_system_user_unit_id', 'permission', 'SystemUnit', 'id', 'name');
  50. if (!empty($id))
  51. {
  52. $id->setEditable(FALSE);
  53. }
  54. // master fields
  55. $this->form->addFields( [new TLabel('Id')], [$id] );
  56. $this->form->addFields( [new TLabel('Nome')], [$nome] );
  57. $this->form->addFields( [new TLabel('Data Inicial')], [$data_inicial] );
  58. $this->form->addFields( [new TLabel('Data Final')], [$data_final] );
  59. $this->form->addFields( [new TLabel('Numero Horas')], [$numero_horas] );
  60. $this->form->addFields( [new TLabel('Data Cadastro')], [$data_cadastro] );
  61. $this->form->addFields( [new TLabel('Conteudos')], [$conteudos] );
  62. $this->form->addFields( [new TLabel('Numero Vagas')], [$numero_vagas] );
  63. $this->form->addFields( [new TLabel('Data Inicial Inscricao')], [$data_inicial_inscricao] );
  64. $this->form->addFields( [new TLabel('Data Final Inscricao')], [$data_final_inscricao] );
  65. $this->form->addFields( [new TLabel('Local Realizacao')], [$local_realizacao] );
  66. $this->form->addFields( [new TLabel('Turno')], [$turno] );
  67. $this->form->addFields( [new TLabel('Assinatura Id')], [$assinatura_id] );
  68. $this->form->addFields( [new TLabel('System Unit Id')], [$system_unit_id] );
  69. $this->form->appendPage('Palestrantes');
  70. // detail fields
  71. // $this->form->addContent( ['<h4>Cadastro de Palestrante</h4><hr>'] );
  72. $this->form->addFields( [$detail_id] );
  73. $this->form->addFields( [new TLabel('Data Cadastro')], [$detail_data_cadastro] );
  74. $this->form->addFields( [new TLabel('Numero Horas')], [$detail_numero_horas] );
  75. $this->form->addFields( [new TLabel('Codigo Certificado')], [$detail_codigo_certificado] );
  76. $this->form->addFields( [new TLabel('Palestrante Id')], [$detail_palestrante_id] );
  77. $add = TButton::create('add', [$this, 'onSaveDetail'], 'Register', 'fa:save');
  78. $this->form->addFields( [], [$add] )->style = 'background: whitesmoke; padding: 5px; margin: 1px;';
  79. $this->detail_list = new BootstrapDatagridWrapper(new TQuickGrid);
  80. $this->detail_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
  81. $this->detail_list->setId('Curso_list');
  82. // items
  83. $this->detail_list->addQuickColumn('Data Cadastro', 'data_cadastro', 'left', 50);
  84. $this->detail_list->addQuickColumn('Numero Horas', 'numero_horas', 'left', 100);
  85. $this->detail_list->addQuickColumn('Codigo Certificado', 'codigo_certificado', 'left', 100);
  86. $this->detail_list->addQuickColumn('Palestrante Id', 'palestrante_id', 'left', 100);
  87. // detail actions
  88. $this->detail_list->addQuickAction( 'Edit', new TDataGridAction([$this, 'onEditDetail']), 'id', 'fa:edit blue');
  89. $this->detail_list->addQuickAction( 'Delete', new TDataGridAction([$this, 'onDeleteDetail']), 'id', 'fa:trash red');
  90. $this->detail_list->createModel();
  91. $panel = new TPanelGroup;
  92. $panel->add($this->detail_list);
  93. $panel->getBody()->style = 'overflow-x:auto';
  94. $this->form->addContent( [$panel] );
  95. //Aba de Inscritos
  96. $this->form->appendPage('Inscritos');
  97. // detail_Inscritos fields
  98. // $this->form->addContent( ['<h4>Detail_Inscritos</h4><hr>'] );
  99. $this->form->addFields( [$detail_Inscritos_id] );
  100. $this->form->addFields( [new TLabel('Data Cadastro')], [$detail_Inscritos_data_cadastro] );
  101. $this->form->addFields( [new TLabel('Codigo Certificado')], [$detail_Inscritos_codigo_certificado] );
  102. $this->form->addFields( [new TLabel('Frequencia')], [$detail_Inscritos_frequencia] );
  103. $this->form->addFields( [new TLabel('Segunda Via')], [$detail_Inscritos_segunda_via] );
  104. $this->form->addFields( [new TLabel('System User Id')], [$detail_Inscritos_system_user_id] );
  105. $this->form->addFields( [new TLabel('System User Unit Id')], [$detail_Inscritos_system_user_unit_id] );
  106. $add1 = TButton::create('add1', [$this, 'onSaveDetail_Inscritos'], 'Register', 'fa:save');
  107. $this->form->addFields( [], [$add1] )->style = 'background: whitesmoke; padding: 5px; margin: 1px;';
  108. $this->detail_Inscritos_list = new BootstrapDatagridWrapper(new TQuickGrid);
  109. $this->detail_Inscritos_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
  110. $this->detail_Inscritos_list->setId('Curso_Inscritos');
  111. // items
  112. $this->detail_Inscritos_list->addQuickColumn('Data Cadastro', 'data_cadastro', 'left', 50);
  113. $this->detail_Inscritos_list->addQuickColumn('Codigo Certificado', 'codigo_certificado', 'left', 100);
  114. $this->detail_Inscritos_list->addQuickColumn('Frequencia', 'frequencia', 'left', 100);
  115. $this->detail_Inscritos_list->addQuickColumn('Segunda Via', 'segunda_via', 'left', 100);
  116. $this->detail_Inscritos_list->addQuickColumn('System User Id', 'system_user_id', 'left', 100);
  117. $this->detail_Inscritos_list->addQuickColumn('System User Unit Id', 'system_user_unit_id', 'left', 100);
  118. // detail_Inscritos actions
  119. $this->detail_Inscritos_list->addQuickAction( 'Edit', new TDataGridAction([$this, 'onEditDetail_Inscritos']), 'id', 'fa:edit blue');
  120. $this->detail_Inscritos_list->addQuickAction( 'Delete', new TDataGridAction([$this, 'onDeleteDetail_Inscritos']), 'id', 'fa:trash red');
  121. $this->detail_Inscritos_list->createModel();
  122. $panel_inscritos = new TPanelGroup;
  123. $panel_inscritos->add($this->detail_Inscritos_list);
  124. $panel_inscritos->getBody()->style = 'overflow-x:auto';
  125. $this->form->addContent( [$panel_inscritos] );
  126. //Fim da Aba de Inscritos
  127. $btn = $this->form->addAction( _t('Save'), new TAction([$this, 'onSave']), 'fa:save');
  128. $btn->class = 'btn btn-sm btn-primary';
  129. $this->form->addAction( _t('Clear'), new TAction([$this, 'onClear']), 'fa:eraser red');
  130. // create the page container
  131. $container = new TVBox;
  132. $container->style = 'width: 90%';
  133. $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  134. $container->add($this->form);
  135. parent::add($container);
  136. }
  137. /**
  138. * Clear form
  139. * @param $param URL parameters
  140. */
  141. public function onClear($param)
  142. {
  143. $this->form->clear(TRUE);
  144. TSession::setValue(__CLASS__.'_items', array());
  145. TSession::setValue(__CLASS__.'_items_inscritos', array());
  146. $this->onReload( $param );
  147. }
  148. /**
  149. * Save an item from form to session list
  150. * @param $param URL parameters
  151. */
  152. public function onSaveDetail( $param )
  153. {
  154. try
  155. {
  156. TTransaction::open('permission');
  157. $data = $this->form->getData();
  158. /** validation sample
  159. if (empty($data->fieldX))
  160. {
  161. throw new Exception('The field fieldX is required');
  162. }
  163. **/
  164. $items = TSession::getValue(__CLASS__.'_items');
  165. $key = empty($data->detail_id) ? 'X'.mt_rand(1000000000, 1999999999) : $data->detail_id;
  166. $items[ $key ] = array();
  167. $items[ $key ]['id'] = $key;
  168. $items[ $key ]['data_cadastro'] = $data->detail_data_cadastro;
  169. $items[ $key ]['numero_horas'] = $data->detail_numero_horas;
  170. $items[ $key ]['codigo_certificado'] = $data->detail_codigo_certificado;
  171. $items[ $key ]['palestrante_id'] = $data->detail_palestrante_id;
  172. TSession::setValue(__CLASS__.'_items', $items);
  173. // clear detail form fields
  174. $data->detail_id = '';
  175. $data->detail_data_cadastro = '';
  176. $data->detail_numero_horas = '';
  177. $data->detail_codigo_certificado = '';
  178. $data->detail_palestrante_id = '';
  179. TTransaction::close();
  180. $this->form->setData($data);
  181. $this->onReload( $param ); // reload the items
  182. }
  183. catch (Exception $e)
  184. {
  185. $this->form->setData( $this->form->getData());
  186. new TMessage('error', $e->getMessage());
  187. }
  188. }
  189. /**
  190. * Save an item from form to session list
  191. * @param $param URL parameters
  192. */
  193. public function onSaveDetail_Inscritos( $param )
  194. {
  195. try
  196. {
  197. TTransaction::open('permission');
  198. $data = $this->form->getData();
  199. /** validation sample
  200. if (empty($data->fieldX))
  201. {
  202. throw new Exception('The field fieldX is required');
  203. }
  204. **/
  205. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  206. $key = empty($data->detail_Inscritos_id) ? 'X'.mt_rand(1000000000, 1999999999) : $data->detail_Inscritos_id;
  207. $items_inscritos[ $key ] = array();
  208. $items_inscritos[ $key ]['id'] = $key;
  209. $items_inscritos[ $key ]['data_cadastro'] = $data->detail_Inscritos_data_cadastro;
  210. $items_inscritos[ $key ]['codigo_certificado'] = $data->detail_Inscritos_codigo_certificado;
  211. $items_inscritos[ $key ]['frequencia'] = $data->detail_Inscritos_frequencia;
  212. $items_inscritos[ $key ]['segunda_via'] = $data->detail_Inscritos_segunda_via;
  213. $items_inscritos[ $key ]['system_user_id'] = $data->detail_Inscritos_system_user_id;
  214. $items_inscritos[ $key ]['system_user_unit_id'] = $data->detail_Inscritos_system_user_unit_id;
  215. TSession::setValue(__CLASS__.'_items_inscritos', $items_inscritos);
  216. // clear detail_Inscritos form fields
  217. $data->detail_Inscritos_id = '';
  218. $data->detail_Inscritos_data_cadastro = '';
  219. $data->detail_Inscritos_codigo_certificado = '';
  220. $data->detail_Inscritos_frequencia = '';
  221. $data->detail_Inscritos_segunda_via = '';
  222. $data->detail_Inscritos_system_user_id = '';
  223. $data->detail_Inscritos_system_user_unit_id = '';
  224. TTransaction::close();
  225. $this->form->setData($data);
  226. $this->onReload( $param ); // reload the items_inscritos
  227. }
  228. catch (Exception $e)
  229. {
  230. $this->form->setData( $this->form->getData());
  231. new TMessage('error', $e->getMessage());
  232. }
  233. }
  234. /**
  235. * Load an item from session list to detail form
  236. * @param $param URL parameters
  237. */
  238. public static function onEditDetail( $param )
  239. {
  240. // read session items
  241. $items = TSession::getValue(__CLASS__.'_items');
  242. // get the session item
  243. $item = $items[ $param['key'] ];
  244. $data = new stdClass;
  245. $data->detail_id = $item['id'];
  246. $data->detail_data_cadastro = $item['data_cadastro'];
  247. $data->detail_numero_horas = $item['numero_horas'];
  248. $data->detail_codigo_certificado = $item['codigo_certificado'];
  249. $data->detail_palestrante_id = $item['palestrante_id'];
  250. // fill detail fields
  251. TForm::sendData( 'form_Curso', $data );
  252. }
  253. /**
  254. * Load an item_i from session list to detail_Inscritos form
  255. * @param $param URL parameters
  256. */
  257. public static function onEditDetail_Inscritos( $param )
  258. {
  259. // read session items_inscritos
  260. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  261. // get the session item_i
  262. $item_i = $items_inscritos[ $param['key'] ];
  263. $data = new stdClass;
  264. $data->detail_Inscritos_id = $item_i['id'];
  265. $data->detail_Inscritos_data_cadastro = $item_i['data_cadastro'];
  266. $data->detail_Inscritos_codigo_certificado = $item_i['codigo_certificado'];
  267. $data->detail_Inscritos_frequencia = $item_i['frequencia'];
  268. $data->detail_Inscritos_segunda_via = $item_i['segunda_via'];
  269. $data->detail_Inscritos_system_user_id = $item_i['system_user_id'];
  270. $data->detail_Inscritos_system_user_unit_id = $item_i['system_user_unit_id'];
  271. // fill detail_Inscritos fields
  272. TForm::sendData( 'form_Curso', $data );
  273. }
  274. /**
  275. * Delete an item from session list
  276. * @param $param URL parameters
  277. */
  278. public static function onDeleteDetail( $param )
  279. {
  280. // reset items
  281. $data = new stdClass;
  282. $data->detail_data_cadastro = '';
  283. $data->detail_numero_horas = '';
  284. $data->detail_codigo_certificado = '';
  285. $data->detail_palestrante_id = '';
  286. // clear form data
  287. TForm::sendData('form_Curso', $data );
  288. // read session items
  289. $items = TSession::getValue(__CLASS__.'_items');
  290. // get detail id
  291. $detail_id = $param['key'];
  292. // delete the item from session
  293. unset($items[ $detail_id ] );
  294. // rewrite session items
  295. TSession::setValue(__CLASS__.'_items', $items);
  296. // delete item from screen
  297. TScript::create("ttable_remove_row_by_id('Curso_list', '{$detail_id}')");
  298. }
  299. /**
  300. * Delete an item from session list
  301. * @param $param URL parameters
  302. */
  303. public static function onDeleteDetail_Inscritos( $param )
  304. {
  305. // reset items_inscritos
  306. $data = new stdClass;
  307. $data->detail_Inscritos_data_cadastro = '';
  308. $data->detail_Inscritos_codigo_certificado = '';
  309. $data->detail_Inscritos_frequencia = '';
  310. $data->detail_Inscritos_segunda_via = '';
  311. $data->detail_Inscritos_system_user_id = '';
  312. $data->detail_Inscritos_system_user_unit_id = '';
  313. // clear form data
  314. TForm::sendData('form_Curso', $data );
  315. // read session items_inscritos
  316. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  317. // get detail_Inscritos id
  318. $detail_Inscritos_id = $param['key'];
  319. // delete the item from session
  320. unset($items_inscritos[ $detail_Inscritos_id ] );
  321. // rewrite session items_inscritos
  322. TSession::setValue(__CLASS__.'_items_inscritos', $items_inscritos);
  323. // delete item from screen
  324. TScript::create("ttable_remove_row_by_id('Curso_Inscritos', '{$detail_Inscritos_id}')");
  325. }
  326. /**
  327. * Load the items list from session
  328. * @param $param URL parameters
  329. */
  330. public function onReload($param)
  331. {
  332. // read session items
  333. $items = TSession::getValue(__CLASS__.'_items');
  334. $this->detail_list->clear(); // clear detail list
  335. if ($items)
  336. {
  337. foreach ($items as $list_item)
  338. {
  339. $item = (object) $list_item;
  340. $row = $this->detail_list->addItem( $item );
  341. $row->id = $list_item['id'];
  342. }
  343. }
  344. // read session items_inscritos
  345. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  346. $this->detail_Inscritos_list->clear(); // clear detail_Inscritos list
  347. if ($items_inscritos)
  348. {
  349. foreach ($items_inscritos as $list_item_i)
  350. {
  351. $item_i = (object) $list_item_i;
  352. $row_i = $this->detail_Inscritos_list->addItem( $item_i );
  353. $row_i->id = $list_item_i['id'];
  354. }
  355. }
  356. $this->loaded = TRUE;
  357. }
  358. /**
  359. * Load Master/Detail data from database to form/session
  360. */
  361. public function onEdit($param)
  362. {
  363. try
  364. {
  365. TTransaction::open('permission');
  366. if (isset($param['key']))
  367. {
  368. $key = $param['key'];
  369. $object = new Curso($key);
  370. $items = CursoPalestrante::where('curso_id', '=', $key)->load();
  371. $session_items = array();
  372. foreach( $items as $item )
  373. {
  374. $item_key = $item->id;
  375. $session_items[$item_key] = $item->toArray();
  376. $session_items[$item_key]['id'] = $item->id;
  377. $session_items[$item_key]['data_cadastro'] = $item->data_cadastro;
  378. $session_items[$item_key]['numero_horas'] = $item->numero_horas;
  379. $session_items[$item_key]['codigo_certificado'] = $item->codigo_certificado;
  380. $session_items[$item_key]['palestrante_id'] = $item->palestrante_id;
  381. }
  382. TSession::setValue(__CLASS__.'_items', $session_items);
  383. var_dump($session_items);
  384. $items_inscritos = Inscritos::where('curso_id', '=', $key)->load();
  385. $session_items_inscritos = array();
  386. foreach( $items_inscritos as $item_i )
  387. {
  388. $item_i_key = $item_i->id;
  389. $session_items_inscritos[$item_i_key] = $item_i->toArray();
  390. $session_items_inscritos[$item_i_key]['id'] = $item_i->id;
  391. $session_items_inscritos[$item_i_key]['data_cadastro'] = $item_i->data_cadastro;
  392. $session_items_inscritos[$item_i_key]['codigo_certificado'] = $item_i->codigo_certificado;
  393. $session_items_inscritos[$item_i_key]['frequencia'] = $item_i->frequencia;
  394. $session_items_inscritos[$item_i_key]['segunda_via'] = $item_i->segunda_via;
  395. $session_items_inscritos[$item_i_key]['system_user_id'] = $item_i->system_user_id;
  396. $session_items_inscritos[$item_i_key]['system_user_unit_id'] = $item_i->system_user_unit_id;
  397. }
  398. TSession::setValue(__CLASS__.'_items_inscritos', $session_items_inscritos);
  399. var_dump($session_items_inscritos);
  400. $this->form->setData($object); // fill the form with the active record data
  401. $this->onReload( $param ); // reload items list
  402. TTransaction::close(); // close transaction
  403. }
  404. else
  405. {
  406. $this->form->clear(TRUE);
  407. TSession::setValue(__CLASS__.'_items', null);
  408. TSession::setValue(__CLASS__.'_items_inscritos', null);
  409. $this->onReload( $param );
  410. }
  411. }
  412. catch (Exception $e) // in case of exception
  413. {
  414. new TMessage('error', $e->getMessage());
  415. TTransaction::rollback();
  416. }
  417. }
  418. /**
  419. * Save the Master/Detail data from form/session to database
  420. */
  421. public function onSave()
  422. {
  423. try
  424. {
  425. // open a transaction with database
  426. TTransaction::open('permission');
  427. $data = $this->form->getData();
  428. $master = new Curso;
  429. $master->fromArray( (array) $data);
  430. $this->form->validate(); // form validation
  431. echo print_r($master);
  432. $master->store(); // save master object
  433. // delete details
  434. $old_items = CursoPalestrante::where('curso_id', '=', $master->id)->load();
  435. $keep_items = array();
  436. // get session items
  437. $items = TSession::getValue(__CLASS__.'_items');
  438. if( $items )
  439. {
  440. foreach( $items as $item )
  441. {
  442. if (substr($item['id'],0,1) == 'X' ) // new record
  443. {
  444. $detail = new CursoPalestrante;
  445. }
  446. else
  447. {
  448. $detail = CursoPalestrante::find($item['id']);
  449. }
  450. $detail->data_cadastro = $item['data_cadastro'];
  451. $detail->numero_horas = $item['numero_horas'];
  452. $detail->codigo_certificado = $item['codigo_certificado'];
  453. $detail->palestrante_id = $item['palestrante_id'];
  454. $detail->curso_id = $master->id;
  455. $detail->store();
  456. $keep_items[] = $detail->id;
  457. }
  458. }
  459. if ($old_items)
  460. {
  461. foreach ($old_items as $old_item)
  462. {
  463. if (!in_array( $old_item->id, $keep_items))
  464. {
  465. $old_item->delete();
  466. }
  467. }
  468. }
  469. // delete detail_Inscritoss
  470. $old_items_inscritos = Inscritos::where('curso_id', '=', $master->id)->load();
  471. $keep_items_inscritos = array();
  472. // get session items_inscritos
  473. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  474. if( $items_inscritos )
  475. {
  476. foreach( $items_inscritos as $item_i )
  477. {
  478. if (substr($item_i['id'],0,1) == 'X' ) // new record
  479. {
  480. $detail_Inscritos = new Inscritos;
  481. }
  482. else
  483. {
  484. $detail_Inscritos = Inscritos::find($item_i['id']);
  485. }
  486. $detail_Inscritos->data_cadastro = $item_i['data_cadastro'];
  487. $detail_Inscritos->codigo_certificado = $item_i['codigo_certificado'];
  488. $detail_Inscritos->frequencia = $item_i['frequencia'];
  489. $detail_Inscritos->segunda_via = $item_i['segunda_via'];
  490. $detail_Inscritos->system_user_id = $item_i['system_user_id'];
  491. $detail_Inscritos->system_user_unit_id = $item_i['system_user_unit_id'];
  492. $detail_Inscritos->curso_id = $master->id;
  493. $detail_Inscritos->store();
  494. $keep_items_inscritos[] = $detail_Inscritos->id;
  495. }
  496. }
  497. if ($old_items_inscritos)
  498. {
  499. foreach ($old_items_inscritos as $old_item_i)
  500. {
  501. if (!in_array( $old_item_i->id, $keep_items_inscritos))
  502. {
  503. $old_item_i->delete();
  504. }
  505. }
  506. }
  507. TTransaction::close(); // close the transaction
  508. // reload form and session items
  509. $this->onEdit(array('key'=>$master->id));
  510. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  511. }
  512. catch (Exception $e) // in case of exception
  513. {
  514. new TMessage('error', $e->getMessage());
  515. $this->form->setData( $this->form->getData() ); // keep form data
  516. TTransaction::rollback();
  517. }
  518. }
  519. /**
  520. * Show the page
  521. */
  522. public function show()
  523. {
  524. // $param = func_get_arg(0);
  525. // check if the datagrid is already loaded
  526. if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
  527. {
  528. $this->onReload( func_get_arg(0) );
  529. }
  530. parent::show();
  531. }
  532. }
  533. ?>

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


CS

O erro está relacionado com a composição. Por algum motivo na hora de salvar a edição ocorre o erro "connection failed". Tem alguma coisa que ficou faltando?
FC

Troque essa linha do onSave

$detail_Inscritos = Inscritos::find($item_i['id']);

Por essas

$detail_Inscritos = new Inscritos;
$detail_Inscritos = $detail_Inscritos->fromArray($item_i);

Exemplo:
 
  1. <?php
  2. public function onSave()
  3. {
  4. try
  5. {
  6. // open a transaction with database
  7. TTransaction::open('permission');
  8. $data = $this->form->getData();
  9. $master = new Curso;
  10. $master->fromArray( (array) $data);
  11. $this->form->validate(); // form validation
  12. echo print_r($master);
  13. $master->store(); // save master object
  14. // delete details
  15. $old_items = CursoPalestrante::where('curso_id', '=', $master->id)->load();
  16. $keep_items = array();
  17. // get session items
  18. $items = TSession::getValue(__CLASS__.'_items');
  19. if( $items )
  20. {
  21. foreach( $items as $item )
  22. {
  23. if (substr($item['id'],0,1) == 'X' ) // new record
  24. {
  25. $detail = new CursoPalestrante;
  26. }
  27. else
  28. {
  29. $detail = CursoPalestrante::find($item['id']);
  30. }
  31. $detail->data_cadastro = $item['data_cadastro'];
  32. $detail->numero_horas = $item['numero_horas'];
  33. $detail->codigo_certificado = $item['codigo_certificado'];
  34. $detail->palestrante_id = $item['palestrante_id'];
  35. $detail->curso_id = $master->id;
  36. $detail->store();
  37. $keep_items[] = $detail->id;
  38. }
  39. }
  40. if ($old_items)
  41. {
  42. foreach ($old_items as $old_item)
  43. {
  44. if (!in_array( $old_item->id, $keep_items))
  45. {
  46. $old_item->delete();
  47. }
  48. }
  49. }
  50. // delete detail_Inscritoss
  51. $old_items_inscritos = Inscritos::where('curso_id', '=', $master->id)->load();
  52. $keep_items_inscritos = array();
  53. // get session items_inscritos
  54. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  55. if( $items_inscritos )
  56. {
  57. foreach( $items_inscritos as $item_i )
  58. {
  59. if (substr($item_i['id'],0,1) == 'X' ) // new record
  60. {
  61. $detail_Inscritos = new Inscritos;
  62. }
  63. else
  64. {
  65. $detail_Inscritos = new Inscritos;
  66. $detail_Inscritos = $detail_Inscritos->fromArray($item_i);
  67. }
  68. $detail_Inscritos->curso_id = $master->id;
  69. $detail_Inscritos->store();
  70. $keep_items_inscritos[] = $detail_Inscritos->id;
  71. }
  72. }
  73. if ($old_items_inscritos)
  74. {
  75. foreach ($old_items_inscritos as $old_item_i)
  76. {
  77. if (!in_array( $old_item_i->id, $keep_items_inscritos))
  78. {
  79. $old_item_i->delete();
  80. }
  81. }
  82. }
  83. TTransaction::close(); // close the transaction
  84. // reload form and session items
  85. $this->onEdit(array('key'=>$master->id));
  86. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  87. }
  88. catch (Exception $e) // in case of exception
  89. {
  90. new TMessage('error', $e->getMessage());
  91. $this->form->setData( $this->form->getData() ); // keep form data
  92. TTransaction::rollback();
  93. }
  94. }
  95. ?>
CS

Felipe,

continua com o mesmo erro. Abaixo o código com a substituição que você sugeriu:


 
  1. <?php
  2. /**
  3. * CursoForm Master/Detail
  4. * @author <Cleber Silva>
  5. */
  6. class CursoForm extends TPage
  7. {
  8. protected $form; // form
  9. protected $detail_list;
  10. protected $detail_Inscritos_list;
  11. /**
  12. * Page constructor
  13. */
  14. public function __construct()
  15. {
  16. parent::__construct();
  17. // creates the form
  18. $this->form = new BootstrapFormBuilder('form_Curso');
  19. $this->form->setFormTitle('Cadastro de Curso');
  20. // master fields
  21. $this->form->appendPage('Curso');
  22. $id = new TEntry('id');
  23. $nome = new TEntry('nome');
  24. $data_inicial = new TDate('data_inicial');
  25. $data_final = new TDate('data_final');
  26. $numero_horas = new TEntry('numero_horas');
  27. $data_cadastro = new TDate('data_cadastro');
  28. $conteudos = new TText('conteudos');
  29. $numero_vagas = new TEntry('numero_vagas');
  30. $data_inicial_inscricao = new TDate('data_inicial_inscricao');
  31. $data_final_inscricao = new TDate('data_final_inscricao');
  32. $local_realizacao = new TEntry('local_realizacao');
  33. $turno = new TEntry('turno');
  34. $assinatura_id = new TDBUniqueSearch('assinatura_id', 'permission', 'Assinatura', 'id', 'caminho_assinatura');
  35. $system_unit_id = new TDBUniqueSearch('system_unit_id', 'permission', 'SystemUnit', 'id', 'name');
  36. // detail Palestrantes fields
  37. $detail_id = new THidden('detail_id');
  38. $detail_data_cadastro = new TDate('detail_data_cadastro');
  39. $detail_numero_horas = new TEntry('detail_numero_horas');
  40. $detail_codigo_certificado = new TEntry('detail_codigo_certificado');
  41. $detail_palestrante_id = new TDBUniqueSearch('detail_palestrante_id', 'permission', 'Palestrante', 'id', 'nome');
  42. // detail_Inscritos fields
  43. $detail_Inscritos_id = new THidden('detail_Inscritos_id');
  44. $detail_Inscritos_data_cadastro = new TDate('detail_Inscritos_data_cadastro');
  45. $detail_Inscritos_codigo_certificado = new TEntry('detail_Inscritos_codigo_certificado');
  46. $detail_Inscritos_frequencia = new TEntry('detail_Inscritos_frequencia');
  47. $detail_Inscritos_segunda_via = new TEntry('detail_Inscritos_segunda_via');
  48. $detail_Inscritos_system_user_id = new TDBUniqueSearch('detail_Inscritos_system_user_id', 'permission', 'SystemUser', 'id', 'name');
  49. $detail_Inscritos_system_user_unit_id = new TDBUniqueSearch('detail_Inscritos_system_user_unit_id', 'permission', 'SystemUnit', 'id', 'name');
  50. if (!empty($id))
  51. {
  52. $id->setEditable(FALSE);
  53. }
  54. // master fields
  55. $this->form->addFields( [new TLabel('Id')], [$id] );
  56. $this->form->addFields( [new TLabel('Nome')], [$nome] );
  57. $this->form->addFields( [new TLabel('Data Inicial')], [$data_inicial] );
  58. $this->form->addFields( [new TLabel('Data Final')], [$data_final] );
  59. $this->form->addFields( [new TLabel('Numero Horas')], [$numero_horas] );
  60. $this->form->addFields( [new TLabel('Data Cadastro')], [$data_cadastro] );
  61. $this->form->addFields( [new TLabel('Conteudos')], [$conteudos] );
  62. $this->form->addFields( [new TLabel('Numero Vagas')], [$numero_vagas] );
  63. $this->form->addFields( [new TLabel('Data Inicial Inscricao')], [$data_inicial_inscricao] );
  64. $this->form->addFields( [new TLabel('Data Final Inscricao')], [$data_final_inscricao] );
  65. $this->form->addFields( [new TLabel('Local Realizacao')], [$local_realizacao] );
  66. $this->form->addFields( [new TLabel('Turno')], [$turno] );
  67. $this->form->addFields( [new TLabel('Assinatura Id')], [$assinatura_id] );
  68. $this->form->addFields( [new TLabel('System Unit Id')], [$system_unit_id] );
  69. $this->form->appendPage('Palestrantes');
  70. // detail fields
  71. // $this->form->addContent( ['<h4>Cadastro de Palestrante</h4><hr>'] );
  72. $this->form->addFields( [$detail_id] );
  73. $this->form->addFields( [new TLabel('Data Cadastro')], [$detail_data_cadastro] );
  74. $this->form->addFields( [new TLabel('Numero Horas')], [$detail_numero_horas] );
  75. $this->form->addFields( [new TLabel('Codigo Certificado')], [$detail_codigo_certificado] );
  76. $this->form->addFields( [new TLabel('Palestrante Id')], [$detail_palestrante_id] );
  77. $add = TButton::create('add', [$this, 'onSaveDetail'], 'Register', 'fa:save');
  78. $this->form->addFields( [], [$add] )->style = 'background: whitesmoke; padding: 5px; margin: 1px;';
  79. $this->detail_list = new BootstrapDatagridWrapper(new TQuickGrid);
  80. $this->detail_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
  81. $this->detail_list->setId('Curso_list');
  82. // items
  83. $this->detail_list->addQuickColumn('Data Cadastro', 'data_cadastro', 'left', 50);
  84. $this->detail_list->addQuickColumn('Numero Horas', 'numero_horas', 'left', 100);
  85. $this->detail_list->addQuickColumn('Codigo Certificado', 'codigo_certificado', 'left', 100);
  86. $this->detail_list->addQuickColumn('Palestrante Id', 'palestrante_id', 'left', 100);
  87. // detail actions
  88. $this->detail_list->addQuickAction( 'Edit', new TDataGridAction([$this, 'onEditDetail']), 'id', 'fa:edit blue');
  89. $this->detail_list->addQuickAction( 'Delete', new TDataGridAction([$this, 'onDeleteDetail']), 'id', 'fa:trash red');
  90. $this->detail_list->createModel();
  91. $panel = new TPanelGroup;
  92. $panel->add($this->detail_list);
  93. $panel->getBody()->style = 'overflow-x:auto';
  94. $this->form->addContent( [$panel] );
  95. //Aba de Inscritos
  96. $this->form->appendPage('Inscritos');
  97. // detail_Inscritos fields
  98. // $this->form->addContent( ['<h4>Detail_Inscritos</h4><hr>'] );
  99. $this->form->addFields( [$detail_Inscritos_id] );
  100. $this->form->addFields( [new TLabel('Data Cadastro')], [$detail_Inscritos_data_cadastro] );
  101. $this->form->addFields( [new TLabel('Codigo Certificado')], [$detail_Inscritos_codigo_certificado] );
  102. $this->form->addFields( [new TLabel('Frequencia')], [$detail_Inscritos_frequencia] );
  103. $this->form->addFields( [new TLabel('Segunda Via')], [$detail_Inscritos_segunda_via] );
  104. $this->form->addFields( [new TLabel('System User Id')], [$detail_Inscritos_system_user_id] );
  105. $this->form->addFields( [new TLabel('System User Unit Id')], [$detail_Inscritos_system_user_unit_id] );
  106. $add1 = TButton::create('add1', [$this, 'onSaveDetail_Inscritos'], 'Register', 'fa:save');
  107. $this->form->addFields( [], [$add1] )->style = 'background: whitesmoke; padding: 5px; margin: 1px;';
  108. $this->detail_Inscritos_list = new BootstrapDatagridWrapper(new TQuickGrid);
  109. $this->detail_Inscritos_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
  110. $this->detail_Inscritos_list->setId('Curso_Inscritos');
  111. // items
  112. $this->detail_Inscritos_list->addQuickColumn('Data Cadastro', 'data_cadastro', 'left', 50);
  113. $this->detail_Inscritos_list->addQuickColumn('Codigo Certificado', 'codigo_certificado', 'left', 100);
  114. $this->detail_Inscritos_list->addQuickColumn('Frequencia', 'frequencia', 'left', 100);
  115. $this->detail_Inscritos_list->addQuickColumn('Segunda Via', 'segunda_via', 'left', 100);
  116. $this->detail_Inscritos_list->addQuickColumn('System User Id', 'system_user_id', 'left', 100);
  117. $this->detail_Inscritos_list->addQuickColumn('System User Unit Id', 'system_user_unit_id', 'left', 100);
  118. // detail_Inscritos actions
  119. $this->detail_Inscritos_list->addQuickAction( 'Edit', new TDataGridAction([$this, 'onEditDetail_Inscritos']), 'id', 'fa:edit blue');
  120. $this->detail_Inscritos_list->addQuickAction( 'Delete', new TDataGridAction([$this, 'onDeleteDetail_Inscritos']), 'id', 'fa:trash red');
  121. $this->detail_Inscritos_list->createModel();
  122. $panel_inscritos = new TPanelGroup;
  123. $panel_inscritos->add($this->detail_Inscritos_list);
  124. $panel_inscritos->getBody()->style = 'overflow-x:auto';
  125. $this->form->addContent( [$panel_inscritos] );
  126. //Fim da Aba de Inscritos
  127. $btn = $this->form->addAction( _t('Save'), new TAction([$this, 'onSave']), 'fa:save');
  128. $btn->class = 'btn btn-sm btn-primary';
  129. $this->form->addAction( _t('Clear'), new TAction([$this, 'onClear']), 'fa:eraser red');
  130. // create the page container
  131. $container = new TVBox;
  132. $container->style = 'width: 90%';
  133. $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  134. $container->add($this->form);
  135. parent::add($container);
  136. }
  137. /**
  138. * Clear form
  139. * @param $param URL parameters
  140. */
  141. public function onClear($param)
  142. {
  143. $this->form->clear(TRUE);
  144. TSession::setValue(__CLASS__.'_items', array());
  145. TSession::setValue(__CLASS__.'_items_inscritos', array());
  146. $this->onReload( $param );
  147. }
  148. /**
  149. * Save an item from form to session list
  150. * @param $param URL parameters
  151. */
  152. public function onSaveDetail( $param )
  153. {
  154. try
  155. {
  156. TTransaction::open('permission');
  157. $data = $this->form->getData();
  158. /** validation sample
  159. if (empty($data->fieldX))
  160. {
  161. throw new Exception('The field fieldX is required');
  162. }
  163. **/
  164. $items = TSession::getValue(__CLASS__.'_items');
  165. $key = empty($data->detail_id) ? 'X'.mt_rand(1000000000, 1999999999) : $data->detail_id;
  166. $items[ $key ] = array();
  167. $items[ $key ]['id'] = $key;
  168. $items[ $key ]['data_cadastro'] = $data->detail_data_cadastro;
  169. $items[ $key ]['numero_horas'] = $data->detail_numero_horas;
  170. $items[ $key ]['codigo_certificado'] = $data->detail_codigo_certificado;
  171. $items[ $key ]['palestrante_id'] = $data->detail_palestrante_id;
  172. TSession::setValue(__CLASS__.'_items', $items);
  173. // clear detail form fields
  174. $data->detail_id = '';
  175. $data->detail_data_cadastro = '';
  176. $data->detail_numero_horas = '';
  177. $data->detail_codigo_certificado = '';
  178. $data->detail_palestrante_id = '';
  179. TTransaction::close();
  180. $this->form->setData($data);
  181. $this->onReload( $param ); // reload the items
  182. }
  183. catch (Exception $e)
  184. {
  185. $this->form->setData( $this->form->getData());
  186. new TMessage('error', $e->getMessage());
  187. }
  188. }
  189. /**
  190. * Save an item from form to session list
  191. * @param $param URL parameters
  192. */
  193. public function onSaveDetail_Inscritos( $param )
  194. {
  195. try
  196. {
  197. TTransaction::open('permission');
  198. $data = $this->form->getData();
  199. /** validation sample
  200. if (empty($data->fieldX))
  201. {
  202. throw new Exception('The field fieldX is required');
  203. }
  204. **/
  205. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  206. $key = empty($data->detail_Inscritos_id) ? 'X'.mt_rand(1000000000, 1999999999) : $data->detail_Inscritos_id;
  207. $items_inscritos[ $key ] = array();
  208. $items_inscritos[ $key ]['id'] = $key;
  209. $items_inscritos[ $key ]['data_cadastro'] = $data->detail_Inscritos_data_cadastro;
  210. $items_inscritos[ $key ]['codigo_certificado'] = $data->detail_Inscritos_codigo_certificado;
  211. $items_inscritos[ $key ]['frequencia'] = $data->detail_Inscritos_frequencia;
  212. $items_inscritos[ $key ]['segunda_via'] = $data->detail_Inscritos_segunda_via;
  213. $items_inscritos[ $key ]['system_user_id'] = $data->detail_Inscritos_system_user_id;
  214. $items_inscritos[ $key ]['system_user_unit_id'] = $data->detail_Inscritos_system_user_unit_id;
  215. TSession::setValue(__CLASS__.'_items_inscritos', $items_inscritos);
  216. // clear detail_Inscritos form fields
  217. $data->detail_Inscritos_id = '';
  218. $data->detail_Inscritos_data_cadastro = '';
  219. $data->detail_Inscritos_codigo_certificado = '';
  220. $data->detail_Inscritos_frequencia = '';
  221. $data->detail_Inscritos_segunda_via = '';
  222. $data->detail_Inscritos_system_user_id = '';
  223. $data->detail_Inscritos_system_user_unit_id = '';
  224. TTransaction::close();
  225. $this->form->setData($data);
  226. $this->onReload( $param ); // reload the items_inscritos
  227. }
  228. catch (Exception $e)
  229. {
  230. $this->form->setData( $this->form->getData());
  231. new TMessage('error', $e->getMessage());
  232. }
  233. }
  234. /**
  235. * Load an item from session list to detail form
  236. * @param $param URL parameters
  237. */
  238. public static function onEditDetail( $param )
  239. {
  240. // read session items
  241. $items = TSession::getValue(__CLASS__.'_items');
  242. // get the session item
  243. $item = $items[ $param['key'] ];
  244. $data = new stdClass;
  245. $data->detail_id = $item['id'];
  246. $data->detail_data_cadastro = $item['data_cadastro'];
  247. $data->detail_numero_horas = $item['numero_horas'];
  248. $data->detail_codigo_certificado = $item['codigo_certificado'];
  249. $data->detail_palestrante_id = $item['palestrante_id'];
  250. // fill detail fields
  251. TForm::sendData( 'form_Curso', $data );
  252. }
  253. /**
  254. * Load an item_i from session list to detail_Inscritos form
  255. * @param $param URL parameters
  256. */
  257. public static function onEditDetail_Inscritos( $param )
  258. {
  259. // read session items_inscritos
  260. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  261. // get the session item_i
  262. $item_i = $items_inscritos[ $param['key'] ];
  263. $data = new stdClass;
  264. $data->detail_Inscritos_id = $item_i['id'];
  265. $data->detail_Inscritos_data_cadastro = $item_i['data_cadastro'];
  266. $data->detail_Inscritos_codigo_certificado = $item_i['codigo_certificado'];
  267. $data->detail_Inscritos_frequencia = $item_i['frequencia'];
  268. $data->detail_Inscritos_segunda_via = $item_i['segunda_via'];
  269. $data->detail_Inscritos_system_user_id = $item_i['system_user_id'];
  270. $data->detail_Inscritos_system_user_unit_id = $item_i['system_user_unit_id'];
  271. // fill detail_Inscritos fields
  272. TForm::sendData( 'form_Curso', $data );
  273. }
  274. /**
  275. * Delete an item from session list
  276. * @param $param URL parameters
  277. */
  278. public static function onDeleteDetail( $param )
  279. {
  280. // reset items
  281. $data = new stdClass;
  282. $data->detail_data_cadastro = '';
  283. $data->detail_numero_horas = '';
  284. $data->detail_codigo_certificado = '';
  285. $data->detail_palestrante_id = '';
  286. // clear form data
  287. TForm::sendData('form_Curso', $data );
  288. // read session items
  289. $items = TSession::getValue(__CLASS__.'_items');
  290. // get detail id
  291. $detail_id = $param['key'];
  292. // delete the item from session
  293. unset($items[ $detail_id ] );
  294. // rewrite session items
  295. TSession::setValue(__CLASS__.'_items', $items);
  296. // delete item from screen
  297. TScript::create("ttable_remove_row_by_id('Curso_list', '{$detail_id}')");
  298. }
  299. /**
  300. * Delete an item from session list
  301. * @param $param URL parameters
  302. */
  303. public static function onDeleteDetail_Inscritos( $param )
  304. {
  305. // reset items_inscritos
  306. $data = new stdClass;
  307. $data->detail_Inscritos_data_cadastro = '';
  308. $data->detail_Inscritos_codigo_certificado = '';
  309. $data->detail_Inscritos_frequencia = '';
  310. $data->detail_Inscritos_segunda_via = '';
  311. $data->detail_Inscritos_system_user_id = '';
  312. $data->detail_Inscritos_system_user_unit_id = '';
  313. // clear form data
  314. TForm::sendData('form_Curso', $data );
  315. // read session items_inscritos
  316. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  317. // get detail_Inscritos id
  318. $detail_Inscritos_id = $param['key'];
  319. // delete the item from session
  320. unset($items_inscritos[ $detail_Inscritos_id ] );
  321. // rewrite session items_inscritos
  322. TSession::setValue(__CLASS__.'_items_inscritos', $items_inscritos);
  323. // delete item from screen
  324. TScript::create("ttable_remove_row_by_id('Curso_Inscritos', '{$detail_Inscritos_id}')");
  325. }
  326. /**
  327. * Load the items list from session
  328. * @param $param URL parameters
  329. */
  330. public function onReload($param)
  331. {
  332. // read session items
  333. $items = TSession::getValue(__CLASS__.'_items');
  334. $this->detail_list->clear(); // clear detail list
  335. if ($items)
  336. {
  337. foreach ($items as $list_item)
  338. {
  339. $item = (object) $list_item;
  340. $row = $this->detail_list->addItem( $item );
  341. $row->id = $list_item['id'];
  342. }
  343. }
  344. // read session items_inscritos
  345. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  346. $this->detail_Inscritos_list->clear(); // clear detail_Inscritos list
  347. if ($items_inscritos)
  348. {
  349. foreach ($items_inscritos as $list_item_i)
  350. {
  351. $item_i = (object) $list_item_i;
  352. $row_i = $this->detail_Inscritos_list->addItem( $item_i );
  353. $row_i->id = $list_item_i['id'];
  354. }
  355. }
  356. $this->loaded = TRUE;
  357. }
  358. /**
  359. * Load Master/Detail data from database to form/session
  360. */
  361. public function onEdit($param)
  362. {
  363. try
  364. {
  365. TTransaction::open('permission');
  366. if (isset($param['key']))
  367. {
  368. $key = $param['key'];
  369. $object = new Curso($key);
  370. $items = CursoPalestrante::where('curso_id', '=', $key)->load();
  371. // $items = $object->getCursoPalestrantes();
  372. $session_items = array();
  373. foreach( $items as $item )
  374. {
  375. $item_key = $item->id;
  376. $session_items[$item_key] = $item->toArray();
  377. $session_items[$item_key]['id'] = $item->id;
  378. $session_items[$item_key]['data_cadastro'] = $item->data_cadastro;
  379. $session_items[$item_key]['numero_horas'] = $item->numero_horas;
  380. $session_items[$item_key]['codigo_certificado'] = $item->codigo_certificado;
  381. $session_items[$item_key]['palestrante_id'] = $item->palestrante_id;
  382. }
  383. TSession::setValue(__CLASS__.'_items', $session_items);
  384. // var_dump($session_items);
  385. $items_inscritos = Inscritos::where('curso_id', '=', $key)->load();
  386. // $items_inscritos = $object->getInscritoss();
  387. $session_items_inscritos = array();
  388. foreach( $items_inscritos as $item_i )
  389. {
  390. $item_i_key = $item_i->id;
  391. $session_items_inscritos[$item_i_key] = $item_i->toArray();
  392. $session_items_inscritos[$item_i_key]['id'] = $item_i->id;
  393. $session_items_inscritos[$item_i_key]['data_cadastro'] = $item_i->data_cadastro;
  394. $session_items_inscritos[$item_i_key]['codigo_certificado'] = $item_i->codigo_certificado;
  395. $session_items_inscritos[$item_i_key]['frequencia'] = $item_i->frequencia;
  396. $session_items_inscritos[$item_i_key]['segunda_via'] = $item_i->segunda_via;
  397. $session_items_inscritos[$item_i_key]['system_user_id'] = $item_i->system_user_id;
  398. $session_items_inscritos[$item_i_key]['system_user_unit_id'] = $item_i->system_user_unit_id;
  399. }
  400. TSession::setValue(__CLASS__.'_items_inscritos', $session_items_inscritos);
  401. $this->form->setData($object); // fill the form with the active record data
  402. $this->onReload( $param ); // reload items list
  403. TTransaction::close(); // close transaction
  404. }
  405. else
  406. {
  407. $this->form->clear(TRUE);
  408. TSession::setValue(__CLASS__.'_items', null);
  409. TSession::setValue(__CLASS__.'_items_inscritos', null);
  410. $this->onReload( $param );
  411. }
  412. }
  413. catch (Exception $e) // in case of exception
  414. {
  415. new TMessage('error', $e->getMessage());
  416. TTransaction::rollback();
  417. }
  418. }
  419. /**
  420. * Save the Master/Detail data from form/session to database
  421. */
  422. public function onSave()
  423. {
  424. try
  425. {
  426. // open a transaction with database
  427. TTransaction::open('permission');
  428. $data = $this->form->getData();
  429. $master = new Curso;
  430. $master->fromArray( (array) $data);
  431. $this->form->validate(); // form validation
  432. $master->store(); // save master object
  433. // delete details
  434. $old_items = CursoPalestrante::where('curso_id', '=', $master->id)->load();
  435. $keep_items = array();
  436. // get session items
  437. $items = TSession::getValue(__CLASS__.'_items');
  438. if( $items )
  439. {
  440. foreach( $items as $item )
  441. {
  442. if (substr($item['id'],0,1) == 'X' ) // new record
  443. {
  444. $detail = new CursoPalestrante;
  445. }
  446. else
  447. {
  448. $detail = new CursoPalestrante;
  449. $detail = $detail->fromArray($item);
  450. // $detail = CursoPalestrante::find($item['id']);
  451. }
  452. $detail->curso_id = $master->id;
  453. $detail->id = $item['id'];
  454. $detail->data_cadastro = $item['data_cadastro'];
  455. $detail->numero_horas = $item['numero_horas'];
  456. $detail->codigo_certificado = $item['codigo_certificado'];
  457. $detail->palestrante_id = $item['palestrante_id'];
  458. $detail->store();
  459. $keep_items[] = $detail->id;
  460. }
  461. }
  462. if ($old_items)
  463. {
  464. foreach ($old_items as $old_item)
  465. {
  466. if (!in_array( $old_item->id, $keep_items))
  467. {
  468. $old_item->delete();
  469. }
  470. }
  471. }
  472. // delete detail_Inscritoss
  473. $old_items_inscritos = Inscritos::where('curso_id', '=', $master->id)->load();
  474. $keep_items_inscritos = array();
  475. // get session items_inscritos
  476. $items_inscritos = TSession::getValue(__CLASS__.'_items_inscritos');
  477. if( $items_inscritos )
  478. {
  479. foreach( $items_inscritos as $item_i )
  480. {
  481. if (substr($item_i['id'],0,1) == 'X' ) // new record
  482. {
  483. $detail_Inscritos = new Inscritos;
  484. }
  485. else
  486. {
  487. $detail_Inscritos = new Inscritos;
  488. $detail_Inscritos = $detail_Inscritos->fromArray($item_i);
  489. // $detail_Inscritos = Inscritos::find($item_i['id']);
  490. }
  491. var_dump($item_i);
  492. $detail_Inscritos->curso_id = $master->id;
  493. $detail_Inscritos->id = $item_i['id'];
  494. $detail_Inscritos->data_cadastro = $item_i['data_cadastro'];
  495. $detail_Inscritos->codigo_certificado = $item_i['codigo_certificado'];
  496. $detail_Inscritos->frequencia = $item_i['frequencia'];
  497. $detail_Inscritos->segunda_via = $item_i['segunda_via'];
  498. $detail_Inscritos->system_user_id = $item_i['system_user_id'];
  499. $detail_Inscritos->system_user_unit_id = $item_i['system_user_unit_id'];
  500. $detail_Inscritos->store();
  501. $keep_items_inscritos[] = $detail_Inscritos->id;
  502. }
  503. }
  504. if ($old_items_inscritos)
  505. {
  506. foreach ($old_items_inscritos as $old_item_i)
  507. {
  508. if (!in_array( $old_item_i->id, $keep_items_inscritos))
  509. {
  510. $old_item_i->delete();
  511. }
  512. }
  513. }
  514. TTransaction::close(); // close the transaction
  515. // reload form and session items
  516. $this->onEdit(array('key'=>$master->id));
  517. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  518. }
  519. catch (Exception $e) // in case of exception
  520. {
  521. new TMessage('error', $e->getMessage());
  522. $this->form->setData( $this->form->getData() ); // keep form data
  523. TTransaction::rollback();
  524. }
  525. }
  526. /**
  527. * Show the page
  528. */
  529. public function show()
  530. {
  531. // $param = func_get_arg(0);
  532. // check if the datagrid is already loaded
  533. if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
  534. {
  535. $this->onReload( func_get_arg(0) );
  536. }
  537. parent::show();
  538. }
  539. ?>


</Cleber>
CS

O mais estranho é que o Mestre/Detalhe vetorial funciona normalmente...
NR

Cleber, o erro "Connection failed" aparece muitas vezes quando a exibição de erros do php está desabilitada. Tente habilitar os erros ou procurar nos logs para identificar o que está ocorrendo. Acho que vai facilitar a resolução do problema.
CS

Nataniel,

vou habilitar!
CS

Nataniel,

agora mostrou o erro.

Notice: Undefined variable: old_items in /var/www/html/redesocial/app/control/cursos/CursoForm.class.php on line 567 array(8) { ["id"]=> string(2) "21" ["data_cadastro"]=> string(10) "2019-03-07" ["codigo_certificado"]=> string(8) "fsfhxdfh" ["frequencia"]=> string(1) "2" ["segunda_via"]=> string(4) "não" ["system_user_id"]=> string(1) "1" ["system_user_unit_id"]=> string(1) "1" ["curso_id"]=> string(2) "10" } Warning: Creating default object from empty value in /var/www/html/redesocial/app/control/cursos/CursoForm.class.php on line 603 Fatal error: Uncaught Error: Call to undefined method stdClass::store() in /var/www/html/redesocial/app/control/cursos/CursoForm.class.php:611 Stack trace: #0 [internal function]: CursoForm->onSave(Array) #1 /var/www/html/redesocial/lib/adianti/control/TPage.php(51): call_user_func(Array, Array) #2 /var/www/html/redesocial/lib/adianti/control/TPage.php(205): Adianti\Control\TPage->run() #3 /var/www/html/redesocial/app/control/cursos/CursoForm.class.php(655): Adianti\Control\TPage->show() #4 /var/www/html/redesocial/lib/adianti/core/AdiantiCoreApplication.php(62): CursoForm->show(Array) #5 /var/www/html/redesocial/engine.php(23): Adianti\Core\AdiantiCoreApplication::run(true) #6 /var/www/html/redesocial/engine.php(64): TApplication::run(true) #7 {main} thrown in /var/www/html/redesocial/app/control/cursos/CursoForm.class.php on line 611


Sabe do que se trata?
NR

Fatal error: Uncaught Error: Call to undefined method stdClass::store()
Esse erro quer dizer que está chamando a função store em um objeto genérico.
 
  1. <?php
  2. //$detail_Inscritos = $detail_Inscritos->fromArray($item_i);
  3. $detail_Inscritos->fromArray($item_i);
  4. ?>

A função fromArray não tem retorno, com isso a variável $detail_Inscritos estava sendo reescrita com null. Basta chamar a função, sem atribuir a outra variável.
CS

Nataniel,

era isso mesmo!

Agora estou tendo um problemas com isso $key = empty($data->detail_Inscritos_id) ? 'X'.mt_rand(1000000000, 1999999999) : $data->detail_Inscritos_id;

Está gerando uma chave primária não inteira.