Lançado Adianti Framework 8.1!
Clique aqui para saber mais
Filtro por grupo Boa tarde pessoal! Estou com a seguinte situação. Criei um tela, onde é carregado dados da sessão para preenchimento de alguns campos, e um filtro pra que seja exibido somente os pedidos daquele usuário. O detalhe é que quero que este filtro aplique-se somente aos usuários do grupo Standard por exemplo, para que o administrador tenha acesso todos os pedidos. O filtro que é o segui...
FF
Filtro por grupo  
Boa tarde pessoal!
Estou com a seguinte situação. Criei um tela, onde é carregado dados da sessão para preenchimento de alguns campos, e um filtro pra que seja exibido somente os pedidos daquele usuário. O detalhe é que quero que este filtro aplique-se somente aos usuários do grupo Standard por exemplo, para que o administrador tenha acesso todos os pedidos. O filtro que é o seguinte:
  1. <?php
  2. try
  3.         {
  4.             TTransaction::open('landini');
  5.             $cli SystemUser::where('id','=',TSession::getValue('userid'))->first();
  6.             $criteria = new TCriteria;
  7.             $criteria->add(new TFilter('system_user_id','=',$cli->id));
  8.             
  9.             
  10.             
  11.             TTransaction::close();
  12.         }
  13.         catch(Exception $e)
  14.         {
  15.             new TMessage('error',$e->getMessage());
  16.         }
  17. ?>

Conto com o apoio!

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 (8)


MG

Talvez tenha que verificar se o usuário não pertença ao grupo 1, que normalmente é o grupo dos administradores:

  1. <?php
  2.       $grupos_id TSession::getValue(''usergroupids); // retorna um array
  3.        if (is_array($grupos_id)) {
  4.            if (!in_array(1,$grupos_id) {
  5.                $criteria->add(); // seu filtro
  6.            }
  7.         }
  8. ?>
FF

Fala awe Marcelo, sempre na ativa heiim!!

Cara vamos lá, no caso eu quero que o filtro se aplique somente aos usuários que não fazem parte do grupo admin, no caso de id 1, considerando que o script que passou ja está em negação, basta completar com o filtro
new TFilter('system_user_id','=',$cli->id)
? Tipo abaixo?
  1. <?php
  2.       $grupos_id TSession::getValue(''usergroupids); // retorna um array
  3.        if (is_array($grupos_id)) {
  4.            if (!in_array(1,$grupos_id) {
  5.                $criteria->add(new TFilter('system_user_id','=',$cli->id)); // seu filtro
  6.            }
  7.         }
  8. ?>


Antecipadamente agradeço!
FF

Fiz aqui, deu certinho, agora os membros do grupo administrador veem tudo e os demais grupos não. Caso queira clonar o grupo administrador, é só adicionar o id correspondente na lina
!in_array(1,$grupos_id)
, certo?
Exemplo:
!in_array(1,7,$grupos_id)
MG

Legal que consegui ajudar!
Basicamente é isso.
Claro que dá pra melhorar a lógica, caso o grupo seja outro.
Mas se usar o mesmo formato que vem por padrão, seria este o caminho.
Sucesso.
FF

Vamos la na listagem tudo certo, porém me deparei com um impasse. Os metodos onEdit e onSave do formulário, tem a carga da sessão do usuário, ou seja ao clicar no editar na datagrid, alguns campos vem da sessão e não do banco. Precisaria que no caso, quando do grupo administrador, este filtro fosse ignorado. Atualmente está assim:
  1. <?php
  2. public function onSave()
  3.     {
  4.         try
  5.         {
  6.             TTransaction::open('landini');
  7.             
  8.             // form validations
  9.             $this->form->validate();
  10.             
  11.             // get form data
  12.             $data   $this->form->getData();
  13.             
  14.             // store product
  15.             $object = new Garantia;
  16.             $object->fromArray( (array) $data);
  17.             $object->store();
  18.             
  19.             // copy file to target folder
  20.             $this->saveFiles($object$data'f_falha''files/imagens/garantia/multiplas''FotosFalha''foto''garantia_id');
  21.             $this->saveFiles($object$data'f_horimetro''files/imagens/garantia/multiplas''FotosHorimetro''foto''garantia_id');
  22.             $this->saveFiles($object$data'f_num_serie''files/imagens/garantia/multiplas''FotosNumSerie''foto''garantia_id');
  23.             $this->saveFiles($object$data'f_reparo''files/imagens/garantia/multiplas''FotosReparo''foto''garantia_id');
  24.             
  25.             // send id back to the form
  26.             $data->id     $object->id;
  27.             $this->form->setData($data);
  28.             
  29.             TTransaction::close();
  30.             new TMessage('info'AdiantiCoreTranslator::translate('Record saved'));
  31.         }
  32.         catch (Exception $e)
  33.         {
  34.             $this->form->setData($this->form->getData());
  35.             new TMessage('error'$e->getMessage());
  36.             TTransaction::rollback();
  37.         }
  38.    }
  39. ?>


o onEdit assim:

  1. <?php
  2. public function onEdit($param)
  3.     {
  4.         try
  5.         {
  6.             TTransaction::open('landini');
  7.             if (isset($param['key']))
  8.             {
  9.                 $key $param['key'];
  10.                 
  11.                 
  12.                 $object = new Garantia($key );
  13.                 $object->f_falha         FotosFalha::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  14.                 $object->f_horimetro    FotosHorimetro::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  15.                 $object->f_num_serie    FotosNumSerie::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  16.                 $object->f_reparo         FotosReparo::where('garantia_id''='$param['key'])->getIndexedArray('foto');
  17.                 $this->form->setData($object);
  18.                 
  19.                 
  20.                 return $object;
  21.             }
  22.             else
  23.             {
  24.                 $this->form->clear();
  25.                 $user SystemUser::newFromLoginTSession::getValue('login') );
  26.                 $object                    = new stdClass();
  27.                 $object->system_user_id    $user->id;
  28.                 $object->cliente        $user->name;
  29.                 $object->email            $user->email;    
  30.                 $object->telefone        $user->telefone;
  31.                 $object->cidade            $user->cidade;
  32.                 $object->estado            $user->estado;
  33.                 
  34.                 $this->form->setData($object);
  35.             }
  36.             TTransaction::close();
  37.         }
  38.         catch (Exception $e// in case of exception
  39.         {
  40.             new TMessage('error'$e->getMessage());
  41.             TTransaction::rollback();
  42.         }
  43.       
  44.     }
  45. ?>


Se eu pedir pra editar, o que no caso será necessário para alteração do campo situacao, e este só poderá ser editavel por um administrador, por estar carregando dados de sessão, o usuário nos campos será alterado e ao clicar em salvar o cliente será alterado para o usuário administrador.

Alguma dica pra contornar esta situação?

MG

É preciso separar as coisas.
Quando você está incluindo um novo registro, o else do onEdit será acionado, certo?
Bem, neste momento os campos que precisam ser definidos dinamicamente por dados da Sessão, serão atribuídos aos campos. Ok?
Quando você edita, ele entrará no onEdit, onde os dados a serem carregados na tela, passarão a ser os dados do banco.
Portanto qualquer "store" que der a partir de um registro carregado, os dados em memórias serão os que estão vindo do banco.
Você não poderia, a não ser que seja regra do negócio, carregar os dados dinamicamente ao receber um ID para editar um registro.

Outra dica, quando vc se loga, os dados da sessão que foram gravados no login, ficam na memório não necessitando que seja carregados novamente, como você faz no "else" do onEdit.

Não sei se fui claro? Se ajudei, ou não!
FF

É preciso separar as coisas.
Justamente o que to quebrando a cabeça....rsrsrs

Quando você está incluindo um novo registro, o else do onEdit será acionado, certo?
Certo!

Bem, neste momento os campos que precisam ser definidos dinamicamente por dados da Sessão, serão atribuídos aos campos. Ok?
Exatamente.

Quando você edita, ele entrará no onEdit, onde os dados a serem carregados na tela, passarão a ser os dados do banco.
Portanto qualquer "store" que der a partir de um registro carregado, os dados em memórias serão os que estão vindo do banco.
Deixa eu ver se intendi. Então mesmo que nos campos que são dinamicamente carregados na sessão ao clicar no onEdit, quando clicar no Salvar, os dados que serão salvos serão os que ja estavam nas tabelas do banco, e não os que foram carregados da sessão? É isso?

Você não poderia, a não ser que seja regra do negócio, carregar os dados dinamicamente ao receber um ID para editar um registro.
O que sugere? No codigo tentei condicionar se o campo 'id' estiver vazio, então carregue do banco, mas acho que a logica não tá muito legal... porque na verdade, deveria ser se não estiver vazio, mas quando adiciono a negação !, os campos ficam vazios.
Outra dica, quando vc se loga, os dados da sessão que foram gravados no login, ficam na memório não necessitando que seja carregados novamente, como você faz no "else" do onEdit.
Como ficaria? Mais ou menos assim:
$user = TSession::getValue('login');
, tá certo?


Não sei se fui claro? Se ajudei, ou não!
MG

O método onEdit possui característica: Uma quando recebe um parâmetro vindo de uma chamada e outra quando não recebe nada e quem chamada gostaria de ver um formulário em branco.

Quando a chamada possui um parâmetro, indica que vamos editar um registro, portanto os dados que vão para o form devem ser preenchidos com os dados de uma tabela.

Quando não possui um parâmetro, e o form precisa de campos default, ai devemos preenchê-los com o que precisamos ou temos, no seu caso estes campos estão na Session.

Vamos a um estrutura de exemplo:
1) A chamada (hipotético): index.php?cllass=ClienteForm&method=onEdit&key=1&id=1

Na chamada acima, estou passando para a pagina que pretendo editar o ID do cliente se existir:
2) Chamada indicando um novo registro: index.php?class=Clienteform&method=onEdit

Vamos ao código:

  1. <?php
  2. public function onEdit ($param
  3. {
  4.     try {
  5.         // vefifica se existe o $param['key'] - existindo buso os dados do BD
  6.         if (isset($param['key'])) {
  7.             // recupera parametro que sabemos que existe
  8.             $key $param['key'];
  9.              .... abre conexao
  10.              $cliente Cliente($key); // busca o objeto
  11.              .... fecha conexao
  12.              // aqui caso tenha algum dado que deve ser atualizado de forma
  13.              // automática, poderá fazê-lo, se não são os dados do BD
  14.              $this->form->setData($cliente); /// envia os dados para o form
  15.         } else {
  16.             // nao foi passado parametro, devo limpar o form
  17.             // e preencher o que preciso 
  18.             $this->form->clear();
  19.             $obj->nome TSessio::geValue('nome');
  20.             // envio os dados que devem ser preenchidos
  21.             // de forma automática ao entrar no form para novo registro
  22.             $this->form->setData($obj);
  23.         }
  24.     } catch (Exception $e) {
  25.         ....
  26.     }
  27. }
  28. ?>


Quando carregar os dados vindo do BD, o ID será automaticamente preenchido como os demais dados, portanto no onSave, todos os dados que estão no formulário e fazem parte do Model serão salvos como estão, pois serão enviados por POST ao método onSave.

Estou enviando meu e-mail, caso precise de mais detalhes podemos trocar mensagens: marcelo@mgsistemas.com.br

Espero que tenha esclarecido.