Ir para conteúdo
helkton

Paginação com nível de acesso

Recommended Posts

Ola galera seguinte, tenho um sistema de uma escola de cursos e nela tenho a paginação de alunos funcionando paginando tudo certinho, porem agora tenho uma questão:

Estou criando alguns niveis de aceso para o sistema ter varias unidades escolares tipo...

Unidade I

Unidade II

Unidade III e por ai vai "cada uidade em uma cidade" 

Os niveis sao os basicos, admin, professor, instrutor, recepcionista cada um deles com um ID de identificação ja consigo fazer alguns bloqueios de acordo com o nivel de qcesso do login, porem preciso limitar o acesso a paginacao tbm

Tipo quando o funcionario da Unidade I dependendo do nivel dele, ele nao podera visilualizar os alunos das outras unidades somente as da unidade dele

 

Na minha paginacao atual qdo eu pulo pra outra pagina ele me tras todos os resultados

Como corrigir, alguma dica de como fazer ou alguma outra logica

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!
Aparentemente, uma falha na lógica.
Uma vez que um user logado só pode acessar o que lhe é permitido, toda e qualquer query deverá conter alguma variável limitadora de acordo com o user logado.
Desta forma, um user não terá acesso a algo que ñ lhe é permitido.

Quando montar a query de paginação, passe um where unidade = '$unidade-do-user-logado'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao ja tentei assim..

Minha query da paginação estou tentando assim....

if($idNivelLogin == 0){//Nivel 0 é o adm ele podera ver todos os alunos
$sqlConsultAluno = $conecta->query("SELECT * FROM alunos");

}else{//Todos os outros níveis deveria cair aqui
$sqlConsultAluno = $conecta->query("SELECT * FROM alunos where idAlunoUnidade = '2'");
}

La na minha query inicial ao listar os alunos de cada unidade esta listando de acordo com o nivel de login e montando a paginação ok

Porem qdo seleciono a proxima pagina ele busca todos os alunos independente do nivel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que o problema está na rotina da paginação. Como a página seguinte sabe onde a consulta parou? Desconfio que a consulta para a página seguinte seja essa: $sqlConsulAluno=$conecta->query("SELECT * FROM alunos where paginaseguinte > paginaanterior") e aqui qualquer usuario mal intencionado poderá ter acesso ao endereço da bela loira de olhos azuis da unidade 3.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

segue o esquema da minha query de paginação

<?php
if($nivelLogin == 0){//nivel adm pode ver todos os alunos
	$sqlAlunos = "SELECT * FROM alunos";
}else{//Todos os outros niveis de login cairia aqui, listando de acordo com o IDLOCALIDADE
	$sqlAlunos = "SELECT * FROM alunos WHERE idLocalidadeAluno = '$idLocalidade'";
}
$conectaAlunos = $conecta->query($sqlAlunos);
$countAlunos = mysqli_num_rows($conectaAlunos);
//qdade de pagina
$qdadePG= ceil($countAlunos / $qdade_result_pagina);
//Limitar links antes e depois
$max_links = 5;?>


<nav aria-label="Page navigation example">
  <ul class="pagination justify-content-center">
    <li class="page-item">

      <a class='page-link' href="#" onclick='listar_alunos(1, <?php echo $qdade_result_pagina;?>)'>
        Primeira </a>
      </li>


<?php for ($pag_ant = $pagina - $max_links; $pag_ant <= $pagina - 1; $pag_ant++) {
  if ($pag_ant > 1) {
    echo "<li class='page-item'>
      <a class='page-link' href='#'' onclick='listar_alunos($pag_ant, ".$qdade_result_pagina.")'>
        $pag_ant </a>
      </li>";
  }
} ?>
      <li class="page-item active">
        <a class='page-link'> <?php echo $pagina?> </a>
      </li>

<?php for ($pag_dep = $pagina + 1; $pag_dep <= $pagina + $max_links; $pag_dep++) {
  if ($pag_dep <= $qdadePG) {
    echo "<li class='page-item'>
      <a class='page-link' href='#'' onclick='listar_alunos($pag_dep, ".$qdade_result_pagina.")'>
        $pag_dep </a>
      </li>";
  }
}

 ?>


      <li class="page-item">
        <a class='page-link' href="#" onclick='listar_alunos(<?php echo $qdadePG ?>, <?php echo $qdade_result_pagina;?>)'>
          Ultima </a>
        </li>

      </ul>
    </nav>

se alguem puder me ajudar nessa logica agradeço vlw ou de alguma outra forma de fazer

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem como você passar o código JavaScript listar_alunos()?

 

Encontrei um tutorial bacana nessa página Como fazer Paginação em PHP com MySQL (devmedia.com.br) mas encontrei um monte de mensagem de erro na hora de testar. Mudei tudo para a gramática do mysqli. O bom desse código é que ele não usa o JavaScript:

 

<?php
$nivelLogin=2;
$mysqli=new mysqli("localhost","root","","diario");
if($nivelLogin == 0){$busca="select * from tbprod order by prod";} else {
	$busca = "select * from tbprod where prod like 'm%' order by prod";}
$total_reg=10;
if(isset($_GET['pagina'])){$pagina=$_GET['pagina'];}else{$pagina=null;}
if(!$pagina){$pc=1;}else{$pc=$pagina;}
$inicio=$pc-1;
$inicio=$inicio*$total_reg;
$limite=$mysqli->query("$busca LIMIT $inicio,$total_reg");
$todos=$mysqli->query("$busca");
$tr=mysqli_num_rows($todos);
$tp=$tr/$total_reg;
while($dados=$limite->fetch_array()){
    echo $dados['prod']."<br>";}
$anterior=$pc-1;
$proximo=$pc+1;
echo "<a href=?pagina=$anterior><- Anterior</a> | ";
if($pc<$tp){echo "<a href=?pagina=$proximo>Proxima -></a>";}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

segue meu JavaScript que pega algumas informações

 

<script>
var qdade_result_pagina = 1; //Quantidade de Registros por pagina
var pagina = 1; //pagina inicial
var idLocalidade = <?php echo $unidadeTrabalho?>;//localidade de trabalho do funcionario logado
var tipoLogin = <?php echo $tipoLogin?>;//tipo de funcionario logado
$(document).ready(function (){
	listar_alunos(pagina, qdade_result_pagina, idLocalidade, tipoLogin);//Chama funcao para mostrar resultados
});
function listar_alunos(pagina, qdade_result_pagina, idLocalidade, tipoLogin){
	var dados = {
		pagina: pagina,
		qdade_result_pagina: qdade_result_pagina,
		idLocalidade: idLocalidade,
		tipoLogin: tipoLogin
	}
	$.post('listar_alunos_db', dados , function(data){
		$('#resultAluno').html(data);
	});
}
</script>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não testei os códigos, mas acredito que o código JS deveria ser assim:

 

var idLocalidade=<?='$idLocalidade'?>, você colocou $unidadeTrabalho.
var tipoLogin=<?=$nivelLogin>, você colocou $tipoLogin.

 

Mas o mais grave é que você não pode usar o marcador <?php dentro do <script>.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está aqui:

 

$.post('listar_alunos_db', dados , function(data){

        $('#resultAluno').html(data);

 

Tudo indica que existe um arquivo de texto chamado listar_alunos_db e que o Ajax está mandando para o painel de paginação. Esse não é o comando adequado para pegar as informações que foram filtradas logo no começo da listagem.

 

Por outro lado, eu publiquei logo atrás um código que faz o mesmo serviço e sem usar o JavaScript.

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A questão é bem simples, como já mencionado deve haver alguma clausula na query ao identifique qual conteúdo determinado usuário pode acessar.

Hora que uma paginação para que funcione corretamente são necessárias duas querys, uma determinará o limite de resultados a outra os resultados de acordo com o offset do índice acessado.

 

A primeira query irá buscar quantos resultados existem essa irá dizer o limite, ao qual deve haver a quantidade de páginas a exibir. Ex.:

SELECT id FROM alunos where idAlunoUnidade = '2'

 

A segunda query irá usar o resultado da primeira query para exibir cada resultado conforme a página acessada. Ex.:

SELECT * FROM alunos where idAlunoUnidade = '2' LIMIT {$quantidade_de_registros_da_primeira_query} OFFSET {$pagina_atual_acessada}

 

Esse procedimento se repete a cada mudança de página, sempre exigindo alguma clausula que indique qual conteúdo o usuário pode acessar.

 

Em outro caso é possível fazer uma única query trazer todos os resultados e através de um javascript criar a paginação onde esse não irá mudar a página apenas mostrar ou esconder os elementos de acordo com cada página acessada.

Para não reinventar a roda aqui, eu já desenvolvi um script para essa finalidade:

https://github.com/Spell-Master/sm-web/tree/master/javascript/Paginator

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 06/12/2022 at 14:46, Omar~ disse:

A questão é bem simples, como já mencionado deve haver alguma clausula na query ao identifique qual conteúdo determinado usuário pode acessar.

Hora que uma paginação para que funcione corretamente são necessárias duas querys, uma determinará o limite de resultados a outra os resultados de acordo com o offset do índice acessado.

 

A primeira query irá buscar quantos resultados existem essa irá dizer o limite, ao qual deve haver a quantidade de páginas a exibir. Ex.:

SELECT id FROM alunos where idAlunoUnidade = '2'

 

A segunda query irá usar o resultado da primeira query para exibir cada resultado conforme a página acessada. Ex.:

SELECT * FROM alunos where idAlunoUnidade = '2' LIMIT {$quantidade_de_registros_da_primeira_query} OFFSET {$pagina_atual_acessada}

 

Esse procedimento se repete a cada mudança de página, sempre exigindo alguma clausula que indique qual conteúdo o usuário pode acessar.

 

Em outro caso é possível fazer uma única query trazer todos os resultados e através de um javascript criar a paginação onde esse não irá mudar a página apenas mostrar ou esconder os elementos de acordo com cada página acessada.

Para não reinventar a roda aqui, eu já desenvolvi um script para essa finalidade:

https://github.com/Spell-Master/sm-web/tree/master/javascript/Paginator

Na sua biblioteca tem imensas bibliotecas de informações em CSS, JS, HTML, mas não tem nenhuma conexão com o banco de dados. O código que sugeri tem 19 linhas de PHP, nenhum CSS, nenhum JS e nenhum comentário, e a terceira linha já mostra como conectar o PHP ao banco de dados. Isso não é um exemplo de como apresentar as informações em público, principalmente por usar o método GET que congestiona o serviço do servidor, mas é um meio bem rápido de obter a informação de forma o mais rápido possível para deixar a maquiagem e a eficiência do uso do servidor para depois:

 

<?php
$nivelLogin=2;
$mysqli=new mysqli("localhost","root","","diario");
if($nivelLogin == 0){$busca="select * from tbprod order by prod";} else {
	$busca = "select * from tbprod where prod like 'm%' order by prod";}
$total_reg=10;
if(isset($_GET['pagina'])){$pagina=$_GET['pagina'];}else{$pagina=null;}
if(!$pagina){$pc=1;}else{$pc=$pagina;}
$inicio=$pc-1;
$inicio=$inicio*$total_reg;
$limite=$mysqli->query("$busca LIMIT $inicio,$total_reg");
$todos=$mysqli->query("$busca");
$tr=mysqli_num_rows($todos);
$tp=$tr/$total_reg;
while($dados=$limite->fetch_array()){
    echo $dados['prod']."<br>";}
$anterior=$pc-1;
$proximo=$pc+1;
echo "<a href=?pagina=$anterior><- Anterior</a> | ";
if($pc<$tp){echo "<a href=?pagina=$proximo>Proxima -></a>";}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos.
       
      Quando programava em DOS. utilizava algumas teclas de atalho para: SALVAR / EDITAR / EXCLUIR / IMPRIMIR.
      Por exemplo:
      Salvar ----> ALT+S
      Editar ----> ALT+E
      Excluir --> ALT+X
      Imprimir -> ALT+I

      no PHP tem como colocar esses ATALHOS nos button, para o usuário trabalhar com esses atalhos e como seria ?

      grato,
       
      Cesar
    • Por violin101
      Caros Amigos, saudações.
       
      Por favor, me perdoa em postar uma dúvida.
       
      Preciso criar uma Rotina onde o usuário possa buscar na Base de Dados de Produtos, tanto por Código e Descrição, ou seja:
      - caso o usuário digita o Código, mostra os dados do Produto.
      - caso o usuário digita a Descrição, mostra os dados do Produto
       
      Fiz uma Rotina, onde o usuário digita a DESCRIÇÃO com a função AUTOCOMPLETE.    <=== está funcionando certinho.
       
      Minha dúvida é como faço para DIGITAR o Código e mostrar os dados também.
       
      o meu AutoComplete na MODEL está assim.
      public function autoCompleteProduto($q){ $this->db->select('*' ) ->from('produtos') ->where('produtos.statusProd',1) ->like('descricao', $q) ->limit(5) ->order_by('descricao', 'ASC'); $query = $this->db->get(); if ($query->num_rows() > 0) { foreach ($query->result_array() as $row) { $row_set[] = ['label' => str_pad($row['idProdutos'], '5', '0', STR_PAD_LEFT).' - '.$row['descricao'], 'id' => $row['idProdutos'], 'descricao' => $row['descricao'], 'cod_interno' => $row['cod_interno'], 'prd_unid' => $row['prd_unid'], 'estoque_atual' => $row['estoque_atual'] ]; } echo json_encode($row_set); } }  
       
      no CONTROLLER está assim:
      public function autoCompleteProduto() { $this->load->model('estoque/lancamentos_model'); if (isset($_GET['term'])) { $q = strtolower($_GET['term']); $this->lancamentos_model->autoCompleteProduto($q); } }  
       
      na VIEW está assim:
      <div class="col-md-10"> <label for="idProdutos">Produto:</label> <input type="hidden" name="idProdutos" id="idProdutos"> <input type="text" class="form-control" id="descricao" name="descricao" style="font-size:15px; font-weight:bold;" placeholder="Pesquisar por descrição do produto" disabled> </div>  
      VIEW + JAVASCRIPT
       
      //Função para trazer os Dados pelo o AutoComplete. function resolveAutocomplete() { $("#descricao").autocomplete({ source: "<?php echo base_url(); ?>estoque/lancamentos/autoCompleteProduto/", minLength: 2, select: function (event, ui) { $("#idProdutos").val(ui.item.id); $("#cod_interno").val(ui.item.cod_interno); $("#descricao").val(ui.item.descricao); $("#prd_unid").val(ui.item.prd_unid); $("#estoque_atual").val(ui.item.estoque_atual); $("#qtde").focus(); } }); } // inicia o autocomplete resolveAutocomplete();  
      Grato,
       
      Cesar
    • Por belann
      Olá!
       
      Estou tentando criar um projeto laravel e está dando o seguinte erro 
      curl error 60 while downloading https://getcomposer.org/versions: SSL certificate problem: unable to get local issu
        er certificate
      Já tentei atualizar o composer, mas dá o mesmo erro acima.
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida de validação de INPUT com função moeda.
       
      Tenho um input onde o usuário digita um valor qualquer, por exemplo: 1.234,56
      o problema é quando precisa atualizar o valor.
       
      Quando o usuário atualizar o input fica assim: 1.234,
       
      como faço para atualizar as casas decimais, conforme o valor for sendo alterado ?
       
      o input está assim:
       
      <div class="col-md-2"> <label for="">Valor Unitário</label> <input type="text" class="form-control" id="estoqprod" name="estoqprod" style="font-size:15px; font-weight:bold; width:100%; text-align:center;" placeholder="0,00" OnKeyUp="calcProd();" onkeypress="return(FormataMoeda(this,'.',',',event))" > </div>  
      a função para formatar o input para moeda está assim:
      obs.: a Função CalcProd está executando corretamente
      function calcProd(){ //Obter valor digitado do produto var estoq_prod = document.getElementById("estoqprod").value; //Remover ponto e trocar a virgula por ponto while (estoq_prod.indexOf(".") >= 0) { estoq_prod = estoq_prod.replace(".", ""); } estoq_prod = estoq_prod.replace(",","."); //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Calcula o Valor do Desconto if (prod_qtde > 0 && estoq_prod > 0) { calc_total_produto = parseFloat(prod_qtde) - parseFloat(estoq_prod); var numero = calc_total_produto.toFixed(2).split('.'); //Calculo para não deixar GRAVAR valores negativos if (calc_total_produto < 0 ) { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.') * -1; document.getElementById("qtdeTotal").value = numero.join(','); } else { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("qtdeTotal").value = numero.join(','); } } else { if (estoq_prod > 0) { document.getElementById("qtdeTotal").value = document.getElementById("estoqprod").value; } else { document.getElementById("qtdeTotal").value = "0,00"; } } } /*---Função para Formatar Campo para Moeda [R$]---*/ function FormataMoeda(objTextBox, SeparadorMilesimo, SeparadorDecimal, e){ var sep = 0; var key = ''; var i = j = 0; var len = len2 = 0; var strCheck = '0123456789'; var aux = aux2 = ''; var whichCode = (window.Event) ? e.which : e.keyCode; if (whichCode == 13) return true; key = String.fromCharCode(whichCode); // Valor para o código da Chave if (strCheck.indexOf(key) == -1) return false; // Chave inválida len = objTextBox.value.length; for(i = 0; i < len; i++) if ((objTextBox.value.charAt(i) != '0') && (objTextBox.value.charAt(i) != SeparadorDecimal)) break; aux = ''; for(; i < len; i++) if (strCheck.indexOf(objTextBox.value.charAt(i))!=-1) aux += objTextBox.value.charAt(i); aux += key; len = aux.length; if (len == 0) objTextBox.value = ''; if (len == 1) objTextBox.value = '0'+ SeparadorDecimal + '0' + aux; if (len == 2) objTextBox.value = '0'+ SeparadorDecimal + aux; if (len > 2) { aux2 = ''; for (j = 0, i = len - 3; i >= 0; i--) { if (j == 3) { aux2 += SeparadorMilesimo; j = 0; } aux2 += aux.charAt(i); j++; } objTextBox.value = ''; len2 = aux2.length; for (i = len2 - 1; i >= 0; i--) objTextBox.value += aux2.charAt(i); objTextBox.value += SeparadorDecimal + aux.substr(len - 2, len); } return false; }  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida de validação de INPUT com função moeda.
       
      Tenho um input onde o usuário digita um valor qualquer, por exemplo: 1.234,56
      o problema é quando precisa atualizar o valor.
       
      Quando o usuário atualizar o input fica assim: 1.234,
       
      como faço para atualizar as casas decimais, conforme o valor for sendo alterado ?
       
      o input está assim:
       
      <div class="col-md-2"> <label for="">Valor Unitário</label> <input type="text" class="form-control" id="estoqprod" name="estoqprod" style="font-size:15px; font-weight:bold; width:100%; text-align:center;" placeholder="0,00" OnKeyUp="calcProd();" onkeypress="return(FormataMoeda(this,'.',',',event))" > </div>  
      a função para formatar o input para moeda está assim:
      obs.: a Função CalcProd está executando corretamente
      function calcProd(){ //Obter valor digitado do produto var estoq_prod = document.getElementById("estoqprod").value; //Remover ponto e trocar a virgula por ponto while (estoq_prod.indexOf(".") >= 0) { estoq_prod = estoq_prod.replace(".", ""); } estoq_prod = estoq_prod.replace(",","."); //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Calcula o Valor do Desconto if (prod_qtde > 0 && estoq_prod > 0) { calc_total_produto = parseFloat(prod_qtde) - parseFloat(estoq_prod); var numero = calc_total_produto.toFixed(2).split('.'); //Calculo para não deixar GRAVAR valores negativos if (calc_total_produto < 0 ) { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.') * -1; document.getElementById("qtdeTotal").value = numero.join(','); } else { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("qtdeTotal").value = numero.join(','); } } else { if (estoq_prod > 0) { document.getElementById("qtdeTotal").value = document.getElementById("estoqprod").value; } else { document.getElementById("qtdeTotal").value = "0,00"; } } } /*---Função para Formatar Campo para Moeda [R$]---*/ function FormataMoeda(objTextBox, SeparadorMilesimo, SeparadorDecimal, e){ var sep = 0; var key = ''; var i = j = 0; var len = len2 = 0; var strCheck = '0123456789'; var aux = aux2 = ''; var whichCode = (window.Event) ? e.which : e.keyCode; if (whichCode == 13) return true; key = String.fromCharCode(whichCode); // Valor para o código da Chave if (strCheck.indexOf(key) == -1) return false; // Chave inválida len = objTextBox.value.length; for(i = 0; i < len; i++) if ((objTextBox.value.charAt(i) != '0') && (objTextBox.value.charAt(i) != SeparadorDecimal)) break; aux = ''; for(; i < len; i++) if (strCheck.indexOf(objTextBox.value.charAt(i))!=-1) aux += objTextBox.value.charAt(i); aux += key; len = aux.length; if (len == 0) objTextBox.value = ''; if (len == 1) objTextBox.value = '0'+ SeparadorDecimal + '0' + aux; if (len == 2) objTextBox.value = '0'+ SeparadorDecimal + aux; if (len > 2) { aux2 = ''; for (j = 0, i = len - 3; i >= 0; i--) { if (j == 3) { aux2 += SeparadorMilesimo; j = 0; } aux2 += aux.charAt(i); j++; } objTextBox.value = ''; len2 = aux2.length; for (i = len2 - 1; i >= 0; i--) objTextBox.value += aux2.charAt(i); objTextBox.value += SeparadorDecimal + aux.substr(len - 2, len); } return false; }  
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.