Jump to content
rafascarvalho

[Resolvido] Alterar a ordem exibição

Recommended Posts

Boa tarde pessoal,

 

Sou iniciante, porém com muito esforço fiz um sistema para meu cliente ADM o conteudo do site, está tudo redondo, porém ele pediu que pudesse alterar a ordem dos itens de uma página.

 

Exemplo: na página "parceiros", há o cadastro de áarios itens, porém em determinado momento ele pode querer dar maior ênfase em um determinado parceiro, por isso ele deve aparecer um primeiro, e outro deve aparecer em 5º, assim por diante.

 

Criei, e na tabela uma coluna chamada "ordem" na qual enumerei as linhas conforme ele pediu e dei um ORDER BY nela, porém quando for editar este campo preciso que ao alterar o valor dessa coluna de 4 para 1, automaticamente o campo que antes era 1, vire 2, o 2 vire 3, assim por diante.

 

Porém não consegui ter uma ideia de como montar isso. Pensei em fazer uns botões como "subir" e "descer" para cada linha (isso na página de administração de conteúdo que já tem) porém qual ação que posso colocar no botão para fazer isso.

 

O banco de dados esta em MySQL e tenho usado o PHP para montar toda a página.

 

Obrigado pela ajuda,

Share this post


Link to post
Share on other sites

Amigo fiz um exemplo com um array fictício somente para você ver como funciona.

 

Crie um arquivo chamado teste.php e cole o seguinte código dentro dele.

 

<?php echo '<pre>';
      $arr = array(0=>'teste',1=>'teste2',2=>'teste3',3=>'teste4',4=>'teste5'); //array com valores padrão
      print_r($arr);
      $key = array_search($_GET['val'], $arr); //pega a chave do array que será o primeiro da lista
      $arr2 = array();
      $arr2[0] = $arr[$key]; //seta na primeira posição do novo array o item selecionado
      unset($arr[$key]); //remove do antigo array a posição selecionada
      print_r($arr);
      foreach ($arr AS $values) {
          $arr2[] = $values; // atribui os valores restantes nas demais posições do novo array
      }
      print_r($arr2);
?>
Depois acesse a pagina da seguinte forma:

 

http://seusite/teste.php?val=teste2

http://seusite/teste.php?val=teste3

http://seusite/teste.php?val=teste5

 

Observe que o resultado mostra:

 

Primeiro o array completo

Segundo o array sem o elemento que deseja que fique em primeiro lugar

Terceiro o array final com a ordem desejada.

 

Acredito que seja mais ou menos isso que você deseja.

 

A lógica ta simples.

 

Claro que isso é só um exemplo para você ver como funciona.

O echo <pre> e os print_r() são apenas para você poder visualizar

um debug do código e ver como o mesmo funciona.

Você terá que adaptar para funcionar no seu código conforme sua necessidade.

 

Qualquer duvida poste ae.

 

Abraços.

Share this post


Link to post
Share on other sites

Caramba, bem que eu queria te ajudar.

 

Eu fiz isso há muito tempo atrás (muito mesmo), algo que listava os registros e ordenava e, em cima dessa ordenação, alguns registros "especiais" eram movidos para o topo, empurrando os de lá mais para baixo.

 

Mas infelizmente apaguei os arquivos. :(

 

Mas, eu me lembro bem de que usei FIND_IN_SET do MySQL para isso. Talvez você consiga reproduzir.

Share this post


Link to post
Share on other sites

Por que não faz um sistema de prioridades comum?

Quanto maior o valor recebido, mais no topo aparece o item. Ainda podes implementar um script jQuery no painel de administração para subir/descer itens on-the-fly.

 

Até mais.

Share this post


Link to post
Share on other sites

Com o exemplo que postei, se você fizer um update na base de dados via PHP mesmo acredito que já resolva.

 

Só não sei se é a solução que procura.

 

Abraços.

Share this post


Link to post
Share on other sites

Olá pessoal,

 

Desculpe, mas ainda não consegui fazer.

 

O cliente tinha um site antigo em ASP, e esta função funcionava assim:

 

<%
Dim strMensagem

strMensagem = Request.QueryString("strMensagem")
strOrdem = Request.QueryString("ordem")

	if Request.QueryString("acao") = "S" then
	
				menorOrdem = ""
	
				Set rs = Server.CreateObject("ADODB.RecordSet")
				
				strSQL = "Select min(ordem) as menorOrdem from tb_Clientes where ativo = -1 and tipoCliente='" & strTipoCliente & "'" 
				
				rs.Open strSQL,Conexao,3,3
	
				if not rs.eof then
					menorOrdem = rs("menorOrdem")
				End if
	
				if cInt(menorOrdem) < cInt(strOrdem) then
				
					campo1 = strOrdem
					campo2 = strOrdem - 1
	
					strSQL = "Update tb_Clientes Set Ordem = " & campo1 &  " where Ordem = " & campo2 & " and tipoCliente = '" & strTipoCliente & "'"

					Conexao.Execute strSQL
	
					campo1 = strOrdem - 1
					campo2 = Request.QueryString("IdCliente")
	
					strSQL = "Update tb_Clientes Set Ordem = " & campo1 &  " where IdCliente = " & campo2  & " and tipoCliente = '" & strTipoCliente & "'"
	
					Conexao.Execute strSQL
				
				End if
		
	ElseIf Request.QueryString("acao") = "D" then
	
				maiorOrdem = ""
	
				Set rs = Server.CreateObject("ADODB.RecordSet")
	
				strSQL = "Select max(ordem) as maiorOrdem from tb_Clientes where ativo = -1 and tipoCliente = '" & strTipoCliente & "'"
	
				rs.Open strSQL,Conexao,3,3
	
				if not rs.eof then
					maiorOrdem = rs("maiorOrdem")
				End if
	
				if cInt(maiorOrdem) > cInt(strOrdem) then
				
						campo1 = strOrdem
						campo2 = strOrdem + 1
	
						strSQL = "Update tb_Clientes Set Ordem = " & campo1 &  " where Ordem = " & campo2 & " and tipoCliente = '" & strTipoCliente & "'"

						Conexao.Execute strSQL
	
						campo1 = strOrdem + 1
						campo2 = Request.QueryString("IdCliente")
	
						strSQL = "Update tb_Clientes Set Ordem = " & campo1 &  " where IdCliente = " & campo2 & " and tipoCliente = '" & strTipoCliente & "'" 
	
						Conexao.Execute strSQL
						
				End if		
	
	ElseIf Request.QueryString("acao") = "E" then
		
				strSQL = "Update tb_Clientes Set Ordem = Ordem - 1 where Ordem > " & Request.QueryString("ordem") & " and tipoCliente = '" & strTipoCliente & "'" 
	
				Conexao.Execute strSQL
				
				strSQL = "Delete from tb_Clientes where idCliente = " & Request.QueryString("IdCliente")
	
				Conexao.Execute strSQL
	
				strMensagem = "Portfólio excluído com sucesso!"
				
	End If	
%>

Porém não consegui transportar isso para PHP, alguém me ajuda.

 

O que eu gostaria de fazer é exatamento isso: http://docs.metamorfosedigital.com.br/index.php?title=Alterar_ordem_de_exibi%C3%A7%C3%A3o

 

Obrigado,

Share this post


Link to post
Share on other sites

Pessoal,

 

Ainda estou quebrando a cabeça.

 

Por enquanto cheguei nesse resultado:

if(!empty($_GET['ChangeOrder'])){
	$query = mysql_query("SELECT * FROM bar_restaurante WHERE id = '".$_GET['ChangeOrder']."' ORDER BY ordem ASC LIMIT 1") or die(mysql_error());
		if(mysql_num_rows($query) > 0){
			while($assoc = mysql_fetch_assoc($query)){
				$id = $_GET['ChangeOrder'];
				$ordem = $assoc['ordem'];
				if($operacao == "subir"){
					$numero = -1;
						if($ordem > 1){
							$novaordem = $ordem + $numero;} else {
							$novaordem = $ordem; }
					} else {
					$numero = 1;
						if($ordem == 1){
							$novaordem = $ordem + $numero;} else {
							$novaordem = $ordem; }
					}
				
	$msg = "<p align=\"center\">A ordem de ".$assoc['titulo']." foi definida como ".$novaordem."</p>";
}}
 } else { 
 	$msg = "Erro ao alterar a ordem<br><br>";
 }

echo $msg;
?>

Por enquanto esta dando certo.

 

Eu fazendo o seguinte, passo a passo...rs..

 

Consegui mudar o item, porém não faço ideia de como alterar todos os itens.

Share this post


Link to post
Share on other sites

mysql_query('UPDATE `tabela` SET `prioridade` = (`prioridade`)+1 WHERE `prioridade` >= '.$prioridade); //edita todos, somando 1 ao seu valor, QUE POSSUEM PRIORIDADE MAIOR OU IGUAL À QUE você QUER
mysql_query('UPDATE `tabela` SET `prioridade` ='.$prioridade.' WHERE `id`='.$id); //edita o id especifico, colocando a prioridade desejada

Postei isso num tópico antigo, que serve perfeitamente para o seu caso. Basicamente você previamente escolhe uma prioridade, e o primeiro update faz o trabalho sujo. O segundo apenas coloca a prioridade certa no id certo.

Sacou? É um sistema de prioridades.

 

[]'s

Share this post


Link to post
Share on other sites

Hum.. entendi..

 

Então seguindo a lógico do código que postei, ficaria assim:

 

if(!empty($_GET['ChangeOrder'])){
        $query = mysql_query("SELECT * FROM bar_restaurante WHERE id = '".$_GET['ChangeOrder']."' ORDER BY ordem ASC LIMIT 1") or die(mysql_error());
                if(mysql_num_rows($query) > 0){
                        while($assoc = mysql_fetch_assoc($query)){
                                $id = $_GET['ChangeOrder'];
                                $ordem = $assoc['ordem'];
                                if($operacao == "subir"){
                                        $numero = -1;
                                                if($ordem > 1){
                                                        $novaordem = $ordem + $numero;} else {
                                                        $novaordem = $ordem; }
                                        } else {
                                        $numero = 1;
                                                if($ordem == 1){
                                                        $novaordem = $ordem + $numero;} else {
                                                        $novaordem = $ordem; }
                                        }
        mysql_query('UPDATE `bar_restaurantes` SET `ordem` = (`novaordem`)+1 WHERE `ordem` >= '.$novaordem); //edita todos, somando 1 ao seu valor, QUE POSSUEM PRIORIDADE MAIOR OU IGUAL À QUE você QUER
mysql_query('UPDATE `bar_restaurantes` SET `ordem` ='.$novaordem.' WHERE `id`='.$id); //edita o id especifico, colocando a prioridade desejada                        
        $msg = "<p align=\"center\">A ordem de ".$assoc['titulo']." foi definida como ".$novaordem."</p>";
}}
 } else { 
        $msg = "Erro ao alterar a ordem<br><br>";
 }

echo $msg;
?>

Share this post


Link to post
Share on other sites

mysql_query('UPDATE `tabela` SET `prioridade` = (`prioridade`)+1 WHERE `prioridade` >= '.$prioridade);

hehehehe, isso é problemático Matheus:

 

1. Tenho os seguintes dados:

 

[table=Parceiros][tr][th=50%]Nome[/th][th=50%]Prioridade[/th][/tr][tr][td]Fulano[/td][td]4[/td][/tr][tr][td]Beltrano[/td][td]3[/td][/tr][tr][td]Ciclano[/td][td]2[/td][/tr][tr][td]Neto[/td][td]1[/td][/tr][/table]

 

Se eu mudar a prioridade do registro Neto, de 1 para 2, seu UPDATE fará o seguinte:

 

[table=Parceiros][tr][th=50%]Nome[/th][th=50%]Prioridade[/th][/tr][tr][td]Fulano[/td][td]5[/td][/tr][tr][td]Beltrano[/td][td]4[/td][/tr][tr][td]Ciclano[/td][td]3[/td][/tr][tr][td]Neto[/td][td]2[/td][/tr][/table]

 

Se eu mudar novamente a prioridade do registro Neto, de 2 para 1:

 

[table=Parceiros][tr][th=50%]Nome[/th][th=50%]Prioridade[/th][/tr][tr][td]Fulano[/td][td]6[/td][/tr][tr][td]Beltrano[/td][td]5[/td][/tr][tr][td]Ciclano[/td][td]4[/td][/tr][tr][td]Neto[/td][td]1[/td][/tr][/table]

Share this post


Link to post
Share on other sites

O João tem razão.

 

Porém, usei a lógica do Matheus e montei isso:

 

} elseif(!empty($_GET['ChangeOrderUp'])){
	$query = mysql_query("SELECT * FROM bar_restaurante_teste WHERE id = '".$_GET['ChangeOrderUp']."'") or die(mysql_error());
	if(mysql_num_rows($query) > 0){
	while($assoc = mysql_fetch_assoc($query)){

	$id = $_GET['ChangeOrderUp'];
	$ordem = $assoc['ordem'];
	$novaordem = $ordem - 1;	
	
	mysql_query("UPDATE bar_restaurante_teste SET ordem = ordem+1 WHERE ordem = '".$novaordem."'");
	mysql_query("UPDATE bar_restaurante_teste SET ordem = '".$novaordem."' WHERE id = '".$id."'");
	                        
        $msg = "<p align=\"center\">A ordem de ".$assoc['titulo']." foi definida como ".$novaordem."</p>";
}
} else { 
        $msg = "Erro ao alterar a ordem<br><br>";
}        
} elseif(!empty($_GET['ChangeOrderDown'])){
	$query = mysql_query("SELECT * FROM bar_restaurante_teste WHERE id = '".$_GET['ChangeOrderDown']."'") or die(mysql_error());
	if(mysql_num_rows($query) > 0){
	while($assoc = mysql_fetch_assoc($query)){
	
	$id = $_GET['ChangeOrderDown'];
	$ordem = $assoc['ordem'];
	$novaordem = $ordem + 1;	
	
	mysql_query("UPDATE bar_restaurante_teste SET ordem = ordem-1 WHERE ordem = '".$novaordem."'");
	mysql_query("UPDATE bar_restaurante_teste SET ordem = '".$novaordem."' WHERE id = '".$id."'");
	                        
        $msg = "<p align=\"center\">A ordem de ".$assoc['titulo']." foi definida como ".$novaordem."</p>";
}
} else { 
        $msg = "Erro ao alterar a ordem<br><br>";
 }

Funcionou, a única coisa que tenho que ajustar é ele não fazer a alteração quando a posição for 1 (se eu subir ele vira 0) ou o último (criaria um buraco entre o último e o penúltimo)

 

Vou ajustar isso e já posto.

 

Agradeço a ajuda de todos! Descobri que no final é mais simples que eu imaginava!

Share this post


Link to post
Share on other sites

Pessoal,

 

Agora deu certo.

 

Para finalizar o tópico:

 

Código que executa a troca:

(...)
} elseif(!empty($_GET['ChangeOrderUp'])){
	$query = mysql_query("SELECT * FROM bar_restaurante_teste WHERE id = '".$_GET['ChangeOrderUp']."'") or die(mysql_error());
	if(mysql_num_rows($query) > 0){
	while($assoc = mysql_fetch_assoc($query)){

	$id = $_GET['ChangeOrderUp'];
	$ordem = $assoc['ordem'];
	$novaordem = $ordem - 1;	
	
	mysql_query("UPDATE bar_restaurante_teste SET ordem = ordem+1 WHERE ordem = '".$novaordem."'");
	mysql_query("UPDATE bar_restaurante_teste SET ordem = '".$novaordem."' WHERE id = '".$id."'");
	                        
        $msg = "<p align=\"center\">A ordem de ".$assoc['titulo']." foi definida como ".$novaordem."</p>";
}
} else { 
        $msg = "Erro ao alterar a ordem<br><br>";
}        
} elseif(!empty($_GET['ChangeOrderDown'])){
	$query = mysql_query("SELECT * FROM bar_restaurante_teste WHERE id = '".$_GET['ChangeOrderDown']."'") or die(mysql_error());
	if(mysql_num_rows($query) > 0){
	while($assoc = mysql_fetch_assoc($query)){
	
	$id = $_GET['ChangeOrderDown'];
	$ordem = $assoc['ordem'];
	$novaordem = $ordem + 1;	
	
	mysql_query("UPDATE bar_restaurante_teste SET ordem = ordem-1 WHERE ordem = '".$novaordem."'");
	mysql_query("UPDATE bar_restaurante_teste SET ordem = '".$novaordem."' WHERE id = '".$id."'");
	                        
        $msg = "<p align=\"center\">A ordem de ".$assoc['titulo']." foi definida como ".$novaordem."</p>";
}
} else { 
        $msg = "Erro ao alterar a ordem<br><br>";
 }

E o código que chamar a ação ficou assim:

 <td><center>
  	<?php
  		if($assoc['ordem']>1){
  		?>
  	<a href="?ChangeOrderUp=<?php echo $assoc['id'];?>"><img src="img/subir.gif" width="8" height="6" alt="Subir" /></a>
  	<?php } else { 
  		echo "<img src=\"../imagens/blank.gif\" width=\"8\" height=\"6\" />"; 
  		} 
  	?>
	<?php echo $assoc['ordem'];?> 
	<?php
		$sql0 = mysql_query("SELECT * FROM bar_restaurante_teste ORDER BY ordem DESC LIMIT 1");
		$result = mysql_fetch_assoc($sql0);
		$ultimo = $result['ordem'];
		
  		if($assoc['ordem']!=$ultimo){
  		?>
    <a href="?ChangeOrderDown=<?php echo $assoc['id'];?>"><img src="img/descer.gif" width="8" height="6" alt="Descer" /></a>
    <?php } else { 
  		echo "<img src=\"../imagens/blank.gif\" width=\"8\" height=\"6\" />"; 
  		} 
  	?>
  </center></td>

Caso alguém tenha algo para acrescentar (ou melhorar a lógica do código), peço que poste.

 

Caso contrário, pode colocar como resolvido.

 

Agradeço a ajuda de todos!

Share this post


Link to post
Share on other sites

Não querendo ser coveiro, mas já sendo....

 

Estava procurando na internet algo para me auxiliar nisso também!

 

Encontrei o post... funciona, mas precisava de algo dinâmico... rsrs ... usuários são exigentes né.

 

Encontrei este tutorial que resolve o problema de forma interessante

 

http://phppot.com/php/sorting-mysql-row-order-using-jquery/

 

Uma solução seria ao invés de deixar o botão de sorting habilitado direto é clicar nele para iniciar o reposicionamento e clicar novamente para finalizar.

 

Temos que pensar que nossos lindos usuários podem apagar registros, então temos que reposicionar tudo!!!

 

Espero ajudar futuros visitantes aqui do fórum.... Abraços!! :P :lol:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.