Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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,

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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,

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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;
?>

Compartilhar este post


Link para o post
Compartilhar em outros 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]

Compartilhar este post


Link para o post
Compartilhar em outros 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!

Compartilhar este post


Link para o post
Compartilhar em outros 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!

Compartilhar este post


Link para o post
Compartilhar em outros 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:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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