Lançado Adianti Framework 8.1!
Clique aqui para saber mais
Preenchimento automático de informação da sessão Olá pessoal, Preciso buscar da sessão dados do usuário logado e que tais dados sejam carregados no formulário em questão ao ser acionado. A situação é a seguinte, sempre que o usuário acessar o formulário os dados como nome, email, telefone, etc.. sejam carregados no formulário sem a opção de edição(os campos serão configurados para não serem editáveis). Alguma ideia para qu...
FF
Preenchimento automático de informação da sessão  
Olá pessoal,
Preciso buscar da sessão dados do usuário logado e que tais dados sejam carregados no formulário em questão ao ser acionado.
A situação é a seguinte, sempre que o usuário acessar o formulário os dados como nome, email, telefone, etc.. sejam carregados no formulário sem a opção de edição(os campos serão configurados para não serem editáveis).
Alguma ideia para que eu possa faze-lo? Esta logica seria aplicada as datagrids e formulários.
As informações ja estão na tabela system_user.
Antecipadamente agradeç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 (18)


MG

No onEdit do formulário quando não existe um parâmetro de busca ele chama $this->form->clear() isso faz limpar o form.

Logo abaixo, você pode fazer o seguinte:

  1. <?php
  2.      ....
  3.      $this->form->clear();
  4.       $obj = new stdClass;
  5.       $obj->nome TSession::getValue('username'); // lembrando que o nome é o mesmo do fomulario
  6.       $this->form->setData($obj);
  7. ?>
FF

Olá Marcelo, mais uma vez obrigado pelo apoio!

Então, no casodo formulário em questão, os dados seriam carregados ao abrir para um Novo preenchimento, neste caso, seria informado o que passou no metodo onnew por exemplo?
Grato.
MG

O padrão que FW usa é sempre criar no form um onEdit.
No início do método é verificado se foi passado um $param['key'].
Mas não necessariamente deve ser isso.
No seu caso me parece que você criou o método onNew.
O conceito que passei se aplica muito bem em ambos.

Abraços e sucesso!
FF

Considerando uma classe que ja fazia uso e adaptando o que me disse, ficaria mais ou menos como abaixo?
  1. <?php
  2. public function onEdit($param)
  3.     {
  4.         try
  5.         {
  6.             if (isset($param['key']))
  7.             {
  8.                 $key $param['key'];
  9.                 TTransaction::open('landini');
  10.                 $object = new Garantia($key );
  11.                 $object->f_falha      FotosFalha::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  12.                 $object->f_horimetro FotosHorimetro::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  13.                 $object->f_num_serie FotosNumSerie::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  14.                 $object->f_reparo      FotosReparo::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  15.                 $this->form->setData($object);
  16.                    $obj = new stdClass;
  17.                  $obj->cliente TSession::getValue('username'); // lembrando que o nome é o mesmo do fomulario
  18.                  $this->form->setData($obj);
  19.                 TTransaction::close();
  20.                 $this->fireEvents($object);
  21.                 #return $object;
  22.             }
  23.             else
  24.             {
  25.                 $this->form->clear();
  26.             }
  27.         }
  28.         catch (Exception $e// in case of exception
  29.         {
  30.             new TMessage('error'$e->getMessage());
  31.             TTransaction::rollback();
  32.         }
  33.     }
  34. Na tabela onde salva os dados de usuáriotem um campo com o nome fantasiaque é justamente o que preciso que seja carregado no formuláriocomo seria para carregar as informações deste campo baseado no usuário logado?
  35. Grato
  36. ?>
FF

Aplicando o exemplo acima, ao abrir o formulário os campos o campo do usuário/cliente não é carregado, algo que fiz errado?
MG

No seu código você já possui o $object que será enviado ao form.
Portanto você pode adicionar as informações no mesmo $object, desde que o nome do campo exista na tela.

Ao invês de :
  1. <?php
  2.       $this->form->setData($object);
  3.       $obj = new stdClass;
  4.       $obj->cliente TSession::getValue('username'); // lembrando que o nome é o mesmo do fomulario
  5.       $this->form->setData($obj);
  6. ?>


Use:
<:?php
// cliente - deve ser definido no __construct = $cliente = new TEntry('cliente');
$object->cliente = TSession::getValue('username'); // lembrando que o nome é o mesmo do fomulario
$this->form->setData($object);

?>

O nome fantasia que você comenta está sendo armazenado na Session em Loginform?

Se estiver, é só recuperar e exibir usando o mesmo conceito acima.
FF

Entendi.
Quanto ao nome fantasia é um campo da tabela de usuário, onde também está o campo de $name que representa o usuário da sessão. Gostaria que com base na sessão e no usuário, pudesse acessar este campo para preencher o campo $cliente. Como é feito em alguns metodos com onExitAction. Porém diferentemente, seria preenchido sempre que o formulário fosse aberto para um novo preenchimento.
Entendeu?
MG

Entendi.
Segundo que te passei, você conseguiu o que queria ou ainda não?

FF

Não, ainda não deu. Porque no caso por estar no metodo onEdit, este precisa ser chamado ao acessar o formulário, e o que preciso é assim que a classe for acionada, estes campos entrem preenchidos com os dados da sessão. Tipo como o metodo onShow, sabe?
FF

Deixei assim, mas ainda não tive o resultado esperado.

  1. <?php
  2.     public function onEdit($param)
  3.     {
  4.         try
  5.         {
  6.             if (isset($param['key']))
  7.             {
  8.                 $key $param['key'];
  9.                 TTransaction::open('landini');
  10.                 $object = new Garantia($key );
  11.                 $object->f_falha      FotosFalha::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  12.                 $object->f_horimetro FotosHorimetro::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  13.                 $object->f_num_serie FotosNumSerie::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  14.                 $object->f_reparo      FotosReparo::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  15.                 $object->cliente     TSession::getValue('username');
  16.                 $this->form->setData($object);
  17.                    
  18.                 TTransaction::close();
  19.             }
  20.             else
  21.             {
  22.                 $this->form->clear();
  23.             }
  24.         }
  25.         catch (Exception $e// in case of exception
  26.         {
  27.             new TMessage('error'$e->getMessage());
  28.             TTransaction::rollback();
  29.         }
  30.     }
  31. ?>
MG

Você deve colocar no "else" do if (isset($param['key]))"...

  1. <?php
  2. public function onEdit ($param)
  3. {
  4.     try {
  5.         if (isset($param['key'])) {
  6.         } else {
  7.             // aqui
  8.             $this->form->clear();
  9.             $obj = new stdClass;
  10.             $obj->cliente TSession::getValue('username');
  11.              $this->form->setData($obj);
  12.         }
  13.     } catch () {
  14.     }
  15. }
  16. ?>
MG

Analisando melhor, estas informações sempre devem ser exibidas, certo?

Então faça o sequinte:

  1. <?php
  2. public function onEdit ($param)
  3. {
  4.     try {
  5.         if (isset($param['key'])) {
  6.             // aqui tbm antes do setData
  7.             $object->cliente =  TSession::getValue('username');
  8.             $this->form->setData($object);
  9.         } else {
  10.             // aqui
  11.             $this->form->clear();
  12.             $obj = new stdClass;
  13.             $obj->cliente TSession::getValue('username');
  14.              $this->form->setData($obj);
  15.         }
  16.     } catch () {
  17.     }
  18. }
  19. ?>
FF

Opa, começo a dar resultado. O usuário da sessão preencheu o campo $cliente quando acessado o metodo onEdit, ou seja localhost/landini/index.php?class=GarantiaForm&method=onEdit, mas se acessado só a classe como localhost/landini/index.php?class=GarantiaForm ainda fica em branco.
Os demais campos eu posso chamar com
  1. <?php
  2. $obj->email $data->cliente->email
  3. ?>

Por exemplo, certo?
MG

Quando vc chama GarantiaForm, você chama algum método?

É importante saber que o Adianti sempre chama o __construct() em primeiro lugar.
Sempre deve chamar um form atra´ves de um método de entrada.
Neste método, geralmente o onEdit ou outro que você criar, você deverá preencher o conteúdo, ou vindo do BD ou da Sessão.;

Mas respondendo sua pergunta: Sim, o processo é o mesmo. Sempre lembrando que o campo que fizer referência deve exisitr no form, por exemplo: $email = new TEntry('email') e assim por diante.
FF

Deu certo em partes. Coloquei o trecho de cogido no contrutor e agora sempre que acessado o formulário é carregado o campo.
Agora é carregar os campos email,telefone e etc baseado no dado do campo carregado na sessão(username).
Ficou assim agora no construtor e funciona para o campo cliente, agora só preciso filtrar e carregar os outros com base no campo cliente.
  1. <?php
  2. try {
  3.         if (isset($param['key'])) {
  4.             // aqui tbm antes do setData
  5.             $object $this->form->getData();
  6.             $object->cliente =  TSession::getValue('username');
  7.             $object->email   $data->email;
  8.             $this->form->setData($object);
  9.         } else {
  10.             // aqui
  11.             $this->form->clear();
  12.             $obj = new stdClass;
  13.             $obj->cliente TSession::getValue('username');
  14.             $this->form->setData($obj);
  15.         }
  16. ?>


Os campos do formulário foram criados da seguinte maneira:
  1. <?php
  2. $id                = new TEntry('id');
  3.         $n_serie        = new TEntry('n_serie');
  4.         $tecnico        = new TEntry('tecnico');
  5.         $modelo            = new TCombo('modelo');
  6.         $tipo              = new TCombo('tipo');
  7.         $dt_falha       = new TDate('dt_falha');
  8.         $situacao          = new TDBCombo('situacao','landini','Situacao','id','situacao''situacao');
  9.         $dt_reparo      = new TDate('dt_reparo');
  10.         $hr_trator       = new TEntry('hr_trator');
  11.         $concessionaria = new TEntry('concessionaria');
  12.         $cliente           = new TEntry('cliente');
  13.         $email             = new TEntry('email');
  14.         $telefone         = new TEntry('telefone');
  15.         $cidade         = new TEntry('cidade');
  16.         $estado         = new TEntry('estado');
  17.         $fazenda        = new TEntry('fazenda');
  18.         $problema        = new TText('problema');
  19.         $causa            = new TText('causa');
  20.         $solucao        = new TText('solucao');
  21.         $obs            = new TText('obs');
  22.         $pedido            = new TDBCombo('pedido','landini','Orcamento','id','id','id');
  23. ?>


Mais uma vez, quero agradeçer a força Marcelo, está sendo esclarecedor.
MG

É só seguir os mesmos passos.
Mas é preciso que os dados sejam colocados na Session durante o login.
Para acessar o e-mail do usuário logado, é só utilizar: $this->obj->email = TSession::getValue('email') e assim por diante.
Dê uma olhada no Controller LoginForm, método onLogin e veja quais campos estão sendo enviados para Session. Você poderá adicionar novos, se precisar.
FF

Marcelo primeiramente agradeço por todo tempo prestado para solução aqui do meu problema. Muito obrigado.

Fiz uma busca nas classes admin do FW e encontrei um trecho de codigo usado para edição do perfil.
Trecho até pequeno, veja:
  1. <?php
  2. try
  3.         {
  4.             TTransaction::open('permission');
  5.             $login SystemUser::newFromLoginTSession::getValue('login') );
  6.             $this->form->setData($login);
  7.             TTransaction::close();
  8.         }
  9.         catch (Exception $e)
  10.         {
  11.             new TMessage('error'$e->getMessage());
  12.         }
  13. ?>


Então dei um
var_dump
em 'login' e vi que a partir dele eu consigo acessar muitas coisas. Então deixei assim no meu fonte:

  1. <?php
  2. try
  3.         {
  4.             TTransaction::open('permission');
  5.             
  6.             $userSystemUser::newFromLogin(TSession::getValue('login'));
  7.             $object                = new stdClass();
  8.             $object->cliente    $user->name;
  9.             $object->email        $user->email;    
  10.             $object->telefone    $user->telefone;
  11.             $object->cidade        $user->cidade;
  12.             $object->estado        $user->estado;
  13.             
  14.             $this->form->setData($object);
  15.             
  16.             #var_dump($user);
  17.             
  18.             TTransaction::close();
  19.         }
  20.         catch (Exception $e)
  21.         {
  22.             new TMessage('error'$e->getMessage());
  23.         }
  24. ?>


Agora os campos do formulário são preenchidos com os dados do usuário logado!

Menos um problema, agora é continuar e homologar.
Mais uma vez obrigado.
MG

Opa, que bom.
Se precisar de ajuda, é só falar.
meu e-mail: marcelo@mgsistemas.com.br