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

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


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


</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.