Lançado Adianti Framework 8.1!
Clique aqui para saber mais
Formulário Mestre Detalhe Boa Tarde; Estou enfrentando um problema com esse formulário, o mesmo ao cadastrar as informações inseridas, caso saia do cadastro entre novamente os registros permanecem no detalhe. Alguem sabe como resolver essa situação?...
PP
Formulário Mestre Detalhe  
Boa Tarde;


Estou enfrentando um problema com esse formulário, o mesmo ao cadastrar as informações inseridas, caso saia do cadastro entre novamente os registros permanecem no detalhe.

Alguem sabe como resolver essa situação?

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (5)


NR

Na função onEdit os detalhes são apagados quando se trata se um novo registro:
  1. <?php
  2. if (isset($param['key']))
  3. {
  4.    ...
  5. }
  6. else
  7. {
  8.      $this->form->clear(TRUE);
  9.      TSession::setValue(__CLASS__.'_items'null); // aqui limpa os dados
  10.      $this->onReload$param );
  11. }
  12. ?>

Você modificou algo na onEdit?
PP

Bom Dia Nataniel

Não modifiquei nada
estou com problema nesse formulário mestre detalhe pois quando eu clico em editar mas não edito não chego a salvar a edição, e volto pra um novo cadastro os itens do detalhe continuam aparecendo acho que é algum problema no onReload

segue o código

  1. <?php
  2. /**
  3.  * ModeloForm Master/Detail
  4.  * @author  <your name here>
  5.  */
  6. class ModeloForm extends TPage
  7. {
  8.     protected $form// form
  9.     protected $formFields;
  10.     protected $detail_list;
  11.     
  12.     /**
  13.      * Page constructor
  14.      */
  15.     public function __construct()
  16.     {
  17.         parent::__construct();
  18.         
  19.         // creates the form
  20.         $this->form = new TForm('form_Modelo');
  21.         $this->form->class 'tform'// CSS class
  22.         $this->form->style 'max-width:100%'// style
  23.         parent::include_css('app/resources/custom-frame.css');
  24.         
  25.         $table_master = new TTable;
  26.         $table_master->width '100%';
  27.         
  28.         $table_master->addRowSet( new TLabel('Cadastro de Modelo'), '''')->class 'tformtitle';
  29.         
  30.         // add a table inside form
  31.         $table_general = new TTable;
  32.         $table_detail  = new TTable;
  33.         $table_general-> width '100%';
  34.         $table_detail-> width  '100%';
  35.         
  36.         $frame_general = new TFrame;
  37.         $frame_general->setLegend('Modelo');
  38.         $frame_general->style 'background:whiteSmoke';
  39.         $frame_general->add($table_general);
  40.         
  41.         $table_master->addRow()->addCell$frame_general )->colspan=2;
  42.         $row $table_master->addRow();
  43.         $row->addCell$table_detail );
  44.         
  45.         $this->form->add($table_master);
  46.         
  47.         // master fields
  48.         $id = new TEntry('id');
  49.         $nomeCompleto = new TEntry('nomeCompleto');
  50.         $nomeModelo = new TEntry('nomeModelo');
  51.         $genero = new TCombo('genero');
  52.         $dtNascimento = new TDate('dtNascimento');
  53.         $eMail = new TEntry('eMail');
  54.         $url = new TEntry('url');
  55.         $indAtivo = new TCombo('indAtivo');
  56.         $senha = new TEntry('senha');
  57.         $categoria = new TCombo('categoria');
  58.         
  59.         //set size
  60.         $nomeCompleto->setSize('100%');
  61.         $nomeModelo->setSize('100%');
  62.         $genero->setSize('100%');
  63.         $dtNascimento->setSize('100%');
  64.         $eMail->setSize('100%');
  65.         $url->setSize('100%');
  66.         $indAtivo->setSize('100%');
  67.         $senha->setSize('100%');
  68.         $categoria->setSize('100%');          
  69.         
  70.         // set validação
  71.         $nomeCompleto->addValidation('Nome Completo', new TRequiredValidator);
  72.         $nomeModelo->addValidation('Nome Fantasia', new TRequiredValidator);
  73.         $genero->addValidation('Genero', new TRequiredValidator);
  74.         $dtNascimento->addValidation('Data de Nascimento', new TDateValidator18);
  75.         $eMail->addValidation('Email', new TEmailValidator);
  76.         $indAtivo->addValidation('Ativo', new TRequiredValidator);
  77.         $categoria->addValidation('Categoria', new TRequiredValidator);        
  78.         
  79.         // set valores
  80.         $indAtivo->addItems(['1' => 'Sim''0' => 'Não']);
  81.         $genero->addItems(['1' => 'Masculino''0' => 'Feminino']);
  82.         
  83.         // popular categoria
  84.         TTransaction::open('sample');
  85.         $repositorio = new TRepository('TabAuxiliar');
  86.         $criteria = new TCriteria();
  87.         $criteria->add(new TFilter('codTabela''='500));
  88.         $criteria->add(new TFilter('itemTabela''>'0));
  89.         $registro $repositorio->load($criteria);
  90.         $itens = array();
  91.         foreach($registro as $registros){
  92.             $itens[$registros->id] = $registros->descricao;
  93.         }
  94.         $categoria->addItems($itens);
  95.         TTransaction::close();          
  96.         
  97.         if (!empty($id))
  98.         {
  99.             $id->setEditable(FALSE);
  100.         }
  101.         
  102.         // detail fields
  103.         $detail_id = new THidden('detail_id');
  104.         $detail_numTelefone = new TEntry('detail_numTelefone');
  105.         $detail_operadora = new TCombo('detail_operadora');
  106.         // set mask
  107.         // $dtNascimento->setMasck('dd/mm/yyyy');
  108.         $detail_numTelefone->setMask('(99)99999-9999');
  109.         
  110.         // set valores operador
  111.         TTransaction::open('sample');
  112.         $repositorio = new TRepository('TabAuxiliar');
  113.         $criteria = new TCriteria();
  114.         $criteria->add(new TFilter('codTabela''='600));
  115.         $criteria->add(new TFilter('itemTabela''>'0));
  116.         $registro $repositorio->load($criteria);
  117.         $itens = array();
  118.         foreach($registro as $registros){
  119.             $itens[$registros->id] = $registros->descricao;
  120.         }
  121.         $detail_operadora->addItems($itens);
  122.         TTransaction::close();
  123.         /** samples
  124.          $this->form->addQuickFields('Date', array($date1, new TLabel('to'), $date2)); // side by side fields
  125.          $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
  126.          $fieldX->setSize( 100, 40 ); // set size
  127.          **/
  128.         
  129.         // master
  130.         $table_general->addRowSet( new TLabel('Id'), $id );
  131.         $table_general->addRowSet( new TLabel('* Nome Completo'), $nomeCompleto );
  132.         $table_general->addRowSet( new TLabel('* Nome Artistico'), $nomeModelo );
  133.         $table_general->addRowSet( new TLabel('* Gênero'), $genero );
  134.         $table_general->addRowSet( new TLabel('* Data de Nascimento'), $dtNascimento );
  135.         $table_general->addRowSet( new TLabel('* Email'), $eMail );
  136.         $table_general->addRowSet( new TLabel('Url'), $url );
  137.         $table_general->addRowSet( new TLabel('* Ativar Modelo'), $indAtivo );
  138.         $table_general->addRowSet( new TLabel('* Senha'), $senha );
  139.         $table_general->addRowSet( new TLabel('* Categoria'), $categoria );
  140.         
  141.          // detail
  142.         $frame_details = new TFrame();
  143.         $frame_details->setLegend('Telefone');
  144.         $row $table_detail->addRow();
  145.         $row->addCell($frame_details);
  146.         
  147.         $btn_save_detail = new TButton('btn_save_detail');
  148.         $btn_save_detail->setAction(new TAction(array($this'onSaveDetail')), 'Adicionar Telefone');
  149.         $btn_save_detail->setImage('fa:save');
  150.         
  151.         $table_details = new TTable;
  152.         $frame_details->add($table_details);
  153.         
  154.         $table_details->addRowSet''$detail_id );
  155.         $table_details->addRowSet( new TLabel('Telefone'), $detail_numTelefone );
  156.         $table_details->addRowSet( new TLabel('Operadora'), $detail_operadora );
  157.         
  158.         $table_details->addRowSet$btn_save_detail );
  159.         
  160.         $this->detail_list = new TQuickGrid;
  161.         $this->detail_list->setHeight175 );
  162.         $this->detail_list->makeScrollable();
  163.         $this->detail_list->disableDefaultClick();
  164.         $this->detail_list->addQuickColumn('''edit''left'50);
  165.         $this->detail_list->addQuickColumn('''delete''left'50);
  166.         
  167.         // items
  168.         $this->detail_list->addQuickColumn('Telefone''numTelefone''left'200);
  169.         $this->detail_list->addQuickColumn('Operadora''operadora''left'100);
  170.         $this->detail_list->createModel();
  171.         
  172.         $row $table_detail->addRow();
  173.         $row->addCell($this->detail_list);
  174.         
  175.         // create an action button (save)
  176.         $save_button=new TButton('save');
  177.         $save_button->setAction(new TAction(array($this'onSave')), _t('Save'));
  178.         $save_button->setImage('ico_save.png');
  179.         // create an new button (edit with no parameters)
  180.         $new_button=new TButton('new');
  181.         $new_button->setAction(new TAction(array($this'onClear')), _t('New'));
  182.         $new_button->setImage('ico_new.png');
  183.         
  184.         // define form fields
  185.         $this->formFields   = array($id,$nomeCompleto,$nomeModelo,$genero,$dtNascimento,$eMail,$url,$indAtivo,$senha,$categoria,$detail_numTelefone,$detail_operadora);
  186.         $this->formFields[] = $btn_save_detail;
  187.         $this->formFields[] = $save_button;
  188.         $this->formFields[] = $new_button;
  189.         $this->formFields[] = $detail_id;
  190.         $this->form->setFields$this->formFields );
  191.         
  192.         $table_master->addRowSet( array($save_button$new_button), '''')->class 'tformaction'// CSS class
  193.         
  194.         // create the page container
  195.         $container = new TVBox;
  196.         $container->style 'width: 100%';
  197.         $container->add(new TXMLBreadCrumb('menu.xml'__CLASS__));
  198.         $container->add($this->form);
  199.         parent::add($container);
  200.     }
  201.     
  202.     
  203.     /**
  204.      * Clear form
  205.      * @param $param URL parameters
  206.      */
  207.     public function onClear($param)
  208.     {
  209.         $this->form->clear(TRUE);
  210.         $this->form->clear();
  211.         TSession::setValue(__CLASS__.'_items', array());
  212.         $this->onReload$param );
  213.     }
  214.     
  215.     /**
  216.      * Save an item from form to session list
  217.      * @param $param URL parameters
  218.      */
  219.     public function onSaveDetail$param )
  220.     {
  221.         try
  222.         {
  223.             TTransaction::open('sample');
  224.             $data $this->form->getData();
  225.             
  226.             /** validation sample
  227.             if (! $data->fieldX)
  228.                 throw new Exception('The field fieldX is required');
  229.             **/
  230.             
  231.             $items TSession::getValue(__CLASS__.'_items');
  232.             $key = empty($data->detail_id) ? 'X'.mt_rand(10000000001999999999) : $data->detail_id;
  233.             
  234.             $items$key ] = array();
  235.             $items$key ]['id'] = $key;
  236.             $items$key ]['numTelefone'] = $data->detail_numTelefone;
  237.             $items$key ]['operadora'] = $data->detail_operadora;
  238.             
  239.             TSession::setValue(__CLASS__.'_items'$items);
  240.             
  241.             // clear detail form fields
  242.             $data->detail_id '';
  243.             $data->detail_numTelefone '';
  244.             $data->detail_operadora '';
  245.             
  246.             TTransaction::close();
  247.             $this->form->setData($data);
  248.             
  249.             $this->onReload$param ); // reload the items
  250.         }
  251.         catch (Exception $e)
  252.         {
  253.             $this->form->setData$this->form->getData());
  254.             new TMessage('error'$e->getMessage());
  255.         }
  256.     }
  257.     
  258.     /**
  259.      * Load an item from session list to detail form
  260.      * @param $param URL parameters
  261.      */
  262.     public function onEditDetail$param )
  263.     {
  264.         $data $this->form->getData();
  265.         
  266.         // read session items
  267.         $items TSession::getValue(__CLASS__.'_items');
  268.         
  269.         // get the session item
  270.         $item $items$param['item_key'] ];
  271.         
  272.         $data->detail_id $item['id'];
  273.         $data->detail_numTelefone $item['numTelefone'];
  274.         $data->detail_operadora $item['operadora'];
  275.         
  276.         // fill detail fields
  277.         $this->form->setData$data );
  278.     
  279.         $this->onReload$param );
  280.     }
  281.     
  282.     /**
  283.      * Delete an item from session list
  284.      * @param $param URL parameters
  285.      */
  286.     public function onDeleteDetail$param )
  287.     {
  288.         $data $this->form->getData();
  289.         
  290.         // reset items
  291.             $data->detail_numTelefone '';
  292.             $data->detail_operadora '';
  293.         
  294.         // clear form data
  295.         $this->form->setData$data );
  296.         
  297.         // read session items
  298.         $items TSession::getValue(__CLASS__.'_items');
  299.         
  300.         // delete the item from session
  301.         unset($items$param['item_key'] ] );
  302.         TSession::setValue(__CLASS__.'_items'$items);
  303.         
  304.         // reload items
  305.         $this->onReload$param );
  306.     }
  307.     
  308.     
  309.     /**
  310.      * Load the items list from session
  311.      * @param $param URL parameters
  312.      */
  313.     public function onReload($param)
  314.     {
  315.         // read session items
  316.         $items TSession::getValue(__CLASS__.'_items');
  317.         
  318.         $this->detail_list->clear(); // clear detail list
  319.         $data $this->form->getData();
  320.         
  321.         if ($items)
  322.         {
  323.             $cont 1;
  324.             foreach ($items as $list_item_key => $list_item)
  325.             {
  326.                 $item_name 'prod_' $cont++;
  327.                 $item = new StdClass;
  328.                 
  329.                 // create action buttons
  330.                 $action_del = new TAction(array($this'onDeleteDetail'));
  331.                 $action_del->setParameter('item_key'$list_item_key);
  332.                 
  333.                 $action_edi = new TAction(array($this'onEditDetail'));
  334.                 $action_edi->setParameter('item_key'$list_item_key);
  335.                 
  336.                 $button_del = new TButton('delete_detail'.$cont);
  337.                 $button_del->class 'btn btn-default btn-sm';
  338.                 $button_del->setAction$action_del'' );
  339.                 $button_del->setImage('fa:trash-o red fa-lg');
  340.                 
  341.                 $button_edi = new TButton('edit_detail'.$cont);
  342.                 $button_edi->class 'btn btn-default btn-sm';
  343.                 $button_edi->setAction$action_edi'' );
  344.                 $button_edi->setImage('fa:edit blue fa-lg');
  345.                 
  346.                 $item->edit   $button_edi;
  347.                 $item->delete $button_del;
  348.                 
  349.                 $this->formFields$item_name.'_edit' ] = $item->edit;
  350.                 $this->formFields$item_name.'_delete' ] = $item->delete;
  351.                 
  352.                 // items
  353.                 $item->id $list_item['id'];
  354.                 $item->numTelefone $list_item['numTelefone'];
  355.                 $item->operadora $list_item['operadora'];
  356.                 
  357.                 $row $this->detail_list->addItem$item );
  358.                 $row->onmouseover='';
  359.                 $row->onmouseout='';
  360.             }
  361.             $this->form->setFields$this->formFields );
  362.         }
  363.             $this->loaded TRUE;
  364.     }
  365.     
  366.     /**
  367.      * Load Master/Detail data from database to form/session
  368.      */
  369.     public function onEdit($param)
  370.     {
  371.         try
  372.         {
  373.             TTransaction::open('sample');
  374.             
  375.             if (isset($param['key']))
  376.             {
  377.                 $key $param['key'];
  378.                 
  379.                 $object = new Modelo($key);
  380.                 $items  Telefone::where('modelo_id''='$key)->load();
  381.                 
  382.                 $session_items = array();
  383.                 foreach( $items as $item )
  384.                 {
  385.                     $item_key $item->id;
  386.                     $session_items[$item_key] = $item->toArray();
  387.                     $session_items[$item_key]['id'] = $item->id;
  388.                     $session_items[$item_key]['numTelefone'] = $item->numTelefone;
  389.                     $session_items[$item_key]['operadora'] = $item->operadora;
  390.                 }
  391.                 TSession::setValue(__CLASS__.'_items'$session_items);
  392.                 
  393.                 $this->form->setData($object); // fill the form with the active record data
  394.                 $this->onReload$param ); // reload items list
  395.                 TTransaction::close(); // close transaction
  396.             }
  397.             else
  398.             {
  399.                 $this->form->clear(TRUE);
  400.                 TSession::setValue(__CLASS__.'_items'null);
  401.                 $this->onReload$param );
  402.             }
  403.         }
  404.         catch (Exception $e// in case of exception
  405.         {
  406.             new TMessage('error'$e->getMessage());
  407.             TTransaction::rollback();
  408.         }
  409.     }
  410.     
  411.     /**
  412.      * Save the Master/Detail data from form/session to database
  413.      */
  414.     public function onSave()
  415.     {
  416.         try
  417.         {
  418.             // open a transaction with database
  419.             TTransaction::open('sample');
  420.             
  421.             $data $this->form->getData();
  422.             $master = new Modelo;
  423.             $master->fromArray( (array) $data);
  424.             $this->form->validate(); // form validation
  425.             
  426.             $master->store(); // save master object
  427.             // delete details
  428.             $old_items Telefone::where('modelo_id''='$master->id)->load();
  429.             
  430.             $keep_items = array();
  431.             
  432.             // get session items
  433.             $items TSession::getValue(__CLASS__.'_items');
  434.             
  435.             if( $items )
  436.             {
  437.                 foreach( $items as $item )
  438.                 {
  439.                     if (substr($item['id'],0,1) == 'X' // new record
  440.                     {
  441.                         $detail = new Telefone;
  442.                     }
  443.                     else
  444.                     {
  445.                         //$detail = Telefone::find($item['id']);
  446.                         $detail = new Telefone;
  447.                         $detail->id $item['id'];
  448.                     }
  449.                     $detail->numTelefone  $item['numTelefone'];
  450.                     $detail->operadora  $item['operadora'];
  451.                     $detail->modelo_id $master->id;
  452.                     $detail->store();
  453.                     
  454.                     $keep_items[] = $detail->id;
  455.                 }
  456.             }
  457.             
  458.             if ($old_items)
  459.             {
  460.                 foreach ($old_items as $old_item)
  461.                 {
  462.                     if (!in_array$old_item->id$keep_items))
  463.                     {
  464.                         $old_item->delete();
  465.                     }
  466.                 }
  467.             }
  468.             TTransaction::close(); // close the transaction
  469.             
  470.             // reload form and session items
  471.             $this->onEdit(array('key'=>$master->id));
  472.             
  473.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  474.             
  475.             $this->onClear();
  476.             
  477.         }
  478.         catch (Exception $e// in case of exception
  479.         {
  480.             new TMessage('error'$e->getMessage());
  481.             $this->form->setData$this->form->getData() ); // keep form data
  482.             TTransaction::rollback();
  483.         }
  484.     }
  485.     
  486.     /**
  487.      * Show the page
  488.      */
  489.     public function show()
  490.     {
  491.         // check if the datagrid is already loaded
  492.         if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
  493.         {
  494.             $this->onReloadfunc_get_arg(0) );
  495.         }
  496.         parent::show();
  497.     }
  498. }
  499. ?>
</your>
NR

Qual função está sendo chamada quando você diz que "volta para um novo cadastro"?

Você está com mais de uma aba aberta?
PP

Boa Noite Nataniel

Grato pela atenção mas ja resolvi o problema.
MM

boa tarde! como você conseguir resolver Pablo Leandro??

estou com o mesmo problema.