PHP editar menu - mudar ordem,...

eRKULIX

Suspenso
Bom dia!

Estou a tentar fazer a edição de um menu apartir de um área de background, gostaria que pudesse fazer as seguintes opções: mudar a ordem dos items e colocar ou não determinado link visível.

Penso que para fazer isto a melhor opção seria criar algo que mudasse o id de determinado item de mudo a que este mudasse a sua posição. Para o outro ponto talvez queria um campo de visibilidade em que 1 o menu estaria visível e 0 o menu não seria visível, depois ao chamar os campos filtrava-se os resultados somente aparecendo os campos com 1.

Há formas mais simples/melhores de fazer isto?

No segundo ponto não me parece que tenha problemas para o realizar, mas em relação a como mudar a id do item ai estou um pouco perdido, como poderei fazer isso, alguma sugestão?


Obrigado!
 
Bem vou tentar então explicar-me melhor (de facto o primeiro texto está bastante confuso e mal escrito, é das horas).


Exemplo de um menu: Home, About, Contact

Um menu que se encontra num base de dados,

algo assim:

ID NAME LINK VISIBLE
1 Home home.php 1
2 About about.php 1
3 Contact contact.php 1



Gostaria de ter um área de edição em que pudesse fazer duas coisas:

- um das quais mudar a ordem do menu para por exemplo: Home, Contact, About

- outra ter a hipótese de colocar determinado item invisível, ficando assim: Home, Contact


Para a primeira questão pensei em puder mudar a id dos itens.

Para a segunda pensei em colocar um campo que seria a visibilidade onde 1 seria visível e 0 não. Assim ao chamar os resultados chamava apenas os iguais a 1.
 
Última edição:
Bem vou tentar então explicar-me melhor (de facto o primeiro texto está bastante confuso e mal escrito, é das horas).


Exemplo de um menu: Home, About, Contact

Um menu que se encontra num base de dados,

algo assim:

ID NAME LINK VISIBLE
1 Home home.php 1
2 About about.php 1
3 Contact contact.php 1



Gostaria de ter um área de edição em que pudesse fazer duas coisas:

- um das quais mudar a ordem do menu para por exemplo: Home, Contact, About

- outra ter a hipótese de colocar determinado item invisível, ficando assim: Home, Contact


Para a primeira questão pensei em puder mudar a id dos itens.

Para a segunda pensei em colocar um campo que seria a visibilidade onde 1 seria visível e 0 não. Assim ao chamar os resultados chamava apenas os iguais a 1.


$query_menu = "SELECT * FROM menu WHERE visible = 1";
$result_menu = mysql_query($query_menu) or die('Erro na query: ' . mysql_error());
$row_menu = mysql_fetch_assoc($result_menu);
$totalRows = mysql_num_rows($result_menu);

echo "<table>";
echo "<tr>";

while ($row_menu = mysql_fetch_assoc($result_menu)){
echo "<td>";
echo "<a href='".$_SERVER['PHP_SELF']."/".$row_menu['LINK']."'>".$row_menu['NAME']."</a>";
echo "</td>";
}

echo "</tr>";
echo "</table>";

Não testei o código, mas vê se é isto de que estás a precisar.
 
Obrigado, mas onde estou com problemas (isto é não sei como fazer) é na parte de mudar a ordem dos ID na base de dados.
 
Fazes um count á quantos links tens na base de dados, e com esse count crias dentro de uma form selects.

algo do do estilo:

<select name="ordem_1">
<select name="ordem_2">
<select name="ordem_3">

e dentro de cada, corres o while dos links, e metes o ($i do loop) que está no ordem_$i, selected.
e ao fazer update, actualizas os campos todos, espero que me tenha feito entender.
 
O mais simples é criares um campo "ordem" ou "peso" e atribuis um número de 1 a 100, os números maiores ficam no fundo do menu, os menores mais em cima. Podes fazer com uma simples caixa de texto. Não tem nada a ver com o ID.

SELECT * FROM menu ORDER BY peso;
 
Era o que eu estava a dizer, com um campo ordem, mas de forma a ele ter as selects que ele queria.

Ex:
PHP:
$numero_links = MYSQL_QUERY("SELECT * FROM links");
$numero_links = mysql_num_rows($numero_links);

//Criar selects da form
for ($i = 1; $i <= $numero_links; $i++) {
echo "<select name='ordem_".$i."'>";

//Listar os links
while ($nlink = mysql_fetch_assoc($numero_links)) {
   if ($nlink['ordem'] == $i)
      echo "<option value='".$nlink['id']."' SELECTED>".$nlink['nome']."</option>";
   else
      echo "<option value='".$nlink['id']."'>".$nlink['nome']."</option>";
}

</select>
}
 
O mais simples é criares um campo "ordem" ou "peso" e atribuis um número de 1 a 100, os números maiores ficam no fundo do menu, os menores mais em cima. Podes fazer com uma simples caixa de texto. Não tem nada a ver com o ID.

SELECT * FROM menu ORDER BY peso;


Acho que depende da utilização que ele dá ao ID do registo.
Se lá na estiver tabela só para ordenar os registos podem bem definir o campo ID como inteiro sem autoincrement e editar á mão os IDs.
Depois pode usar á vontade o ORDER by ID sem ocupar espaço desnecessário com um novo campo "peso".

Era o que eu estava a dizer, com um campo ordem, mas de forma a ele ter as selects que ele queria.

Ex:
PHP:
$numero_links = MYSQL_QUERY("SELECT * FROM links");
$numero_links = mysql_num_rows($numero_links);

//Criar selects da form
for ($i = 1; $i <= $numero_links; $i++) {
echo "<select name='ordem_".$i."'>";

//Listar os links
while ($nlink = mysql_fetch_assoc($numero_links)) {
   if ($nlink['ordem'] == $i)
      echo "<option value='".$nlink['id']."' SELECTED>".$nlink['nome']."</option>";
   else
      echo "<option value='".$nlink['id']."'>".$nlink['nome']."</option>";
}

</select>
}

Quanto a mim isso não faz o minimo de sentido.
Porque motivo fazes dois loops ???
Se o objectivo dele é sacar os registos da tabela e mostra-los por uma ordem.
1 WHILE chega e sobra.

Estás a complicar sem necessidade.
 
Última edição pelo moderador:
Acho que depende da utilização que ele dá ao ID do registo.
Se lá na estiver tabela só para ordenar os registos podem bem definir o campo ID como inteiro sem autoincrement e editar á mão os IDs.
Depois pode usar á vontade o ORDER by ID sem ocupar espaço desnecessário com um novo campo "peso".

Porque ter ou não ter um campo "peso" a mais é irrelevante em termos de espaço para algo tão pequeno quanto uma tabela de menus.

Depois o id é chave do registo e não deve ser mudada de qualquer maneira e muito menos por uma razão como esta. Pela tua lógica o que não faz falta na tabela é mesmo o campo ID. Mas pronto há muitas maneiras de alcançar o mesmo objectivo.
 
Porque ter ou não ter um campo "peso" a mais é irrelevante em termos de espaço para algo tão pequeno quanto uma tabela de menus.

Depois o id é chave do registo e não deve ser mudada de qualquer maneira e muito menos por uma razão como esta. Pela tua lógica o que não faz falta na tabela é mesmo o campo ID. Mas pronto há muitas maneiras de alcançar o mesmo objectivo.

Pela "minha lógica" o campo ID pode servir tanto de "peso" como continuar a servir de chave.
Pois caso ele vá criar backoffice para introduzir os links na tabela, pode muito bem fazer um ID=max(ID)+1 antes de inserir um link novo e ter o ID como "peso" e chave ao mesmo tempo, além de ainda poder utilizar o ID futuramente como numero de referência para referênciar áreas para o site de acordo com aquela tabela sem ter que a vir a alterar.

A "minha lógica" é simples e directa, ou seja maximizar a eficacia dos campos que estão na tabela, e por esse mesmo motivo não vejo a tua lógica de dizeres que pela minha o ID nem faz falta.

Mas concordo contigo "há muitas maneiras de alcançar o mesmo objectivo".
 
Okay, fiz o menu ordenado por um campo que criei para esse fim (denominado order), também já coloquei a função de ser possível escolher se um item está ou não visível (através do campo visible).
No entanto estou com um problema na alteração do menu, no que respeita à ordem do mesmo.
Isto porque que se por exemplo tenho o menu: 1, 2, 3, 4, 5 e quero mudar o 5 para 2 mudo o valor do campo order, mas o antigo 2 continua a ser 2 ficando assim com dois items com esse valor.
 
Okay, fiz o menu ordenado por um campo que criei para esse fim (denominado order), também já coloquei a função de ser possível escolher se um item está ou não visível (através do campo visible).
No entanto estou com um problema na alteração do menu, no que respeita à ordem do mesmo.
Isto porque que se por exemplo tenho o menu: 1, 2, 3, 4, 5 e quero mudar o 5 para 2 mudo o valor do campo order, mas o antigo 2 continua a ser 2 ficando assim com dois items com esse valor.

Então tens de mudar o valor do antigo. Uma forma mais simples de não teres de trocar todos é, em vez de 1,2,3,4,5 usares, 10,20,30,40,50. Se queres mudar o 50 para antes do 20 podes usar 11 (exemplo) e tens o caso arrumado.

Se quiseres fazer as coisas de outra forma, podes usar um sistema de setas pra cima e setas pra baixo e ordenas os campos assim, mas aí vais ter de puxar um bocadinho pela cabeça.
 
Isso é "batota", não sou nada apologista desses "truques" :P

É óbvio que se ele quer alterar um campo, o outro valor também tem que ser alterado, isto é tao simples com JavaScript, e depois se quiseres por AJAX então fica um mimo, ao mudares um, fazes com que mude os outros campos sozinho, fazes um POST geral, e um foreach.
 
Back
Topo