WF
Formulário mestre detalhe, com dois detalhes
Boa noite...
Estou precisando fazer um formulário de cadastro de clientes, que tenha dois "detalhes", ou seja, um onde possa cadastrar os contatos e outro as filiais.
Na parte visual até consegui colocar o formulário mestre detalhe, com os dois detalhes, mas não grava a área de baixo,
segue o código:
Estou precisando fazer um formulário de cadastro de clientes, que tenha dois "detalhes", ou seja, um onde possa cadastrar os contatos e outro as filiais.
Na parte visual até consegui colocar o formulário mestre detalhe, com os dois detalhes, mas não grava a área de baixo,
segue o código:
- <?php
- /**
- * cadastro_de_clientes Master/Detail
- * @author <your name here>
- */
- class cadastro_de_clientes extends TPage
- {
- protected $form; // form
- protected $detail_list;
- /**
- * Page constructor
- */
- public function __construct()
- {
- parent::__construct();
- // creates the form
- $this->form = new BootstrapFormBuilder('form_cliente');
- $this->form->setFormTitle('cliente');
- // master fields
- $id = new TEntry('id');
- $status = new TEntry('status');
- $cnpj = new TEntry('cnpj');
- $ie = new TEntry('ie');
- $im = new TEntry('im');
- $nome_fantasia = new TEntry('nome_fantasia');
- $rz_social = new TEntry('rz_social');
- $cep = new TEntry('cep');
- $endereco = new TEntry('endereco');
- $numero = new TEntry('numero');
- $complemento = new TEntry('complemento');
- $bairro = new TEntry('bairro');
- $uf = new TEntry('uf');
- $cidade_id = new TCombo('cidade_id', 'banco', 'cidade', 'id', 'nome');
- // detail fields
- $detail_id = new THidden('detail_id');
- $detail_nome = new TEntry('detail_nome');
- $detail_area_de_contato = new TEntry('detail_area_de_contato');
- $detail_email = new TEntry('detail_email');
- $detail_telefone = new TEntry('detail_telefone');
- $detail_radio = new TEntry('detail_radio');
- // filial fields
- $filial_id = new THidden('filial_id');
- $filial_cnpj = new TEntry('filial_cnpj');
- $filial_rz_social = new TEntry('filial_rz_social');
- $filial_nome_fantasia = new TEntry('filial_nome_fantasia');
- if (!empty($id))
- {
- $id->setEditable(FALSE);
- }
- // master fields
- $this->form->addFields( [new TLabel('Código')], [$id] );
- $this->form->addFields( [new TLabel('Status')], [$status] );
- $this->form->addFields( [new TLabel('CNPJ')], [$cnpj] );
- $this->form->addFields( [new TLabel('I.E')], [$ie] );
- $this->form->addFields( [new TLabel('I.M')], [$im] );
- $this->form->addFields( [new TLabel('Nome Fantasia')], [$nome_fantasia] );
- $this->form->addFields( [new TLabel('Razão Social')], [$rz_social] );
- $this->form->addFields( [new TLabel('CEP')], [$cep] );
- $this->form->addFields( [new TLabel('Endereço')], [$endereco] );
- $this->form->addFields( [new TLabel('Número')], [$numero] );
- $this->form->addFields( [new TLabel('Complemento')], [$complemento] );
- $this->form->addFields( [new TLabel('Bairro')], [$bairro] );
- $this->form->addFields( [new TLabel('U.F')], [$uf] );
- $this->form->addFields( [new TLabel('Cidade')], [$cidade_id] );
- // detail fields
- $this->form->addContent( ['<h4>Contatos</h4><hr>'] );
- $this->form->addFields( [$detail_id] );
- $this->form->addFields( [new TLabel('Nome')], [$detail_nome] );
- $this->form->addFields( [new TLabel('Área')], [$detail_area_de_contato] );
- $this->form->addFields( [new TLabel('Email')], [$detail_email] );
- $this->form->addFields( [new TLabel('Telefone')], [$detail_telefone] );
- $this->form->addFields( [new TLabel('Rádio')], [$detail_radio] );
- $add = TButton::create('add', [$this, 'onSaveDetail'], 'Register', 'fa:save');
- $this->form->addFields( [], [$add] )->style = 'background: whitesmoke; padding: 5px; margin: 1px;';
- $this->detail_list = new BootstrapDatagridWrapper(new TQuickGrid);
- $this->detail_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
- $this->detail_list->setId('cliente_list');
- // items
- $this->detail_list->addQuickColumn('Nome', 'nome', 'left', 100);
- $this->detail_list->addQuickColumn('Área', 'area_de_contato', 'left', 100);
- $this->detail_list->addQuickColumn('Email', 'email', 'left', 100);
- $this->detail_list->addQuickColumn('Telefone', 'telefone', 'left', 100);
- $this->detail_list->addQuickColumn('Rádio', 'radio', 'left', 100);
- // detail actions
- $this->detail_list->addQuickAction( 'Edit', new TDataGridAction([$this, 'onEditDetail']), 'id', 'fa:edit blue');
- $this->detail_list->addQuickAction( 'Delete', new TDataGridAction([$this, 'onDeleteDetail']), 'id', 'fa:trash red');
- $this->detail_list->createModel();
- $panel = new TPanelGroup;
- $panel->add($this->detail_list);
- $panel->getBody()->style = 'overflow-x:auto';
- $this->form->addContent( [$panel] );
- // filial fields
- $this->form->addContent( ['<h4>filiais</h4><hr>'] );
- $this->form->addFields( [$filial_id] );
- $this->form->addFields( [new TLabel('Cnpj')], [$filial_cnpj] );
- $this->form->addFields( [new TLabel('Rz Social')], [$filial_rz_social] );
- $this->form->addFields( [new TLabel('Nome Fantasia')], [$filial_nome_fantasia] );
- $addd = TButton::create('addd', [$this, 'onSavefilial'], 'Register', 'fa:save');
- $this->form->addFields( [], [$addd] )->style = 'background: whitesmoke; padding: 5px; margin: 1px;';
- $this->filial_list = new BootstrapDatagridWrapper(new TQuickGrid);
- $this->filial_list->style = "min-width: 700px; width:100%;margin-bottom: 10px";
- $this->filial_list->setId('cliente_list');
- // items
- $this->filial_list->addQuickColumn('Cnpj', 'cnpj', 'left', 100);
- $this->filial_list->addQuickColumn('Rz Social', 'rz_social', 'left', 100);
- $this->filial_list->addQuickColumn('Nome Fantasia', 'nome_fantasia', 'left', 100);
- // filial actions
- $this->filial_list->addQuickAction( 'Edit', new TDataGridAction([$this, 'onEditfilial']), 'id', 'fa:edit blue');
- $this->filial_list->addQuickAction( 'Delete', new TDataGridAction([$this, 'onDeletefilial']), 'id', 'fa:trash red');
- $this->filial_list->createModel();
- $painel = new TPanelGroup;
- $painel->add($this->filial_list);
- $painel->getBody()->style = 'overflow-x:auto';
- $this->form->addContent( [$painel] );
- $btn = $this->form->addAction( _t('Save'), new TAction([$this, 'onSave']), 'fa:save');
- $btn->class = 'btn btn-sm btn-primary';
- $this->form->addAction( _t('Clear'), new TAction([$this, 'onClear']), 'fa:eraser red');
- // create the page container
- $container = new TVBox;
- $container->style = 'width: 90%';
- $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
- $container->add($this->form);
- parent::add($container);
- }
- /**
- * Clear form
- * @param $param URL parameters
- */
- public function onClear($param)
- {
- $this->form->clear(TRUE);
- TSession::setValue(__CLASS__.'_items', array());
- $this->onReload( $param );
- }
- public function onSavefilial( $param )
- {
- try
- {
- TTransaction::open('banco');
- $data = $this->form->getData();
- /** validation sample
- if (empty($data->fieldX))
- {
- throw new Exception('The field fieldX is required');
- }
- **/
- $item = TSession::getValue(__CLASS__.'_item');
- $key = empty($data->filial_id) ? 'X'.mt_rand(1000000000, 1999999999) : $data->filial_id;
- $item[ $key ] = array();
- $item[ $key ]['id'] = $key;
- $item[ $key ]['cnpj'] = $data->filial_cnpj;
- $item[ $key ]['rz_social'] = $data->filial_rz_social;
- $item[ $key ]['nome_fantasia'] = $data->filial_nome_fantasia;
- TSession::setValue(__CLASS__.'_items', $items);
- // clear filial form fields
- $data->filial_id = '';
- $data->filial_cnpj = '';
- $data->filial_rz_social = '';
- $data->filial_nome_fantasia = '';
- TTransaction::close();
- $this->form->setData($data);
- $this->onReload( $param ); // reload the items
- }
- catch (Exception $e)
- {
- $this->form->setData( $this->form->getData());
- new TMessage('error', $e->getMessage());
- }
- }
- /**
- * Load an item from session list to filial form
- * @param $param URL parameters
- */
- public static function onEditfilial( $param )
- {
- // read session items
- $items = TSession::getValue(__CLASS__.'_items');
- // get the session item
- $item = $items[ $param['key'] ];
- $data = new stdClass;
- $data->filial_id = $item['id'];
- $data->filial_cnpj = $item['cnpj'];
- $data->filial_rz_social = $item['rz_social'];
- $data->filial_nome_fantasia = $item['nome_fantasia'];
- // fill filial fields
- TForm::sendData( 'form_cliente', $data );
- }
- /**
- * Delete an item from session list
- * @param $param URL parameters
- */
- public static function onDeletefilial( $param )
- {
- // reset items
- $data = new stdClass;
- $data->filial_cnpj = '';
- $data->filial_rz_social = '';
- $data->filial_nome_fantasia = '';
- // clear form data
- TForm::sendData('form_cliente', $data );
- // read session items
- $items = TSession::getValue(__CLASS__.'_items');
- // get filial id
- $filial_id = $param['key'];
- // delete the item from session
- unset($items[ $filial_id ] );
- // rewrite session items
- TSession::setValue(__CLASS__.'_items', $items);
- // delete item from screen
- TScript::create("ttable_remove_row_by_id('cliente_list', '{$filial_id}')");
- }
- /**
- * Save an item from form to session list
- * @param $param URL parameters
- */
- public function onSaveDetail( $param )
- {
- try
- {
- TTransaction::open('banco');
- $data = $this->form->getData();
- /** validation sample
- if (empty($data->fieldX))
- {
- throw new Exception('The field fieldX is required');
- }
- **/
- $items = TSession::getValue(__CLASS__.'_items');
- $key = empty($data->detail_id) ? 'X'.mt_rand(1000000000, 1999999999) : $data->detail_id;
- $items[ $key ] = array();
- $items[ $key ]['id'] = $key;
- $items[ $key ]['nome'] = $data->detail_nome;
- $items[ $key ]['area_de_contato'] = $data->detail_area_de_contato;
- $items[ $key ]['email'] = $data->detail_email;
- $items[ $key ]['telefone'] = $data->detail_telefone;
- $items[ $key ]['radio'] = $data->detail_radio;
- TSession::setValue(__CLASS__.'_items', $items);
- // clear detail form fields
- $data->detail_id = '';
- $data->detail_nome = '';
- $data->detail_area_de_contato = '';
- $data->detail_email = '';
- $data->detail_telefone = '';
- $data->detail_radio = '';
- TTransaction::close();
- $this->form->setData($data);
- $this->onReload( $param ); // reload the items
- }
- catch (Exception $e)
- {
- $this->form->setData( $this->form->getData());
- new TMessage('error', $e->getMessage());
- }
- }
- /**
- * Load an item from session list to detail form
- * @param $param URL parameters
- */
- public static function onEditDetail( $param )
- {
- // read session items
- $items = TSession::getValue(__CLASS__.'_items');
- // get the session item
- $item = $items[ $param['key'] ];
- $data = new stdClass;
- $data->detail_id = $item['id'];
- $data->detail_nome = $item['nome'];
- $data->detail_area_de_contato = $item['area_de_contato'];
- $data->detail_email = $item['email'];
- $data->detail_telefone = $item['telefone'];
- $data->detail_radio = $item['radio'];
- // fill detail fields
- TForm::sendData( 'form_cliente', $data );
- }
- /**
- * Delete an item from session list
- * @param $param URL parameters
- */
- public static function onDeleteDetail( $param )
- {
- // reset items
- $data = new stdClass;
- $data->detail_nome = '';
- $data->detail_area_de_contato = '';
- $data->detail_email = '';
- $data->detail_telefone = '';
- $data->detail_radio = '';
- // clear form data
- TForm::sendData('form_cliente', $data );
- // read session items
- $items = TSession::getValue(__CLASS__.'_items');
- // get detail id
- $detail_id = $param['key'];
- // delete the item from session
- unset($items[ $detail_id ] );
- // rewrite session items
- TSession::setValue(__CLASS__.'_items', $items);
- // delete item from screen
- TScript::create("ttable_remove_row_by_id('cliente_list', '{$detail_id}')");
- }
- /**
- * Load the items list from session
- * @param $param URL parameters
- */
- public function onReload($param)
- {
- // read session items
- $items = TSession::getValue(__CLASS__.'_items');
- $this->detail_list->clear(); // clear detail list
- if ($items)
- {
- foreach ($items as $list_item)
- {
- $item = (object) $list_item;
- $row = $this->detail_list->addItem( $item );
- $row->id = $list_item['id'];
- }
- }
- $this->loaded = TRUE;
- }
- /**
- * Load Master/Detail data from database to form/session
- */
- public function onEdit($param)
- {
- try
- {
- TTransaction::open('banco');
- if (isset($param['key']))
- {
- $key = $param['key'];
- $object = new cliente($key);
- $items = contato_clientes::where('cliente_id', '=', $key)->load();
- $session_items = array();
- foreach( $items as $item )
- {
- $item_key = $item->id;
- $session_items[$item_key] = $item->toArray();
- $session_items[$item_key]['id'] = $item->id;
- $session_items[$item_key]['nome'] = $item->nome;
- $session_items[$item_key]['area_de_contato'] = $item->area_de_contato;
- $session_items[$item_key]['email'] = $item->email;
- $session_items[$item_key]['telefone'] = $item->telefone;
- $session_items[$item_key]['radio'] = $item->radio;
- }
- TSession::setValue(__CLASS__.'_items', $session_items);
- $this->form->setData($object); // fill the form with the active record data
- $this->onReload( $param ); // reload items list
- TTransaction::close(); // close transaction
- }
- else
- {
- $this->form->clear(TRUE);
- TSession::setValue(__CLASS__.'_items', null);
- $this->onReload( $param );
- }
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage());
- TTransaction::rollback();
- }
- }
- /**
- * Save the Master/Detail data from form/session to database
- */
- public function onSave()
- {
- try
- {
- // open a transaction with database
- TTransaction::open('banco');
- $data = $this->form->getData();
- $master = new cliente;
- $master->fromArray( (array) $data);
- $this->form->validate(); // form validation
- $master->store(); // save master object
- // delete details
- $old_items = contato_clientes::where('cliente_id', '=', $master->id)->load();
- $keep_items = array();
- // get session items
- $items = TSession::getValue(__CLASS__.'_items');
- if( $items )
- {
- foreach( $items as $item )
- {
- if (substr($item['id'],0,1) == 'X' ) // new record
- {
- $detail = new contato_clientes;
- }
- else
- {
- $detail = contato_clientes::find($item['id']);
- }
- $detail->nome = $item['nome'];
- $detail->area_de_contato = $item['area_de_contato'];
- $detail->email = $item['email'];
- $detail->telefone = $item['telefone'];
- $detail->radio = $item['radio'];
- $detail->cliente_id = $master->id;
- $detail->store();
- $keep_items[] = $detail->id;
- }
- }
- if ($old_items)
- {
- foreach ($old_items as $old_item)
- {
- if (!in_array( $old_item->id, $keep_items))
- {
- $old_item->delete();
- }
- }
- }
- TTransaction::close(); // close the transaction
- // reload form and session items
- $this->onEdit(array('key'=>$master->id));
- new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage());
- $this->form->setData( $this->form->getData() ); // keep form data
- TTransaction::rollback();
- }
- }
- /**
- * Show the page
- */
- public function show()
- {
- // check if the datagrid is already loaded
- if (!$this->loaded AND (!isset($_GET['method']) OR $_GET['method'] !== 'onReload') )
- {
- $this->onReload( func_get_arg(0) );
- }
- parent::show();
- }
- }
Os dados dos detalhes são salvos temporiamente na sessão. Cada detalhe precisa de uma chave específica para essa gravação. Aparentemente está usando a mesma para os dois:
Além disso você vai ter que duplicar os tratamentos em alguns funções. Na onReload por exemplo, que é quem exibe os detalhes nas grids, você precisa adicionar mais um foreach para os itens do segundo detalhe. Mesma coisa na onSave, onEdit, etc.
Olá Wempar.
Passei pelo mesmo processo que voce. Estão faltando alguns detalhes no seu form. começando lá em cima com a falta de uma variével para as filiais
ficaria assim:
e mais alguns outros detalhes.
Vou passar aqui meu código na integra pra voce dar uma olhada e adequar para sua necessidade.
</your>
Esse meu sistema é multiempresa, então voce vai ver alguns códigos aí que fazem parte do tratamento dos dados, para não aparecer dados de uma empresa em outra.
Boa noite...
Eu entendi que precisam ser dados os devidos nomes para cada um dos grupos que quero trabalhar.
Não consegui ler direito o seu código. Mas obrigado por tentar ajudar.
Mas não sei direito o que ajustar no código, vou tentar praticar em um exemplo mais simples, com apenas dois campos.
Boa noite...
Agora que piorou tudo,
Sem sucesso. Vou colocar o código de novo.
É por aí mesmo. Faltou fazer a mesma coisa na função onEdit e onSave. E também, na função onReload tem um foreach errado:
Passei por isso, olha nesse link.
www.adianti.com.br/forum/pt/view_4734
Bom dia...
Pessoal obrigado pelas ajudas, não tive tempo para responder, mas a primeira parte está funcionando sim, já não há tantos erros.
Muito agradecido a todos.