MA
Problema com preenchimento de cache: puxando dados de cache de acessado anteriormente
Prezado(a), boa tarde.
A página web contém três forms, contato, telefone de contato e empreendimento. Essa página está com alguns problemas relacionado ao carregamento de cache, principalmente o forms tefone de contato, que apresenta determinada instabilidade.
Por exemplo, realizo a edição de um objeto, com dados próprios dele. Quando acesso a edição logo em seguida, de outro registro, os dados são puxados do registro acessado anteriormente, mesmo que no banco esteja outros dados (dados corretos). Ou seja, o cache do outro objeto é puxado no form de telefone de contato. Esse problema de cache ocorre somente em telefone de contato, o restante dos formulários são puxados corretamente.
A única forma de limpar esse cache é usando Ctrl + F5.
Realizando o passo novamente, continua puxando os dados do objeto que foi acesso anteriormente, que acontece apenas com o telefone de contato.
Como esse problema poderia ser solucionado? Tentei algumas funções de limpeza de cache do próprio PHP, mas sem sucesso também.
Segue abaixo o código fonte.
Aguardo retorno.
A página web contém três forms, contato, telefone de contato e empreendimento. Essa página está com alguns problemas relacionado ao carregamento de cache, principalmente o forms tefone de contato, que apresenta determinada instabilidade.
Por exemplo, realizo a edição de um objeto, com dados próprios dele. Quando acesso a edição logo em seguida, de outro registro, os dados são puxados do registro acessado anteriormente, mesmo que no banco esteja outros dados (dados corretos). Ou seja, o cache do outro objeto é puxado no form de telefone de contato. Esse problema de cache ocorre somente em telefone de contato, o restante dos formulários são puxados corretamente.
A única forma de limpar esse cache é usando Ctrl + F5.
Realizando o passo novamente, continua puxando os dados do objeto que foi acesso anteriormente, que acontece apenas com o telefone de contato.
Como esse problema poderia ser solucionado? Tentei algumas funções de limpeza de cache do próprio PHP, mas sem sucesso também.
Segue abaixo o código fonte.
Aguardo retorno.
- <?php
- /**
- * ContatoForm Master/Detail
- * @author <your name here>
- */
- class ContatoForm extends TPage
- {
- protected $form; // form
- protected $formFields;
- protected $detail_list;
- protected $fieldlist;
- /**
- * Page constructor
- */
- public function __construct()
- {
- parent::__construct();
- // creates the form
- $this->form = new TForm('form_Contato');
- $this->form->class = 'tform'; // CSS class
- $this->form->style = 'width:700px'; // style
- parent::include_css('app/resources/custom-frame.css');
- $table_master = new TTable;
- $table_master->width = '100%';
- $table_master->addRowSet( new TLabel('Contato'), '', '')->class = 'tformtitle';
- // add a table inside form
- $table_general = new TTable;
- $table_detail = new TTable;
- $table_general-> width = '100%';
- $table_detail-> width = '100%';
- $frame_general = new TFrame;
- $frame_general->setLegend('Contato');
- $frame_general->style = 'background:white';
- $frame_general->add($table_general);
- $table_master->addRow()->addCell( $frame_general );
- $row = $table_master->addRow();
- $row->addCell( $table_detail );
- $hbox2 = new THBox;
- $row = $table_master->addRow();
- $row->addCell( $hbox2 );
- $this->form->add($table_master);
- // master fields
- $id = new TEntry('id');
- $tipo = new TEntry('tipo');
- $nome = new TEntry('nome');
- $estado = new TDBCombo('estado_id','sqlserver','Estado','cod_estado','nom_estado');
- $cidade = new TCombo('cidade');
- $funcao = new TEntry('funcao');
- $horario = new TEntry('horario');
- $obs = new TText('obs');
- //adiciona as validações
- $tipo->addValidation('Cargo / Função', new TRequiredValidator);
- $funcao->addValidation('Empresa', new TRequiredValidator);
- $nome->addValidation('Nome', new TRequiredValidator);
- $estado->addValidation('Estado', new TRequiredValidator);
- $cidade->addValidation('Cidade', new TRequiredValidator);
- $id->setSize('100');
- $estado->setSize('300');
- $cidade->setSize('300');
- $nome->setSize('300');
- $nome->title = "Nome do contato";
- $funcao->setSize('300');
- $tipo->setSize('300');
- $tipo->title = 'Função exercida pelo contato na empresa';
- $funcao->title = "Empresa em que o contato trabalha";
- $horario->setSize('300');
- $horario->title = "Horário de atendimento";
- $obs->setSize('300');
- // set change action for empreendimento
- $change_action = new TAction(array($this, 'onChange'));
- $estado->setChangeAction($change_action);
- //$tipo->addItems(array( 'Parceiro' => 'Parceiro', 'Funcionario' => 'Funcionario'));
- if (!empty($id))
- {
- $id->setEditable(FALSE);
- }
- // detail fields
- $detail_id = new THidden('detail_id');
- $detail_descricao = new TEntry('detail_descricao');
- $detail_numero = new TEntry('detail_numero');
- $detail_obs = new TText('detail_obs');
- $detail_descricao->setSize('300');
- $detail_descricao->placeholder = "Fixo";
- $detail_numero->setSize('300');
- $detail_numero->placeholder = "(99)99999-9999";
- //$detail_numero->setMask('(99)999999999');
- $detail_obs->setSize('300');
- /** samples
- $this->form->addQuickFields('Date', array($date1, new TLabel('to'), $date2)); // side by side fields
- $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
- $fieldX->setSize( 100, 40 ); // set size
- **/
- // master
- $table_general->addRowSet( new TLabel('Cód'), $id );
- $table_general->addRowSet( new TLabel('Nome'), $nome );
- $table_general->addRowSet( new TLabel('Estado'), $estado );
- $table_general->addRowSet( new TLabel('Cidade'), $cidade );
- $table_general->addRowSet( new TLabel('Empresa'), $funcao );
- $table_general->addRowSet( new TLabel('Cargo / Função'), $tipo );
- $table_general->addRowSet( new TLabel('Atendimento'), $horario );
- $table_general->addRowSet( new TLabel('Observação'), $obs );
- // detail
- $frame_details = new TFrame();
- $frame_details->style = 'background:whiteSmoke';
- $frame_details->setLegend('Telefones do contato');
- $row = $table_detail->addRow();
- $row->addCell($frame_details);
- $btn_save_detail = new TButton('btn_save_detail');
- $btn_save_detail->setAction(new TAction(array($this, 'onSaveDetail')), 'Register');
- $btn_save_detail->setImage('fa:save');
- $table_details = new TTable;
- $frame_details->add($table_details);
- $table_details->addRowSet( '', $detail_id );
- $table_details->addRowSet( new TLabel('Descrição'), $detail_descricao );
- $table_details->addRowSet( new TLabel('Número'), $detail_numero );
- $table_details->addRowSet( new TLabel('Obs'), $detail_obs );
- $table_details->addRowSet( $btn_save_detail );
- $this->detail_list = new TQuickGrid;
- $this->detail_list->setHeight( 175 );
- $this->detail_list->makeScrollable();
- $this->detail_list->disableDefaultClick();
- $this->detail_list->addQuickColumn('Edita', 'edit', 'left', 20);
- $this->detail_list->addQuickColumn('Exclui', 'delete', 'left', 20);
- // items
- $this->detail_list->addQuickColumn('Descrição', 'descricao', 'left', 200);
- $this->detail_list->addQuickColumn('Número', 'numero', 'left', 200);
- $this->detail_list->addQuickColumn('Obs', 'obs', 'left', 200);
- $this->detail_list->createModel();
- //$row = $table_detail->addRow();
- //$row->addCell($this->detail_list);
- $frame_details->add($this->detail_list);
- //------frame Empreendimentos---------------------------------------------------------------------------------------
- $frame_usinas = new TFrame(null, 350);
- $frame_usinas->style = 'background:whiteSmoke';
- $frame_usinas->setLegend('Empreendimentos relacionados');
- $this->fieldlist = new TFieldList;
- $this->fieldlist->name = 'empreendimentos';
- $this->fieldlist->width = '100%';
- $this->fieldlist->generateAria();
- $usina_id = new TDBCombo('empreendimento_id[]','sqlserver','Empreendimento','id','empreendimento');
- //$usina_name = new TEntry('empreendimento_empreendimento[]');
- //$this->fieldlist->setHeight(200);
- //$usina_name->setEditable(true);
- //$usina_name->setSize(380);
- $usina_id->setSize(380);
- $this->fieldlist->addHeader();
- $this->fieldlist->enableSorting();
- // configuracoes multifield
- // $multifield_usinas->setClass('EmpreendimentoCio');
- //$multifield_usinas->addField('id', 'ID', $usina_id, 100);
- // $multifield_usinas->addField('empreendimento','Empreendimento', $usina_name, 510);
- //$multifield_usinas->setOrientation('horizontal');
- $this->fieldlist->addField('<b>ID</br>',$usina_id , ['width' => '50%'] );
- //$this->fieldlist->addField('<b>Empreendimento</br>',$usina_name, ['width' => '100%','sum'=> true]);
- $frame_usinas->add($this->fieldlist);
- $hbox2->add($frame_usinas);
- //----------------------------------------------------------------------------------------------------------
- // create an action button (save)
- $save_button=new TButton('save');
- $save_button->setAction(new TAction(array($this, 'onSave')), _t('Save'));
- $save_button->setImage('ico_save.png');
- // create an new button (edit with no parameters)
- $new_button=new TButton('new');
- $new_button->setAction(new TAction(array($this, 'onClear')), _t('New'));
- $new_button->setImage('ico_new.png');
- //list button
- $list_button=new TButton('list');
- $list_button->setAction(new TAction(array('ContatoList','onReload')),'Voltar para a Listagem');
- $list_button->setImage('fa:table blue');
- // define form fields
- $this->formFields = array($id,$estado,$cidade,$nome,$tipo,$horario,$funcao,$obs,$detail_descricao,$detail_numero,$detail_obs, $usina_id);
- $this->formFields[] = $btn_save_detail;
- $this->formFields[] = $save_button;
- $this->formFields[] = $new_button;
- $this->formFields[] = $list_button;
- $this->formFields[] = $detail_id;
- $this->form->setFields( $this->formFields );
- $table_master->addRowSet( array($save_button, $new_button, $list_button), '', '')->class = 'tformaction'; // CSS class
- // create the page container
- $container = new TVBox;
- $container->style = 'width: 700px';
- $container->add(new TXMLBreadCrumb('menu.xml', 'ContatoList'));
- $container->add($this->form);
- parent::add($container);
- }
- public static function reloadPermissions()
- {
- try
- {
- TTransaction::open('permission');
- $user = SystemUser::newFromLogin( TSession::getValue('login') );
- if ($user)
- {
- $programs = $user->getPrograms();
- $programs['LoginForm'] = TRUE;
- TSession::setValue('programs', $programs);
- $frontpage = $user->frontpage;
- if ($frontpage instanceof SystemProgram AND $frontpage->controller)
- {
- TApplication::gotoPage($frontpage->controller); // reload
- }
- else
- {
- TApplication::gotoPage('EmptyPage'); // reload
- }
- }
- TTransaction::close();
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- }
- }
- /**
- * Clear form
- * @param $param URL parameters
- */
- public function onClear($param = NULL)
- {
- $this->form->clear();
- TSession::setValue(__CLASS__.'_items', array());
- $this->onReload( $param );
- }
- /**
- * Save an item from form to session list
- * @param $param URL parameters
- */
- public function onSaveDetail( $param )
- {
- try
- {
- TTransaction::open('sqlserver');
- $data = $this->form->getData();
- /** validation sample
- if (! $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 ]['descricao'] = $data->detail_descricao;
- $items[ $key ]['numero'] = $data->detail_numero;
- $items[ $key ]['obs'] = $data->detail_obs;
- TSession::setValue(__CLASS__.'_items', $items);
- //clear detail form fields
- $data->detail_id = '';
- $data->detail_descricao = '';
- $data->detail_numero = '';
- $data->detail_obs = '';
- $this->form->setData($data);
- $obj = new StdClass;
- $obj->estado_id = $data->estado_id;
- $obj->cidade = $data->cidade;
- TForm::sendData('form_Contato', $obj);
- $items = ContatoEmpreendimento::where('contato_id', '=', $data->id)->load();
- if ($items)
- {
- foreach ($items as $emp)
- {
- $this->fieldlist->addDetail($emp);
- }
- $this->fieldlist->addCloneAction();
- }
- else
- {
- $this->fieldlist->addDetail(new stdClass);
- $this->fieldlist->addCloneAction();
- }
- TTransaction::close();
- $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 function onEditDetail( $param )
- {
- $data = $this->form->getData();
- // read session items
- $items = TSession::getValue(__CLASS__.'_items');
- // get the session item
- $item = $items[ $param['item_key'] ];
- $data->detail_id = $item['id'];
- $data->detail_descricao = $item['descricao'];
- $data->detail_numero = $item['numero'];
- $data->detail_obs = $item['obs'];
- // fill detail fields
- $this->form->setData( $data );
- $obj = new StdClass;
- $obj->estado_id = $data->estado_id;
- $obj->cidade = $data->cidade;
- TForm::sendData('form_Contato', $obj);
- $this->onReload( $param );
- TTransaction::open('sqlserver');
- $items = ContatoEmpreendimento::where('contato_id', '=', $data->id)->load();
- if ($items)
- {
- foreach ($items as $emp)
- {
- $this->fieldlist->addDetail($emp);
- }
- $this->fieldlist->addCloneAction();
- }
- else
- {
- $this->fieldlist->addDetail(new stdClass);
- $this->fieldlist->addCloneAction();
- }
- TTransaction::close();
- }
- /**
- * Delete an item from session list
- * @param $param URL parameters
- */
- public function onDeleteDetail( $param )
- {
- $data = $this->form->getData();
- // reset items
- $data->detail_descricao = '';
- $data->detail_numero = '';
- $data->detail_obs = '';
- // clear form data
- $this->form->setData( $data );
- // read session items
- $items = TSession::getValue(__CLASS__.'_items');
- $obj = new StdClass;
- $obj->estado_id = $data->estado_id;
- $obj->cidade = $data->cidade;
- TForm::sendData('form_Contato', $obj);
- // delete the item from session
- unset($items[ $param['item_key'] ] );
- TSession::setValue(__CLASS__.'_items', $items);
- // reload items
- $this->onReload( $param );
- TTransaction::open('sqlserver');
- $items = ContatoEmpreendimento::where('contato_id', '=', $data->id)->load();
- if ($items)
- {
- foreach ($items as $emp)
- {
- $this->fieldlist->addDetail($emp);
- }
- $this->fieldlist->addCloneAction();
- }
- else
- {
- $this->fieldlist->addDetail(new stdClass);
- $this->fieldlist->addCloneAction();
- }
- TTransaction::close();
- //$this->form->clear();
- }
- /**
- * 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
- //$this->form->onClear($param);
- $data = $this->form->getData();
- if ($items)
- {
- $cont = 1;
- foreach ($items as $list_item_key => $list_item)
- {
- $item_name = 'prod_' . $cont++;
- $item = new StdClass;
- // create action buttons
- $action_del = new TAction(array($this, 'onDeleteDetail'));
- $action_del->setParameter('item_key', $list_item_key);
- $action_edi = new TAction(array($this, 'onEditDetail'));
- $action_edi->setParameter('item_key', $list_item_key);
- $button_del = new TButton('delete_detail'.$cont);
- $button_del->class = 'btn btn-default btn-sm';
- $button_del->setAction( $action_del, '' );
- $button_del->setImage('far:trash-alt red fa-lg');
- $button_edi = new TButton('edit_detail'.$cont);
- $button_edi->class = 'btn btn-default btn-sm';
- $button_edi->setAction( $action_edi, '' );
- $button_edi->setImage('fa:edit blue fa-lg');
- $item->edit = $button_edi;
- $item->delete = $button_del;
- $this->formFields[ $item_name.'_edit' ] = $item->edit;
- $this->formFields[ $item_name.'_delete' ] = $item->delete;
- // items
- $item->id = $list_item['id'];
- $item->descricao = $list_item['descricao'];
- $item->numero = $list_item['numero'];
- $item->obs = $list_item['obs'];
- $row = $this->detail_list->addItem( $item );
- $row->onmouseover='';
- $row->onmouseout='';
- }
- $this->form->setFields( $this->formFields );
- }
- $this->loaded = TRUE;
- }
- /**
- * Load Master/Detail data from database to form/session
- */
- function onEdit($param)
- {
- try
- {
- TTransaction::open('sqlserver');
- if (isset($param['key']))
- {
- $key = $param['key'];
- //$key2 = $param
- $object = new Contato($key);
- $cidade = new Cidade($object->cidade);
- $object->estado_id = $cidade->cod_estado;
- $object->empreendimentos = $object->getEmpreendimentos();
- $items = Telefone::where('contato_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]['descricao'] = $item->descricao;
- $session_items[$item_key]['numero'] = $item->numero;
- $session_items[$item_key]['obs'] = $item->obs;
- }
- TSession::setValue(__CLASS__.'_items', $session_items);
- $this->form->setData($object); // fill the form with the active record data
- $obj = new StdClass;
- $obj->estado_id = $object->estado_id;
- $obj->cidade = $object->cidade;
- $items = ContatoEmpreendimento::where('contato_id', '=', $key)->load();
- if ($items)
- {
- foreach ($items as $emp)
- {
- $this->fieldlist->addDetail($emp);
- }
- $this->fieldlist->addCloneAction();
- }
- else
- {
- $this->fieldlist->addDetail(new stdClass);
- $this->fieldlist->addCloneAction();
- }
- TForm::sendData('form_Contato', $obj);
- //header('Refresh: 0');
- $id = $object->id;
- TTransaction::close(); // close transaction
- } else
- {
- $this->fieldlist->addDetail(new stdClass);
- $this->fieldlist->addCloneAction();
- //$this->formFields->clear();
- TSession::setValue(__CLASS__.'_items', null);
- $this->onReload( $param );
- }
- }
- catch (Exception $e) // in case of exception
- {
- $this->fieldlist->addDetail(new stdClass);
- $this->fieldlist->addCloneAction();
- new TMessage('error', $e->getMessage());
- TTransaction::rollback();
- }
- }
- /**
- * Save the Master/Detail data from form/session to database
- */
- public function onSave($param)
- {
- try
- {
- // open a transaction with database
- TTransaction::open('sqlserver');
- $this->form->validate();
- var_dump($param);
- $data = $this->form->getData();
- $master = new Contato;
- $master->fromArray( (array) $data);
- $this->form->validate(); // form validation
- /* if( $data->empreendimentos )
- {
- foreach( $data->empreendimentos as $empreendimento )
- {
- $master->addEmpreendimento( new EmpreendimentoCio($empreendimento->id) );
- }
- }*/
- $master->store(); // save master object
- // delete details
- $old_items = Telefone::where('contato_id', '=', $master->id)->load();
- $keep_items = array();
- // get session items
- $items = TSession::getValue(__CLASS__.'_items');
- if( !empty($param['empreendimento_id']) AND is_array($param['empreendimento_id']) )
- {
- foreach ( $param['empreendimento_id'] as $row => $item)
- {
- // $contato_empreendimento = new ContatoEmpreendimento;
- // $contato_empreendimento->id = null;
- // $contato_empreendimento->empreendimento_id = $param['empreendimento_id'][$row];
- // $contato_empreendimento->contato_id= $master->id;
- // $contato_empreendimento->store();
- $empreendimento_contato = new EmpreendimentoContato;
- $empreendimento_contato->id = null;
- $empreendimento_contato->empreendimento_id = $param['empreendimento_id'][$row];
- $empreendimento_contato->contato_id= $master->id;
- $empreendimento_contato->store();
- }
- }
- if( $items )
- {
- foreach( $items as $item )
- {
- if (substr($item['id'],0,1) == 'X' ) // new record
- {
- $detail = new Telefone;
- }
- else
- {
- $detail = new Telefone;
- $detail->fromArray($item);
- }
- $detail->descricao = $item['descricao'];
- $detail->numero = $item['numero'];
- $detail->obs = $item['obs'];
- $detail->contato_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));
- $action = new TAction(array('ContatoList','onReload'));
- new TMessage('info', 'Dados gravados com sucesso!', $action);
- $this->form->clear();
- $this->detail_list->clear(); // clear detail list
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage());
- //$this->form->setData( $this->form->getData() ); // keep form data
- $data = $this->form->getData();
- // $this->formFields->clear();
- $this->detail_list->clear(); // clear detail list
- $obj = new StdClass;
- $obj->estado_id = $data->estado_id;
- $obj->cidade = $data->cidade;
- $this->onClear();
- //TForm::sendData('form_Contato', $obj);
- 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();
- }
- //função para carregar as aplicações 'equipamentos'
- public static function onChange($param)
- {
- TTransaction::open('sqlserver');
- $criteria = new TCriteria;
- $criteria->add(new TFilter('cod_estado', '=', $param['estado_id']));
- $repository = new TRepository('Cidade');
- $cidades = $repository->load($criteria);
- $options = array();
- if (!empty($cidades)){
- $options[] = '' ;
- foreach ($cidades as $cidade){
- $options[$cidade->cod_cidade] = $cidade->nom_cidade;
- }
- }
- //TForm::sendData('form_Vertedouro', $objeto);
- TCombo::reload('form_Contato', 'cidade', $options);
- }
- }
- ?>
Observação:
O problema pode ser com o uso da classe TSession, mas não conheço uma alternativa para salvar nesse contexto.
Provavelmente vc não está excluindo as variáveis de seção após o primeiro "salvar"
Isso já foi resolvido a algum tempo nas versões mais recentes. Não crie mais mestre detalhes com Session, hoje o FW da suporte a mestre detalhe com JS justamente pra corrigir isso. Essa forma que vc esta montando o Mestre detalhe é antiga. Atualize-se...
Existe no tutor vários exemplos de como trabalhar sem session apenas com javascript.
Exemplo:
https://framework.adianti.me//tutor/index.php?class=SaleForm