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

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

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto Quero me inscrever agora!

Comentários (5)


NR

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

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

o código foi criado pelo adianti profissional.

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

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

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

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

Segue meu código

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